aboutsummaryrefslogtreecommitdiffstats
path: root/crates
diff options
context:
space:
mode:
authorMarko Bausch <60338487+mrkbac@users.noreply.github.com>2025-07-23 13:24:50 +0200
committerGitHub <noreply@github.com>2025-07-23 13:24:50 +0200
commite0bff110736fd98ad07ba210836720060965d05b (patch)
tree8d7b7bca5f75dad0b87ebc0f978a4474c73f4b36 /crates
parentfeat: add info for 'official' plugins (#2835) (diff)
downloadatuin-e0bff110736fd98ad07ba210836720060965d05b.zip
feat: Support multi part commands (Fixes #2836) (#2837)
* feat: Support multi part commands * fix: Clippy
Diffstat (limited to 'crates')
-rw-r--r--crates/atuin/Cargo.toml1
-rw-r--r--crates/atuin/src/command/client/scripts.rs13
2 files changed, 12 insertions, 2 deletions
diff --git a/crates/atuin/Cargo.toml b/crates/atuin/Cargo.toml
index 1b0357b9..42c8a7c8 100644
--- a/crates/atuin/Cargo.toml
+++ b/crates/atuin/Cargo.toml
@@ -90,6 +90,7 @@ uuid = { workspace = true }
sysinfo = "0.30.7"
regex = "1.10.5"
tempfile = { workspace = true }
+shlex = "1.3.0"
[target.'cfg(any(target_os = "windows", target_os = "macos"))'.dependencies]
arboard = { version = "3.4", optional = true }
diff --git a/crates/atuin/src/command/client/scripts.rs b/crates/atuin/src/command/client/scripts.rs
index 755cee1e..65ceabde 100644
--- a/crates/atuin/src/command/client/scripts.rs
+++ b/crates/atuin/src/command/client/scripts.rs
@@ -10,6 +10,7 @@ use atuin_scripts::{
store::{ScriptStore, script::Script},
};
use clap::{Parser, Subcommand};
+use eyre::OptionExt;
use eyre::{Result, bail};
use tempfile::NamedTempFile;
@@ -131,8 +132,16 @@ impl Cmd {
}
// Open the file in the user's preferred editor
- let editor = std::env::var("EDITOR").unwrap_or_else(|_| "vi".to_string());
- let status = std::process::Command::new(editor).arg(&path).status()?;
+ let editor_str = std::env::var("EDITOR").unwrap_or_else(|_| "vi".to_string());
+
+ // Use shlex to safely split the string into shell-like parts.
+ let parts = shlex::split(&editor_str).ok_or_eyre("Failed to parse editor command")?;
+ let (command, args) = parts.split_first().ok_or_eyre("No editor command found")?;
+
+ let status = std::process::Command::new(command)
+ .args(args)
+ .arg(&path)
+ .status()?;
if !status.success() {
bail!("failed to open editor");
}