diff --git a/src/main.rs b/src/main.rs index afe2b04..87ab48f 100644 --- a/src/main.rs +++ b/src/main.rs @@ -28,7 +28,10 @@ fn main() { app.connect_activate(activate); let args: Vec = 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: >k::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 { - std::env::args() - .skip_while(|a| !a.starts_with(BIN_PATH_ARG)) +fn nvim_bin_path(args: I) -> Option + where I: Iterator +{ + 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 { + open_arg_impl(std::env::args()) +} + +fn open_arg_impl(args: I) -> Option + where I: Iterator +{ + 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()))); + } +} diff --git a/src/nvim.rs b/src/nvim.rs index 41fc28c..bb4e7b6 100644 --- a/src/nvim.rs +++ b/src/nvim.rs @@ -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(()) }