From 261c75ab92fb96c1e52605eb26f6d69680c10332 Mon Sep 17 00:00:00 2001 From: Diego Alonso Date: Thu, 9 Nov 2023 10:45:48 +0100 Subject: [PATCH] feat(panes): reuse CWD when dropping to shell in command panes (#2915) --- zellij-server/src/panes/terminal_pane.rs | 4 +++- zellij-server/src/pty.rs | 18 +++++++++++++----- zellij-server/src/tab/mod.rs | 13 +++++++------ 3 files changed, 23 insertions(+), 12 deletions(-) diff --git a/zellij-server/src/panes/terminal_pane.rs b/zellij-server/src/panes/terminal_pane.rs index 0299b638..1e550abd 100644 --- a/zellij-server/src/panes/terminal_pane.rs +++ b/zellij-server/src/panes/terminal_pane.rs @@ -196,11 +196,13 @@ impl Pane for TerminalPane { Some(AdjustedInput::ReRunCommandInThisPane(run_command)) }, ESC => { + // Drop to shell in the same working directory as the command was run + let working_dir = run_command.cwd.clone(); self.is_held = None; self.grid.reset_terminal_state(); self.set_should_render(true); self.remove_banner(); - Some(AdjustedInput::DropToShellInThisPane) + Some(AdjustedInput::DropToShellInThisPane { working_dir }) }, CTRL_C => Some(AdjustedInput::CloseThisPane), _ => None, diff --git a/zellij-server/src/pty.rs b/zellij-server/src/pty.rs index 77b7319a..43cabba0 100644 --- a/zellij-server/src/pty.rs +++ b/zellij-server/src/pty.rs @@ -67,7 +67,11 @@ pub enum PtyInstruction { ClosePane(PaneId), CloseTab(Vec), ReRunCommandInPane(PaneId, RunCommand), - DropToShellInPane(PaneId, Option), // Option - default shell + DropToShellInPane { + pane_id: PaneId, + shell: Option, + working_dir: Option, + }, SpawnInPlaceTerminal( Option, Option, @@ -101,7 +105,7 @@ impl From<&PtyInstruction> for PtyContext { PtyInstruction::CloseTab(_) => PtyContext::CloseTab, PtyInstruction::NewTab(..) => PtyContext::NewTab, PtyInstruction::ReRunCommandInPane(..) => PtyContext::ReRunCommandInPane, - PtyInstruction::DropToShellInPane(..) => PtyContext::DropToShellInPane, + PtyInstruction::DropToShellInPane { .. } => PtyContext::DropToShellInPane, PtyInstruction::SpawnInPlaceTerminal(..) => PtyContext::SpawnInPlaceTerminal, PtyInstruction::DumpLayout(..) => PtyContext::DumpLayout, PtyInstruction::LogLayoutToHd(..) => PtyContext::LogLayoutToHd, @@ -546,17 +550,21 @@ pub(crate) fn pty_thread_main(mut pty: Pty, layout: Box) -> Result<()> { }, } }, - PtyInstruction::DropToShellInPane(pane_id, default_shell) => { + PtyInstruction::DropToShellInPane { + pane_id, + shell, + working_dir, + } => { let err_context = || format!("failed to rerun command in pane {:?}", pane_id); // TODO: get configured default_shell from screen/tab as an option and default to // this otherwise (also look for a place that turns get_default_shell into a // RunCommand, we might have done this before) let run_command = RunCommand { - command: default_shell.unwrap_or_else(|| get_default_shell()), + command: shell.unwrap_or_else(|| get_default_shell()), hold_on_close: false, hold_on_start: false, - // TODO: cwd + cwd: working_dir, ..Default::default() }; match pty diff --git a/zellij-server/src/tab/mod.rs b/zellij-server/src/tab/mod.rs index a2f5e943..0352eb96 100644 --- a/zellij-server/src/tab/mod.rs +++ b/zellij-server/src/tab/mod.rs @@ -486,7 +486,7 @@ pub enum AdjustedInput { ReRunCommandInThisPane(RunCommand), PermissionRequestResult(Vec, PermissionStatus), CloseThisPane, - DropToShellInThisPane, + DropToShellInThisPane { working_dir: Option }, } pub fn get_next_terminal_position( tiled_panes: &TiledPanes, @@ -1736,13 +1736,14 @@ impl Tab { self.close_pane(PaneId::Terminal(active_terminal_id), false, None); should_update_ui = true; }, - Some(AdjustedInput::DropToShellInThisPane) => { + Some(AdjustedInput::DropToShellInThisPane { working_dir }) => { self.pids_waiting_resize.insert(active_terminal_id); self.senders - .send_to_pty(PtyInstruction::DropToShellInPane( - PaneId::Terminal(active_terminal_id), - self.default_shell.clone(), - )) + .send_to_pty(PtyInstruction::DropToShellInPane { + pane_id: PaneId::Terminal(active_terminal_id), + shell: self.default_shell.clone(), + working_dir, + }) .with_context(err_context)?; should_update_ui = true; },