summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDiego Alonso <diego.alonso@appentra.com>2023-11-09 10:45:48 +0100
committerGitHub <noreply@github.com>2023-11-09 10:45:48 +0100
commit261c75ab92fb96c1e52605eb26f6d69680c10332 (patch)
treef0aa060ceb2c38fa16d36ea8f72b76b9221f10d6
parent83cf6d6e7cf4ad744a18b21fb9c1c8f956f2b577 (diff)
feat(panes): reuse CWD when dropping to shell in command panes (#2915)
-rw-r--r--zellij-server/src/panes/terminal_pane.rs4
-rw-r--r--zellij-server/src/pty.rs18
-rw-r--r--zellij-server/src/tab/mod.rs13
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 0299b6386..1e550abd8 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 77b7319ac..43cabba06 100644
--- a/zellij-server/src/pty.rs
+++ b/zellij-server/src/pty.rs
@@ -67,7 +67,11 @@ pub enum PtyInstruction {
ClosePane(PaneId),
CloseTab(Vec<PaneId>),
ReRunCommandInPane(PaneId, RunCommand),
- DropToShellInPane(PaneId, Option<PathBuf>), // Option<PathBuf> - default shell
+ DropToShellInPane {
+ pane_id: PaneId,
+ shell: Option<PathBuf>,
+ working_dir: Option<PathBuf>,
+ },
SpawnInPlaceTerminal(
Option<TerminalAction>,
Option<String>,
@@ -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<Layout>) -> 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 a2f5e9439..0352eb96d 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<PermissionType>, PermissionStatus),
CloseThisPane,
- DropToShellInThisPane,
+ DropToShellInThisPane { working_dir: Option<PathBuf> },
}
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;
},