mirror of
https://github.com/nushell/nushell.git
synced 2025-08-09 08:16:32 +02:00
Fix editor config for reedline and config nu/env
(#10535)
# Description This merges @horasal 's changes from #10246 and #10269 Closes #10205 Closes #8714 Fixes the bug that editor paths with spaces are unusable Closes #10210 Closes #10269 # User-Facing Changes You can now either pass a string with the name of the executable or a list with the executable and any flags to `$env.config.buffer_editor`/`$env.EDITOR`/`$env.VISUAL` Both the external buffer editor of reedline (by default bound to `Ctrl-o`) and the commands `config nu` and `config env` will respect those variables in the following order: 1. `$env.config.buffer_editor` 2. `$env.EDITOR` 3. `$env.VISUAL` Example: ``` $env.EDITOR = "nvim" # The system-wide EDITOR is neovim $env.config.buffer_editor = ["vim" "-p2"] # Force vim to open two tabs (not particularly useful) $env.config.buffer_editor = null # Unset `buffer_editor` -> Uses `$env.EDITOR` ergo nvim ``` # Tests + Formatting None --------- Co-authored-by: Horasal <1991933+horasal@users.noreply.github.com>
This commit is contained in:
committed by
GitHub
parent
f2af12af2c
commit
80a183dde2
@ -8,8 +8,8 @@ use crate::{
|
||||
use crossterm::cursor::SetCursorStyle;
|
||||
use log::{trace, warn};
|
||||
use miette::{ErrReport, IntoDiagnostic, Result};
|
||||
use nu_cmd_base::hook::eval_hook;
|
||||
use nu_cmd_base::util::get_guaranteed_cwd;
|
||||
use nu_cmd_base::{hook::eval_hook, util::get_editor};
|
||||
use nu_color_config::StyleComputer;
|
||||
use nu_engine::convert_env_values;
|
||||
use nu_parser::{lex, parse, trim_quotes_str};
|
||||
@ -26,6 +26,7 @@ use reedline::{
|
||||
SqliteBackedHistory, Vi,
|
||||
};
|
||||
use std::{
|
||||
env::temp_dir,
|
||||
io::{self, IsTerminal, Write},
|
||||
path::Path,
|
||||
sync::atomic::Ordering,
|
||||
@ -94,6 +95,7 @@ pub fn evaluate_repl(
|
||||
|
||||
let mut start_time = std::time::Instant::now();
|
||||
let mut line_editor = Reedline::create();
|
||||
let temp_file = temp_dir().join(format!("{}.nu", uuid::Uuid::new_v4()));
|
||||
|
||||
// Now that reedline is created, get the history session id and store it in engine_state
|
||||
store_history_id_in_engine(engine_state, &line_editor);
|
||||
@ -330,23 +332,17 @@ pub fn evaluate_repl(
|
||||
);
|
||||
|
||||
start_time = std::time::Instant::now();
|
||||
let buffer_editor = if !config.buffer_editor.is_empty() {
|
||||
Some(config.buffer_editor.clone())
|
||||
} else {
|
||||
stack
|
||||
.get_env_var(engine_state, "EDITOR")
|
||||
.map(|v| v.as_string().unwrap_or_default())
|
||||
.filter(|v| !v.is_empty())
|
||||
.or_else(|| {
|
||||
stack
|
||||
.get_env_var(engine_state, "VISUAL")
|
||||
.map(|v| v.as_string().unwrap_or_default())
|
||||
.filter(|v| !v.is_empty())
|
||||
})
|
||||
};
|
||||
let buffer_editor = get_editor(engine_state, stack, Span::unknown());
|
||||
|
||||
line_editor = if let Some(buffer_editor) = buffer_editor {
|
||||
line_editor.with_buffer_editor(buffer_editor, "nu".into())
|
||||
line_editor = if let Ok((cmd, args)) = buffer_editor {
|
||||
let mut command = std::process::Command::new(&cmd);
|
||||
command.args(args).envs(
|
||||
engine_state
|
||||
.render_env_vars()
|
||||
.into_iter()
|
||||
.filter_map(|(k, v)| v.as_string().ok().map(|v| (k, v))),
|
||||
);
|
||||
line_editor.with_buffer_editor(command, temp_file.clone())
|
||||
} else {
|
||||
line_editor
|
||||
};
|
||||
|
Reference in New Issue
Block a user