Fixes #1 Temproray fix that allows open single file

To make good fix wait for gtk-rs bindings udpate for optons/open support
inside GtkApplication
This commit is contained in:
daa84 2017-03-14 12:37:06 +03:00
parent b68d2470c3
commit fde94bd64a
2 changed files with 49 additions and 7 deletions

View File

@ -28,7 +28,10 @@ fn main() {
app.connect_activate(activate);
let args: Vec<String> = env::args().collect();
let argv: Vec<&str> = args.iter().filter(|a| !a.starts_with(BIN_PATH_ARG)).map(String::as_str).collect();
let mut argv: Vec<&str> = args.iter().filter(|a| !a.starts_with(BIN_PATH_ARG)).map(String::as_str).collect();
if open_arg().is_some() {
argv.pop();
}
app.run(argv.len() as i32, &argv);
}
@ -37,21 +40,39 @@ fn activate(app: &gtk::Application) {
let mut ui = ui_cell.borrow_mut();
ui.init(app);
let path = nvim_bin_path();
nvim::initialize(&mut *ui, path.as_ref()).expect("Can't start nvim instance");
let path = nvim_bin_path(std::env::args());
let open_arg = open_arg();
nvim::initialize(&mut *ui, path.as_ref(), open_arg.as_ref()).expect("Can't start nvim instance");
guard_dispatch_thread(&mut *ui);
});
}
fn nvim_bin_path() -> Option<String> {
std::env::args()
.skip_while(|a| !a.starts_with(BIN_PATH_ARG))
fn nvim_bin_path<I>(args: I) -> Option<String>
where I: Iterator<Item=String>
{
args.skip_while(|a| !a.starts_with(BIN_PATH_ARG))
.map(|p| p.split('=').nth(1).map(str::to_owned))
.nth(0)
.unwrap_or(None)
}
fn open_arg() -> Option<String> {
open_arg_impl(std::env::args())
}
fn open_arg_impl<I>(args: I) -> Option<String>
where I: Iterator<Item=String>
{
args.last().map(|a| {
if !a.starts_with("-") {
Some(a.to_owned())
} else {
None
}
}).unwrap_or(None)
}
fn guard_dispatch_thread(ui: &mut ui::Ui) {
let guard = ui.nvim().session.take_dispatch_guard();
thread::spawn(move || {
@ -64,3 +85,20 @@ fn guard_dispatch_thread(ui: &mut ui::Ui) {
});
});
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_bin_path_arg() {
assert_eq!(Some("/test_path".to_string()),
nvim_bin_path(vec!["neovim-gtk", "--nvim-bin-path=/test_path"].iter().map(|s| s.to_string())));
}
#[test]
fn test_open_arg() {
assert_eq!(Some("some_file.txt".to_string()),
open_arg_impl(vec!["neovim-gtk", "--nvim-bin-path=/test_path", "some_file.txt"].iter().map(|s| s.to_string())));
}
}

View File

@ -64,7 +64,7 @@ macro_rules! try_uint {
})
}
pub fn initialize(ui: &mut Ui, nvim_bin_path: Option<&String>) -> Result<()> {
pub fn initialize(ui: &mut Ui, nvim_bin_path: Option<&String>, open_arg: Option<&String>) -> Result<()> {
let session = if let Some(path) = nvim_bin_path {
Session::new_child_path(path)?
} else {
@ -81,6 +81,10 @@ pub fn initialize(ui: &mut Ui, nvim_bin_path: Option<&String>) -> Result<()> {
nvim.ui_attach(80, 24, UiAttachOptions::new()).map_err(|e| Error::new(ErrorKind::Other, e))?;
nvim.command("runtime! ginit.vim").map_err(|e| Error::new(ErrorKind::Other, e))?;
if let Some(ref file) = open_arg {
nvim.command(&format!("e {}", file)).report_err(nvim);
}
Ok(())
}