diff --git a/Cargo.lock b/Cargo.lock index 5cefe3b..e2b71bc 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -22,6 +22,7 @@ dependencies = [ "phf_codegen 0.7.21 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.11 (registry+https://github.com/rust-lang/crates.io-index)", "serde_derive 1.0.11 (registry+https://github.com/rust-lang/crates.io-index)", + "tempfile 2.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "toml 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -277,6 +278,15 @@ name = "htmlescape" version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "kernel32-sys" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "lazy_static" version = "0.2.8" @@ -437,6 +447,11 @@ dependencies = [ "magenta 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "redox_syscall" +version = "0.1.31" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "regex" version = "0.2.2" @@ -519,6 +534,18 @@ dependencies = [ "unicode-xid 0.0.4 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "tempfile" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.29 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.3.16 (registry+https://github.com/rust-lang/crates.io-index)", + "redox_syscall 0.1.31 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "thread_local" version = "0.3.4" @@ -573,6 +600,11 @@ name = "winapi" version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "winapi-build" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" + [metadata] "checksum aho-corasick 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)" = "500909c4f87a9e52355b26626d890833e9e1d53ac566db76c36faa984b889699" "checksum atk-sys 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c69658a4e18d5c9575f716e24559645d08a4044d6946c30c2e0025952c84d842" @@ -598,6 +630,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum gtk 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ce17f98e7dcdc9d06b3a5f7621d796a24937c04953481205b1be267c5a02697a" "checksum gtk-sys 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "854b56ce6d6b05945f7735651482835c5ac1f8582142ce67306726259a3dafb0" "checksum htmlescape 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "e9025058dae765dee5070ec375f591e2ba14638c63feff74f13805a72e523163" +"checksum kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d" "checksum lazy_static 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "3b37545ab726dd833ec6420aaba8231c5b320814b9029ad585555d2a03e94fbf" "checksum libc 0.2.29 (registry+https://github.com/rust-lang/crates.io-index)" = "8a014d9226c2cc402676fbe9ea2e15dd5222cd1dd57f576b5b283178c944a264" "checksum log 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)" = "880f77541efa6e5cc74e76910c9884d9859683118839d6a1dc3b11e63512565b" @@ -617,6 +650,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum pkg-config 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)" = "3a8b4c6b8165cd1a1cd4b9b120978131389f64bdaf456435caa41e630edba903" "checksum quote 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)" = "7a6e920b65c65f10b2ae65c831a81a073a89edd28c7cce89475bff467ab4167a" "checksum rand 0.3.16 (registry+https://github.com/rust-lang/crates.io-index)" = "eb250fd207a4729c976794d03db689c9be1d634ab5a1c9da9492a13d8fecbcdf" +"checksum redox_syscall 0.1.31 (registry+https://github.com/rust-lang/crates.io-index)" = "8dde11f18c108289bef24469638a04dce49da56084f2d50618b226e47eb04509" "checksum regex 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "1731164734096285ec2a5ec7fea5248ae2f5485b3feeb0115af4fda2183b2d1b" "checksum regex-syntax 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "ad890a5eef7953f55427c50575c680c42841653abd2b028b68cd223d157f62db" "checksum rmp 0.8.6 (registry+https://github.com/rust-lang/crates.io-index)" = "7ce560a5728f4eec697f07f8d7fa20608893d44b4f5b8f9f5f51a2987f3cffe2" @@ -627,6 +661,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum siphasher 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "0df90a788073e8d0235a67e50441d47db7c8ad9debd91cbf43736a2a92d36537" "checksum syn 0.11.11 (registry+https://github.com/rust-lang/crates.io-index)" = "d3b891b9015c88c576343b9b3e41c2c11a51c219ef067b264bd9c8aa9b441dad" "checksum synom 0.11.3 (registry+https://github.com/rust-lang/crates.io-index)" = "a393066ed9010ebaed60b9eafa373d4b1baac186dd7e008555b0f702b51945b6" +"checksum tempfile 2.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "11ce2fe9db64b842314052e2421ac61a73ce41b898dc8e3750398b219c5fc1e0" "checksum thread_local 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "1697c4b57aeeb7a536b647165a2825faddffb1d3bad386d507709bd51a90bb14" "checksum toml 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)" = "a7540f4ffc193e0d3c94121edb19b055670d369f77d5804db11ae053a45b6e7e" "checksum unicode-xid 0.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "8c1f860d7d29cf02cb2f3f359fd35991af3d30bac52c57d265a3c461074cb4dc" @@ -635,3 +670,4 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum utf8-ranges 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "662fab6525a98beff2921d7f61a39e7d59e0b425ebc7d0d9e66d316e55124122" "checksum void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d" "checksum winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a" +"checksum winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2d315eee3b34aca4797b2da6b13ed88266e6d612562a0c46390af8299fc699bc" diff --git a/Cargo.toml b/Cargo.toml index bef06e6..1a49913 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -35,6 +35,8 @@ serde = "1.0" serde_derive = "1.0" toml = "0.4" +tempfile = "2.2.0" + #[dependencies.neovim-lib] #git = "https://github.com/daa84/neovim-lib" diff --git a/src/dirs.rs b/src/dirs.rs index dceccc2..3380a65 100644 --- a/src/dirs.rs +++ b/src/dirs.rs @@ -30,3 +30,4 @@ fn get_xdg_config_dir() -> Result { home_dir.push(".config"); Ok(home_dir) } + diff --git a/src/main.rs b/src/main.rs index c48713e..f0bd6f1 100644 --- a/src/main.rs +++ b/src/main.rs @@ -23,8 +23,11 @@ extern crate serde; extern crate serde_derive; extern crate toml; +extern crate tempfile; + mod sys; +mod nvim_config; mod dirs; mod color; mod value; diff --git a/src/nvim.rs b/src/nvim.rs index 4290f69..ba33392 100644 --- a/src/nvim.rs +++ b/src/nvim.rs @@ -13,6 +13,7 @@ use ui::UiMutex; use ui_model::{ModelRect, ModelRectVec}; use shell; use glib; +use nvim_config::NvimConfig; use value::ValueMapExt; @@ -227,6 +228,7 @@ impl error::Error for NvimInitError { pub fn start( shell: Arc>, nvim_bin_path: Option<&String>, + nvim_config: NvimConfig, ) -> result::Result { let mut cmd = if let Some(path) = nvim_bin_path { Command::new(path) @@ -257,6 +259,12 @@ pub fn start( cmd.arg("--cmd").arg("let &rtp.=',runtime'"); } + if let Some(nvim_config) = nvim_config.generate_config() { + if let Some(path) = nvim_config.path().to_str() { + cmd.arg("--cmd").arg(format!("source '{}'", path)); + } + } + let session = Session::new_child_cmd(&mut cmd); let session = match session { diff --git a/src/nvim_config.rs b/src/nvim_config.rs new file mode 100644 index 0000000..4a0a579 --- /dev/null +++ b/src/nvim_config.rs @@ -0,0 +1,45 @@ +use std; +use std::fs::File; +use std::io::Write; + +use tempfile; +use plug_manager; + +#[derive(Clone)] +pub struct NvimConfig { + plug_config: Option, +} + +impl NvimConfig { + pub fn new(plug_config: Option) -> Self { + NvimConfig { plug_config } + } + + pub fn generate_config(&self) -> Option { + if self.plug_config.is_some() { + match self.write_file() { + Err(err) => { + error!("{}", err); + None + } + Ok(file) => Some(file), + } + } else { + None + } + } + + fn write_file(&self) -> std::io::Result { + let temp_file = tempfile::NamedTempFile::new()?; + { + let mut file: &File = &temp_file; + let content = &self.plug_config.as_ref().unwrap().source; + if !content.is_empty() { + file.write_all(content.as_bytes())?; + } + + file.sync_data()?; + } + Ok(temp_file) + } +} diff --git a/src/plug_manager/manager.rs b/src/plug_manager/manager.rs index dda4fc2..20b9346 100644 --- a/src/plug_manager/manager.rs +++ b/src/plug_manager/manager.rs @@ -3,6 +3,7 @@ use std::cell::RefCell; use super::vim_plug; use super::store::Store; + use nvim::NeovimClient; pub struct Manager { @@ -18,10 +19,12 @@ impl Manager { } } - pub fn generate_plug_config(&mut self) -> Option { + pub fn load_config(&mut self) -> Option { if Store::is_config_exists() { - self.plug_manage_state = PlugManageState::NvimGtk(Store::load()); - Some("TODO".to_owned()) + let store = Store::load(); + let config = PlugManagerConfigSource::new(&store); + self.plug_manage_state = PlugManageState::NvimGtk(store); + Some(config) } else { None } @@ -45,3 +48,23 @@ pub enum PlugManageState { Configuration(Store), Unknown, } + +#[derive(Clone)] +pub struct PlugManagerConfigSource { + pub source: String, +} + +impl PlugManagerConfigSource { + pub fn new(store: &Store) -> Self { + let mut builder = "call plug#begin()".to_owned(); + + for plug in store.get_plugs() { + builder += &format!("Plug '{}'", plug.get_plug_path()); + } + + builder += "call plug#end()"; + + PlugManagerConfigSource { source: builder } + } +} + diff --git a/src/plug_manager/mod.rs b/src/plug_manager/mod.rs index 647f6f4..7ed9f71 100644 --- a/src/plug_manager/mod.rs +++ b/src/plug_manager/mod.rs @@ -4,4 +4,4 @@ mod store; mod manager; pub use self::ui::Ui; -pub use self::manager::Manager; +pub use self::manager::{Manager, PlugManagerConfigSource}; diff --git a/src/plug_manager/store.rs b/src/plug_manager/store.rs index ab1705c..bc0accf 100644 --- a/src/plug_manager/store.rs +++ b/src/plug_manager/store.rs @@ -66,10 +66,43 @@ impl SettingsLoader for Settings { pub struct PlugInfo { pub name: String, pub url: String, + pub removed: bool, } impl PlugInfo { pub fn new(name: String, url: String) -> Self { - PlugInfo { name, url } + PlugInfo { + name, + url, + removed: false, + } + } + + pub fn get_plug_path(&self) -> String { + if self.url.contains("github.com") { + let mut path_comps: Vec<&str> = self.url + .trim_right_matches(".git") + .rsplit('/') + .take(2) + .collect(); + path_comps.reverse(); + path_comps.join("/") + } else { + self.url.clone() + } + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_get_plug_path() { + let plug = PlugInfo::new( + "rust.vim".to_owned(), + "https://git::@github.com/rust-lang/rust.vim.git".to_owned(), + ); + assert_eq!("rust-lang/rust.vim".to_owned(), plug.get_plug_path()); } } diff --git a/src/shell.rs b/src/shell.rs index 10facfb..70af8d1 100644 --- a/src/shell.rs +++ b/src/shell.rs @@ -22,6 +22,7 @@ use ui_model::{UiModel, Attrs, ModelRect}; use color::{ColorModel, Color, COLOR_BLACK, COLOR_WHITE, COLOR_RED}; use nvim; use nvim::{RedrawEvents, GuiApi, RepaintMode, ErrorReport, NeovimClient}; +use nvim_config::NvimConfig; use input; use input::keyval_to_input_string; use cursor::Cursor; @@ -77,13 +78,14 @@ pub struct State { resize_state: Rc>, options: ShellOptions, + nvim_config: NvimConfig, detach_cb: Option>>, nvim_started_cb: Option>>, } impl State { - pub fn new(settings: Rc>, options: ShellOptions) -> State { + pub fn new(settings: Rc>, options: ShellOptions, nvim_config: NvimConfig) -> State { let drawing_area = gtk::DrawingArea::new(); let popup_menu = RefCell::new(PopupMenu::new(&drawing_area)); let font_ctx = render::Context::new(FontDescription::from_string(DEFAULT_FONT_NAME)); @@ -111,6 +113,7 @@ impl State { resize_state: Rc::new(Cell::new(ResizeState::Wait)), options, + nvim_config, detach_cb: None, nvim_started_cb: None, @@ -390,9 +393,9 @@ pub struct Shell { } impl Shell { - pub fn new(settings: Rc>, options: ShellOptions) -> Shell { + pub fn new(settings: Rc>, options: ShellOptions, nvim_config: NvimConfig) -> Shell { let shell = Shell { - state: Arc::new(UiMutex::new(State::new(settings, options))), + state: Arc::new(UiMutex::new(State::new(settings, options, nvim_config))), ui_state: Rc::new(RefCell::new(UiState::new())), widget: gtk::Box::new(gtk::Orientation::Vertical, 0), @@ -765,11 +768,12 @@ fn show_nvim_init_error(err: &nvim::NvimInitError, state_arc: Arc fn init_nvim_async( state_arc: Arc>, options: ShellOptions, + nvim_config: NvimConfig, cols: usize, rows: usize, ) { // execute nvim - let mut nvim = match nvim::start(state_arc.clone(), options.nvim_bin_path.as_ref()) { + let mut nvim = match nvim::start(state_arc.clone(), options.nvim_bin_path.as_ref(), nvim_config) { Ok(nvim) => nvim, Err(err) => { show_nvim_start_error(&err, state_arc); @@ -864,7 +868,8 @@ fn init_nvim(state_ref: &Arc>) { let state_arc = state_ref.clone(); let options = state.options.clone(); - thread::spawn(move || init_nvim_async(state_arc, options, cols, rows)); + let nvim_config = state.nvim_config.clone(); + thread::spawn(move || init_nvim_async(state_arc, options, nvim_config, cols, rows)); } } diff --git a/src/ui.rs b/src/ui.rs index d2b8ae8..1f2ce02 100644 --- a/src/ui.rs +++ b/src/ui.rs @@ -10,6 +10,7 @@ use gtk::{ApplicationWindow, HeaderBar, ToolButton, Image, AboutDialog}; use gio::prelude::*; use gio::{Menu, MenuExt, MenuItem, MenuItemExt, SimpleAction}; +use nvim_config::NvimConfig; use settings::Settings; use shell::{Shell, ShellOptions}; use shell_dlg; @@ -52,13 +53,17 @@ impl Components { impl Ui { pub fn new(options: ShellOptions) -> Ui { + let mut plug_manager = plug_manager::Manager::new(); + let plug_config = plug_manager.load_config(); + + let nvim_config = NvimConfig::new(plug_config); + let plug_manager = Arc::new(UiMutex::new(plug_manager)); let comps = Arc::new(UiMutex::new(Components::new())); let settings = Rc::new(RefCell::new(Settings::new())); - let shell = Rc::new(RefCell::new(Shell::new(settings.clone(), options))); + let shell = Rc::new(RefCell::new(Shell::new(settings.clone(), options, nvim_config))); settings.borrow_mut().set_shell(Rc::downgrade(&shell)); let projects = Projects::new(&comps.borrow().open_btn, shell.clone()); - let plug_manager = Arc::new(UiMutex::new(plug_manager::Manager::new())); Ui { initialized: false,