From f85f0b72729ebbc1d93020b1c1a52a2f2fb3bc59 Mon Sep 17 00:00:00 2001 From: Ryosuke Hayashi Date: Mon, 2 May 2022 23:15:02 +0900 Subject: Add run-shell-command for Commands (#1682) * add run_shell_command * docgen * fix command name Co-authored-by: Blaž Hrastnik * refactored Info::new * show 'Command failed' if execution fails * TypedCommand takes care of error handling and printing the error to the statusline. * docgen * use Popup instead of autoinfo * remove to_string in format! * Revert chage in info.rs * Show "Command succeed" when success * Fix info.rs Co-authored-by: Blaž Hrastnik --- helix-term/src/commands/typed.rs | 44 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) (limited to 'helix-term/src/commands/typed.rs') diff --git a/helix-term/src/commands/typed.rs b/helix-term/src/commands/typed.rs index 394760a2..373c7018 100644 --- a/helix-term/src/commands/typed.rs +++ b/helix-term/src/commands/typed.rs @@ -1116,6 +1116,43 @@ fn pipe( Ok(()) } +fn run_shell_command( + cx: &mut compositor::Context, + args: &[Cow], + _event: PromptEvent, +) -> anyhow::Result<()> { + let shell = &cx.editor.config().shell; + let (output, success) = shell_impl(shell, &args.join(" "), None)?; + if success { + cx.editor.set_status("Command succeed"); + } else { + cx.editor.set_error("Command failed"); + } + + if !output.is_empty() { + let callback = async move { + let call: job::Callback = + Box::new(move |editor: &mut Editor, compositor: &mut Compositor| { + let contents = ui::Markdown::new( + format!("```sh\n{}\n```", output), + editor.syn_loader.clone(), + ); + let mut popup = Popup::new("shell", contents); + popup.set_position(Some(helix_core::Position::new( + editor.cursor().0.unwrap_or_default().row, + 2, + ))); + compositor.replace_or_push("shell", popup); + }); + Ok(call) + }; + + cx.jobs.callback(callback); + } + + Ok(()) +} + pub const TYPABLE_COMMAND_LIST: &[TypableCommand] = &[ TypableCommand { name: "quit", @@ -1561,6 +1598,13 @@ pub const TYPABLE_COMMAND_LIST: &[TypableCommand] = &[ fun: pipe, completer: None, }, + TypableCommand { + name: "run-shell-command", + aliases: &["sh"], + doc: "Run a shell command", + fun: run_shell_command, + completer: Some(completers::directory), + }, ]; pub static TYPABLE_COMMAND_MAP: Lazy> = -- cgit v1.2.3-70-g09d2