aboutsummaryrefslogtreecommitdiff
path: root/src/app
diff options
context:
space:
mode:
authorOgulcan Celik <ogulcancelik@gmail.com>2026-07-02 01:16:21 +0300
committerOgulcan Celik <ogulcancelik@gmail.com>2026-07-02 01:16:21 +0300
commita9111cbab2a7550c7e84ec94c8b388de9a44daa3 (patch)
treeed60b5baf7fd5d138aa5ab7d7d1b8892d3f41b73 /src/app
parent6a5b431e39c3a77652dc22e692925027cb69b965 (diff)
fix: open scrollback editor on windows without sh
refs #914
Diffstat (limited to 'src/app')
-rw-r--r--src/app/input/navigate.rs52
1 files changed, 28 insertions, 24 deletions
diff --git a/src/app/input/navigate.rs b/src/app/input/navigate.rs
index 35359cde..186947b6 100644
--- a/src/app/input/navigate.rs
+++ b/src/app/input/navigate.rs
@@ -820,14 +820,27 @@ impl App {
let path = write_scrollback_temp_file(&scrollback)?;
- let quoted_path = shell_quote(&path.display().to_string());
- let command = format!(
- r#"scrollback_file={quoted_path}; eval "${{EDITOR:-vi}} \"\$scrollback_file\""; status=$?; rm -f "$scrollback_file"; exit $status"#
- );
- if let Err(err) = self.spawn_pane_command(&command, vec![path.clone()]) {
- let _ = fs::remove_file(&path);
- return Err(err);
- }
+ let argv = match crate::platform::scrollback_editor_argv(&path) {
+ Ok(argv) => argv,
+ Err(err) => {
+ let _ = fs::remove_file(&path);
+ return Err(err);
+ }
+ };
+ let (env, _) = self.custom_command_env();
+ let new_pane = match self.spawn_overlay_argv_command(&argv, None, env, vec![path.clone()]) {
+ Ok((_, new_pane)) => new_pane,
+ Err(err) => {
+ let _ = fs::remove_file(&path);
+ return Err(err);
+ }
+ };
+ let terminal_id = new_pane.terminal.id.clone();
+ self.terminal_runtimes
+ .insert(terminal_id.clone(), new_pane.runtime);
+ self.state
+ .remove_alias_shadowed_by_new_pane(new_pane.pane_id);
+ self.state.terminals.insert(terminal_id, new_pane.terminal);
if let Some(public_pane_id) = self.public_pane_id(ws_idx, pane_id) {
self.state.toast = Some(crate::app::state::ToastNotification {
@@ -1677,22 +1690,6 @@ fn unique_scrollback_path(attempt: u32) -> std::path::PathBuf {
))
}
-fn shell_quote(value: &str) -> String {
- if !value.is_empty()
- && value.chars().all(|ch| {
- ch.is_ascii_alphanumeric()
- || matches!(
- ch,
- '@' | '%' | '_' | '+' | '=' | ':' | ',' | '.' | '/' | '-'
- )
- })
- {
- return value.to_string();
- }
-
- format!("'{}'", value.replace('\'', "'\\''"))
-}
-
#[cfg(test)]
mod tests {
#[cfg(unix)]
@@ -2797,6 +2794,13 @@ last_pane = "prefix+tab"
assert!(content.contains("alpha"));
assert!(content.contains("beta"));
assert_eq!(app.state.mode, Mode::Terminal);
+ assert!(
+ app.state.terminals.values().any(|terminal| terminal
+ .launch_argv
+ .as_ref()
+ .is_some_and(|argv| argv.first().is_some_and(|program| program == "/bin/sh"))),
+ "scrollback editor should launch through argv overlay path"
+ );
let _ = std::fs::remove_file(output_path);
}