diff --git a/src/command/share.rs b/src/command/share.rs index 353ae37..e60c312 100644 --- a/src/command/share.rs +++ b/src/command/share.rs @@ -1,6 +1,5 @@ //! globally available tmux commands. use std::{ - env::var, ffi::OsString, process::exit }; @@ -12,7 +11,12 @@ use tmux_interface::{ commands }; -use crate::{ error, flag, util }; +use crate::{ + env::{ self, env_var }, + error, + flag, + util +}; pub fn attach(pargs: &mut Arguments) { // don't allow unflagged nests @@ -20,7 +24,7 @@ pub fn attach(pargs: &mut Arguments) { // consume optional flags let read_only = pargs.contains(flag::READ_ONLY); - let detach_other = pargs.contains(flag::DETACHED); + let detach_other = pargs.contains(flag::DETACH); let args = pargs.clone().finish(); let target: String; @@ -119,7 +123,7 @@ pub fn list() { } // get attached session symbol - let attach_symbol = var("REMUX_ATTACH_SYMBOL").unwrap_or("*".to_string()); + let attach_symbol = env_var(env::ATTACH_SYMBOL); // pretty print session list println!("sessions:"); @@ -145,9 +149,13 @@ pub fn new(pargs: &mut Arguments) { // don't allow unflagged nesting util::prevent_nest(); - // get optional flag + // get optional flags + let detached = pargs.contains(flag::DETACH); let target_dir: Result = pargs.value_from_str(flag::TARGET); + // get environment variables + let window_name = env_var(env::NEW_WINDOW_NAME); + // get target or fallback let args = pargs.clone().finish(); let title: String; @@ -164,10 +172,18 @@ pub fn new(pargs: &mut Arguments) { let mut new = commands::NewSession::new(); new = new.session_name(title); if let Some(command) = command { new.shell_command = Some(command.to_string_lossy()); } + if detached { new.detached = true; } if let Ok(target_dir) = target_dir { new = new.start_directory(target_dir); } - Tmux::new() - .add_command(new) - .output().ok(); + let mut tmux = Tmux::new().add_command(new); + + // rename window if var not empty + if !window_name.is_empty() { + let auto_name = commands::RenameWindow::new() + .new_name(window_name); + tmux = tmux.add_command(auto_name); + } + + tmux.output().ok(); } diff --git a/src/env.rs b/src/env.rs new file mode 100644 index 0000000..a5b4450 --- /dev/null +++ b/src/env.rs @@ -0,0 +1,13 @@ +use std::env::var; + +pub type EnvVar = (&'static str, &'static str); + +pub static ATTACH_SYMBOL: EnvVar = ("REMUX_ATTACH_SYMBOL", "*"); +pub static NEW_WINDOW_NAME: EnvVar = ("REMUX_NEW_WINDOW", ""); + +pub fn env_var(envvar: EnvVar) -> String { + var(envvar.0).unwrap_or(envvar.1.to_string()) +} + +pub fn tmux() -> bool { !var("TMUX").unwrap_or("".to_string()).is_empty() } + diff --git a/src/flag.rs b/src/flag.rs index 92056f3..4c7066d 100644 --- a/src/flag.rs +++ b/src/flag.rs @@ -1,7 +1,7 @@ type Flag = [&'static str;2]; -pub static DETACHED: Flag = ["-d", "--detached"]; +pub static DETACH: Flag = ["-d", "--detach"]; pub static HELP: Flag = ["-h", "--help"]; pub static NEST: Flag = ["-n", "--nest"]; pub static QUIET: Flag = ["-q", "--quiet"]; diff --git a/src/main.rs b/src/main.rs index 4276941..3ede333 100644 --- a/src/main.rs +++ b/src/main.rs @@ -6,6 +6,7 @@ use std::{ use pico_args::Arguments; mod command; +mod env; mod error; mod flag; mod help; diff --git a/src/util.rs b/src/util.rs index c99302b..4364c5b 100644 --- a/src/util.rs +++ b/src/util.rs @@ -1,5 +1,5 @@ use std::{ - env::{ current_dir, var }, + env::current_dir, path::PathBuf, process::exit }; @@ -11,7 +11,10 @@ use tmux_interface::{ variables::session::SessionsCtl }; -use crate::error; +use crate::{ + env, + error +}; /// return a Vec of all sessions or None pub fn get_sessions() -> Option> { @@ -23,10 +26,9 @@ pub fn get_sessions() -> Option> { /// show the tmux nest text if env var is not unset pub fn prevent_nest() { - let tmux = var("TMUX").ok(); - if tmux.is_some() && tmux.unwrap() != "" { + if env::tmux() { println!("Sessions should be nested with care; unset TMUX or use the '-n' flag to allow."); - exit(1); + exit(6); } }