diff --git a/crates/nu-command/src/env/config/config_env.rs b/crates/nu-command/src/env/config/config_env.rs index 9cdca8e46a..aedf2e7b0b 100644 --- a/crates/nu-command/src/env/config/config_env.rs +++ b/crates/nu-command/src/env/config/config_env.rs @@ -2,12 +2,10 @@ use nu_engine::env_to_strings; use nu_protocol::{ ast::Call, engine::{Command, EngineState, Stack}, - Category, Example, PipelineData, ShellError, Signature, Span, Spanned, Type, + Category, Example, PipelineData, ShellError, Signature, Type, }; -use crate::ExternalCommand; - -use super::utils::get_editor; +use super::utils::{gen_command, get_editor}; #[derive(Clone)] pub struct ConfigEnv; @@ -60,26 +58,13 @@ impl Command for ConfigEnv { let mut nu_config = config_path.clone(); nu_config.push("env.nu"); - let name = Spanned { - item: get_editor(engine_state, stack)?, - span: call.head, - }; + let (item, config_args) = get_editor(engine_state, stack)?; - let args = vec![Spanned { - item: nu_config.to_string_lossy().to_string(), - span: Span::unknown(), - }]; - - let command = ExternalCommand { - name, - args, - arg_keep_raw: vec![false], - redirect_stdout: false, - redirect_stderr: false, - env_vars: env_vars_str, - trim_end_newline: false, - }; - - command.run_with_input(engine_state, stack, input, true) + gen_command(call.head, nu_config, item, config_args, env_vars_str).run_with_input( + engine_state, + stack, + input, + true, + ) } } diff --git a/crates/nu-command/src/env/config/config_nu.rs b/crates/nu-command/src/env/config/config_nu.rs index 5f6c5193b6..62e70c3755 100644 --- a/crates/nu-command/src/env/config/config_nu.rs +++ b/crates/nu-command/src/env/config/config_nu.rs @@ -2,12 +2,10 @@ use nu_engine::env_to_strings; use nu_protocol::{ ast::Call, engine::{Command, EngineState, Stack}, - Category, Example, PipelineData, ShellError, Signature, Span, Spanned, Type, + Category, Example, PipelineData, ShellError, Signature, Type, }; -use crate::ExternalCommand; - -use super::utils::get_editor; +use super::utils::{gen_command, get_editor}; #[derive(Clone)] pub struct ConfigNu; @@ -60,26 +58,13 @@ impl Command for ConfigNu { let mut nu_config = config_path.clone(); nu_config.push("config.nu"); - let name = Spanned { - item: get_editor(engine_state, stack)?, - span: call.head, - }; + let (item, config_args) = get_editor(engine_state, stack)?; - let args = vec![Spanned { - item: nu_config.to_string_lossy().to_string(), - span: Span::unknown(), - }]; - - let command = ExternalCommand { - name, - args, - arg_keep_raw: vec![false], - redirect_stdout: false, - redirect_stderr: false, - env_vars: env_vars_str, - trim_end_newline: false, - }; - - command.run_with_input(engine_state, stack, input, true) + gen_command(call.head, nu_config, item, config_args, env_vars_str).run_with_input( + engine_state, + stack, + input, + true, + ) } } diff --git a/crates/nu-command/src/env/config/utils.rs b/crates/nu-command/src/env/config/utils.rs index f0c07a6f70..107d35b476 100644 --- a/crates/nu-command/src/env/config/utils.rs +++ b/crates/nu-command/src/env/config/utils.rs @@ -1,12 +1,19 @@ -use nu_protocol::engine::{EngineState, Stack}; +use std::{collections::HashMap, path::PathBuf}; + +use nu_protocol::{ + engine::{EngineState, Stack}, + Span, Spanned, +}; + +use crate::ExternalCommand; pub(crate) fn get_editor( engine_state: &EngineState, stack: &mut Stack, -) -> Result { +) -> Result<(String, Vec), nu_protocol::ShellError> { let config = engine_state.get_config(); let env_vars = stack.get_env_vars(engine_state); - if !config.buffer_editor.is_empty() { + let editor = if !config.buffer_editor.is_empty() { Ok(config.buffer_editor.clone()) } else if let Some(value) = env_vars.get("EDITOR") { value.as_string() @@ -16,5 +23,50 @@ pub(crate) fn get_editor( Ok("notepad".to_string()) } else { Ok("nano".to_string()) + }?; + if let Some((a, b)) = editor.split_once(' ') { + Ok(( + a.to_string(), + b.split(' ') + .into_iter() + .map(|s| s.to_string()) + .collect::>(), + )) + } else { + Ok((editor, Vec::new())) + } +} + +pub(crate) fn gen_command( + span: Span, + config_path: PathBuf, + item: String, + config_args: Vec, + env_vars_str: HashMap, +) -> ExternalCommand { + let name = Spanned { item, span }; + + let mut args = vec![Spanned { + item: config_path.to_string_lossy().to_string(), + span: Span::unknown(), + }]; + + let number_of_args = config_args.len() + 1; + + for arg in config_args { + args.push(Spanned { + item: arg, + span: Span::unknown(), + }) + } + + ExternalCommand { + name, + args, + arg_keep_raw: vec![false; number_of_args], + redirect_stdout: false, + redirect_stderr: false, + env_vars: env_vars_str, + trim_end_newline: false, } }