diff --git a/src/main.rs b/src/main.rs index 6203f0f1..94a6eb4b 100644 --- a/src/main.rs +++ b/src/main.rs @@ -46,13 +46,22 @@ fn main() { direction, line_number, floating, + cwd, })) = opts.command { + let mut file = file; + let cwd = cwd.or_else(|| std::env::current_dir().ok()); + if file.is_relative() { + if let Some(cwd) = cwd.as_ref() { + file = cwd.join(file); + } + } let command_cli_action = CliAction::Edit { file, direction, line_number, floating, + cwd, }; commands::send_action_to_session(command_cli_action, opts.session); std::process::exit(0); diff --git a/zellij-server/src/unit/screen_tests.rs b/zellij-server/src/unit/screen_tests.rs index f55b0a1c..f0c625dc 100644 --- a/zellij-server/src/unit/screen_tests.rs +++ b/zellij-server/src/unit/screen_tests.rs @@ -1943,6 +1943,7 @@ pub fn send_cli_edit_action_with_default_parameters() { direction: None, line_number: None, floating: false, + cwd: None, }; send_cli_action_to_server( &session_metadata, @@ -1980,6 +1981,7 @@ pub fn send_cli_edit_action_with_line_number() { direction: None, line_number: Some(100), floating: false, + cwd: None, }; send_cli_action_to_server( &session_metadata, @@ -2017,6 +2019,7 @@ pub fn send_cli_edit_action_with_split_direction() { direction: Some(Direction::Down), line_number: None, floating: false, + cwd: None, }; send_cli_action_to_server( &session_metadata, diff --git a/zellij-utils/src/cli.rs b/zellij-utils/src/cli.rs index baa53b9a..694032dc 100644 --- a/zellij-utils/src/cli.rs +++ b/zellij-utils/src/cli.rs @@ -162,6 +162,10 @@ pub enum Sessions { /// Open the new pane in floating mode #[clap(short, long, value_parser, default_value("false"), takes_value(false))] floating: bool, + + /// Change the working directory of the editor + #[clap(long, value_parser)] + cwd: Option, }, ConvertConfig { old_config_file: PathBuf, @@ -282,6 +286,10 @@ pub enum CliAction { /// Open the new pane in floating mode #[clap(short, long, value_parser, default_value("false"), takes_value(false))] floating: bool, + + /// Change the working directory of the editor + #[clap(long, value_parser)] + cwd: Option, }, /// Switch input mode of all connected clients [locked|pane|tab|resize|move|search|session] SwitchMode { input_mode: InputMode }, diff --git a/zellij-utils/src/input/actions.rs b/zellij-utils/src/input/actions.rs index 189f3cd9..e0337da0 100644 --- a/zellij-utils/src/input/actions.rs +++ b/zellij-utils/src/input/actions.rs @@ -301,10 +301,12 @@ impl Action { file, line_number, floating, + cwd, } => { let mut file = file; + let cwd = cwd.or_else(|| std::env::current_dir().ok()); if file.is_relative() { - if let Some(cwd) = std::env::current_dir().ok() { + if let Some(cwd) = cwd { file = cwd.join(file); } }