mirror of
https://github.com/nushell/nushell.git
synced 2025-04-03 06:01:11 +02:00
allow for arguments in EDITOR and VISUAL env vars (#8105)
# Description Fixes #8051. # User-Facing Changes You can now put command arguments into the EDITOR and VISUAL config / env variables. # Tests + Formatting I don't know how to write tests for this. However, I set $env.EDITOR to "nvim -R" and it seemed to work. # After Submitting If your PR had any user-facing changes, update [the documentation](https://github.com/nushell/nushell.github.io) after the PR is merged, if necessary. This will help us keep the docs up to date.
This commit is contained in:
parent
680405e527
commit
9bbb9711e4
33
crates/nu-command/src/env/config/config_env.rs
vendored
33
crates/nu-command/src/env/config/config_env.rs
vendored
@ -2,12 +2,10 @@ use nu_engine::env_to_strings;
|
|||||||
use nu_protocol::{
|
use nu_protocol::{
|
||||||
ast::Call,
|
ast::Call,
|
||||||
engine::{Command, EngineState, Stack},
|
engine::{Command, EngineState, Stack},
|
||||||
Category, Example, PipelineData, ShellError, Signature, Span, Spanned, Type,
|
Category, Example, PipelineData, ShellError, Signature, Type,
|
||||||
};
|
};
|
||||||
|
|
||||||
use crate::ExternalCommand;
|
use super::utils::{gen_command, get_editor};
|
||||||
|
|
||||||
use super::utils::get_editor;
|
|
||||||
|
|
||||||
#[derive(Clone)]
|
#[derive(Clone)]
|
||||||
pub struct ConfigEnv;
|
pub struct ConfigEnv;
|
||||||
@ -60,26 +58,13 @@ impl Command for ConfigEnv {
|
|||||||
let mut nu_config = config_path.clone();
|
let mut nu_config = config_path.clone();
|
||||||
nu_config.push("env.nu");
|
nu_config.push("env.nu");
|
||||||
|
|
||||||
let name = Spanned {
|
let (item, config_args) = get_editor(engine_state, stack)?;
|
||||||
item: get_editor(engine_state, stack)?,
|
|
||||||
span: call.head,
|
|
||||||
};
|
|
||||||
|
|
||||||
let args = vec![Spanned {
|
gen_command(call.head, nu_config, item, config_args, env_vars_str).run_with_input(
|
||||||
item: nu_config.to_string_lossy().to_string(),
|
engine_state,
|
||||||
span: Span::unknown(),
|
stack,
|
||||||
}];
|
input,
|
||||||
|
true,
|
||||||
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)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
33
crates/nu-command/src/env/config/config_nu.rs
vendored
33
crates/nu-command/src/env/config/config_nu.rs
vendored
@ -2,12 +2,10 @@ use nu_engine::env_to_strings;
|
|||||||
use nu_protocol::{
|
use nu_protocol::{
|
||||||
ast::Call,
|
ast::Call,
|
||||||
engine::{Command, EngineState, Stack},
|
engine::{Command, EngineState, Stack},
|
||||||
Category, Example, PipelineData, ShellError, Signature, Span, Spanned, Type,
|
Category, Example, PipelineData, ShellError, Signature, Type,
|
||||||
};
|
};
|
||||||
|
|
||||||
use crate::ExternalCommand;
|
use super::utils::{gen_command, get_editor};
|
||||||
|
|
||||||
use super::utils::get_editor;
|
|
||||||
|
|
||||||
#[derive(Clone)]
|
#[derive(Clone)]
|
||||||
pub struct ConfigNu;
|
pub struct ConfigNu;
|
||||||
@ -60,26 +58,13 @@ impl Command for ConfigNu {
|
|||||||
let mut nu_config = config_path.clone();
|
let mut nu_config = config_path.clone();
|
||||||
nu_config.push("config.nu");
|
nu_config.push("config.nu");
|
||||||
|
|
||||||
let name = Spanned {
|
let (item, config_args) = get_editor(engine_state, stack)?;
|
||||||
item: get_editor(engine_state, stack)?,
|
|
||||||
span: call.head,
|
|
||||||
};
|
|
||||||
|
|
||||||
let args = vec![Spanned {
|
gen_command(call.head, nu_config, item, config_args, env_vars_str).run_with_input(
|
||||||
item: nu_config.to_string_lossy().to_string(),
|
engine_state,
|
||||||
span: Span::unknown(),
|
stack,
|
||||||
}];
|
input,
|
||||||
|
true,
|
||||||
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)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
58
crates/nu-command/src/env/config/utils.rs
vendored
58
crates/nu-command/src/env/config/utils.rs
vendored
@ -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(
|
pub(crate) fn get_editor(
|
||||||
engine_state: &EngineState,
|
engine_state: &EngineState,
|
||||||
stack: &mut Stack,
|
stack: &mut Stack,
|
||||||
) -> Result<String, nu_protocol::ShellError> {
|
) -> Result<(String, Vec<String>), nu_protocol::ShellError> {
|
||||||
let config = engine_state.get_config();
|
let config = engine_state.get_config();
|
||||||
let env_vars = stack.get_env_vars(engine_state);
|
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())
|
Ok(config.buffer_editor.clone())
|
||||||
} else if let Some(value) = env_vars.get("EDITOR") {
|
} else if let Some(value) = env_vars.get("EDITOR") {
|
||||||
value.as_string()
|
value.as_string()
|
||||||
@ -16,5 +23,50 @@ pub(crate) fn get_editor(
|
|||||||
Ok("notepad".to_string())
|
Ok("notepad".to_string())
|
||||||
} else {
|
} else {
|
||||||
Ok("nano".to_string())
|
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::<Vec<String>>(),
|
||||||
|
))
|
||||||
|
} else {
|
||||||
|
Ok((editor, Vec::new()))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub(crate) fn gen_command(
|
||||||
|
span: Span,
|
||||||
|
config_path: PathBuf,
|
||||||
|
item: String,
|
||||||
|
config_args: Vec<String>,
|
||||||
|
env_vars_str: HashMap<String, String>,
|
||||||
|
) -> 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,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user