Grouped config commands better (closes #6911) (#6983)

* Grouped config commands better

* Tweaked test slightly

* Fix merge conflict(?)

* Remove recently-added test case

* Revert rm.always_trash default

* Untweak rm help messages

* Formatting

* Remove example

* Add deprecation warning

* Remove deprecation timeline

Not sure we want to commit to a specific timeline just yet

Co-authored-by: Reilly Wood <26268125+rgwood@users.noreply.github.com>
This commit is contained in:
Leon 2022-11-20 03:52:09 +10:00 committed by GitHub
parent 4b83a2d27a
commit 7479173811
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 557 additions and 189 deletions

View File

@ -88,12 +88,12 @@ impl Command for Rm {
}
fn examples(&self) -> Vec<Example> {
let mut examples = vec![
Example {
description: "Delete or move a file to the system trash (depending on 'rm_always_trash' config option)",
example: "rm file.txt",
result: None,
}];
let mut examples = vec![Example {
description:
"Delete or move a file to the trash (depending on 'always_trash' config option)",
example: "rm file.txt",
result: None,
}];
#[cfg(all(
feature = "trash-support",
not(target_os = "android"),
@ -164,7 +164,7 @@ fn rm(
if rm_always_trash {
return Err(ShellError::GenericError(
"Cannot execute `rm`; the current configuration specifies \
`rm_always_trash = true`, but the current nu executable was not \
`always_trash = true`, but the current nu executable was not \
built with feature `trash_support` or trash is not supported on \
your platform."
.into(),

View File

@ -189,35 +189,337 @@ impl Value {
let mut config = Config::default();
let mut legacy_options_used = false;
if let Ok(v) = v {
for (key, value) in v.0.iter().zip(v.1) {
match key.as_str() {
"filesize_metric" => {
if let Ok(b) = value.as_bool() {
config.filesize_metric = b;
let key = key.as_str();
match key {
// Grouped options
"ls" => {
if let Ok((cols, inner_vals)) = value.as_record() {
for (key2, value) in cols.iter().zip(inner_vals) {
let key2 = key2.as_str();
match key2 {
"use_ls_colors" => {
if let Ok(b) = value.as_bool() {
config.use_ls_colors = b;
} else {
eprintln!("$env.config.{}.{} is not a bool", key, key2)
}
}
"clickable_links" => {
if let Ok(b) = value.as_bool() {
config.show_clickable_links_in_ls = b;
} else {
eprintln!("$env.config.{}.{} is not a bool", key, key2)
}
}
x => {
eprintln!(
"$env.config.{}.{} is an unknown config setting",
key, x
)
}
}
}
} else {
eprintln!("$config.filesize_metric is not a bool")
eprintln!("$env.config.{} is not a record", key);
}
}
"external_completer" => {
if let Ok(v) = value.as_block() {
config.external_completer = Some(v)
}
}
"table_mode" => {
if let Ok(v) = value.as_string() {
config.table_mode = v;
"cd" => {
if let Ok((cols, inner_vals)) = value.as_record() {
for (key2, value) in cols.iter().zip(inner_vals) {
let key2 = key2.as_str();
match key2 {
"abbreviations" => {
if let Ok(b) = value.as_bool() {
config.cd_with_abbreviations = b;
} else {
eprintln!("$env.config.{}.{} is not a bool", key, key2)
}
}
x => {
eprintln!(
"$env.config.{}.{} is an unknown config setting",
key, x
)
}
}
}
} else {
eprintln!("$config.table_mode is not a string")
eprintln!("$env.config.{} is not a record", key);
}
}
"use_ls_colors" => {
if let Ok(b) = value.as_bool() {
config.use_ls_colors = b;
"rm" => {
if let Ok((cols, inner_vals)) = value.as_record() {
for (key2, value) in cols.iter().zip(inner_vals) {
let key2 = key2.as_str();
match key2 {
"always_trash" => {
if let Ok(b) = value.as_bool() {
config.rm_always_trash = b;
} else {
eprintln!("$env.config.{}.{} is not a bool", key, key2)
}
}
x => {
eprintln!(
"$env.config.{}.{} is an unknown config setting",
key, x
)
}
}
}
} else {
eprintln!("$config.use_ls_colors is not a bool")
eprintln!("$env.config.{} is not a record", key);
}
}
"history" => {
if let Ok((cols, inner_vals)) = value.as_record() {
for (key2, value) in cols.iter().zip(inner_vals) {
let key2 = key2.as_str();
match key2 {
"sync_on_enter" => {
if let Ok(b) = value.as_bool() {
config.sync_history_on_enter = b;
} else {
eprintln!("$env.config.{}.{} is not a bool", key, key2)
}
}
"max_size" => {
if let Ok(i) = value.as_i64() {
config.max_history_size = i;
} else {
eprintln!(
"$env.config.{}.{} is not an integer",
key, key2
)
}
}
"file_format" => {
if let Ok(v) = value.as_string() {
let val_str = v.to_lowercase();
config.history_file_format = match val_str.as_ref() {
"sqlite" => HistoryFileFormat::Sqlite,
"plaintext" => HistoryFileFormat::PlainText,
_ => {
eprintln!(
"unrecognized $config.{}.{} '{val_str}'; expected either 'sqlite' or 'plaintext'",
key, key2,
);
HistoryFileFormat::PlainText
}
};
} else {
eprintln!(
"$env.config.{}.{} is not a string",
key, key2
)
}
}
x => {
eprintln!(
"$env.config.{}.{} is an unknown config setting",
key, x
)
}
}
}
} else {
eprintln!("$env.config.{} is not a record", key)
}
}
"completions" => {
if let Ok((cols, inner_vals)) = value.as_record() {
for (key2, value) in cols.iter().zip(inner_vals) {
let key2 = key2.as_str();
match key2 {
"quick" => {
if let Ok(b) = value.as_bool() {
config.quick_completions = b;
} else {
eprintln!("$env.config.{}.{} is not a bool", key, key2)
}
}
"partial" => {
if let Ok(b) = value.as_bool() {
config.partial_completions = b;
} else {
eprintln!("$env.config.{}.{} is not a bool", key, key2)
}
}
"algorithm" => {
if let Ok(v) = value.as_string() {
let val_str = v.to_lowercase();
config.completion_algorithm = match val_str.as_ref() {
// This should match the MatchAlgorithm enum in completions::completion_options
"prefix" => val_str,
"fuzzy" => val_str,
_ => {
eprintln!(
"unrecognized $config.{}.{} '{val_str}'; expected either 'prefix' or 'fuzzy'",
key, key2
);
String::from("prefix")
}
};
} else {
eprintln!(
"$env.config.{}.{} is not a string",
key, key2
)
}
}
"case_sensitive" => {
if let Ok(b) = value.as_bool() {
config.case_sensitive_completions = b;
} else {
eprintln!("$env.config.{}.{} is not a bool", key, key2)
}
}
"external" => {
if let Ok((cols, inner_vals)) = value.as_record() {
for (key3, value) in cols.iter().zip(inner_vals) {
let key3 = key3.as_str();
match key3 {
"max_results" => {
if let Ok(i) = value.as_integer() {
config
.max_external_completion_results =
i;
} else {
eprintln!("$env.config.{}.{}.{} is not an integer", key, key2, key3)
}
}
"completer" => {
if let Ok(v) = value.as_block() {
config.external_completer = Some(v)
} else {
match value {
Value::Nothing { .. } => {}
_ => {
eprintln!("$env.config.{}.{}.{} is not a block or null", key, key2, key3)
}
}
}
}
"enable" => {
if let Ok(b) = value.as_bool() {
config.enable_external_completion = b;
} else {
eprintln!("$env.config.{}.{}.{} is not a bool", key, key2, key3)
}
}
x => {
eprintln!("$env.config.{}.{}.{} is an unknown config setting", key, key2, x)
}
}
}
} else {
eprintln!(
"$env.config.{}.{} is not a record",
key, key2
);
}
}
x => {
eprintln!(
"$env.config.{}.{} is an unknown config setting",
key, x
)
}
}
}
} else {
eprintln!("$env.config.{} is not a record", key)
}
}
"table" => {
if let Ok((cols, inner_vals)) = value.as_record() {
for (key2, value) in cols.iter().zip(inner_vals) {
let key2 = key2.as_str();
match key2 {
"mode" => {
if let Ok(v) = value.as_string() {
config.table_mode = v;
} else {
eprintln!(
"$env.config.{}.{} is not a string",
key, key2
)
}
}
"index_mode" => {
if let Ok(b) = value.as_string() {
let val_str = b.to_lowercase();
match val_str.as_ref() {
"always" => config.table_index_mode = TableIndexMode::Always,
"never" => config.table_index_mode = TableIndexMode::Never,
"auto" => config.table_index_mode = TableIndexMode::Auto,
_ => eprintln!(
"unrecognized $env.config.{}.{} '{val_str}'; expected either 'never', 'always' or 'auto'",
key, key2
),
}
} else {
eprintln!(
"$env.config.{}.{} is not a string",
key, key2
)
}
}
"trim" => {
config.trim_strategy =
try_parse_trim_strategy(value, &config)?
}
x => {
eprintln!(
"$env.config.{}.{} is an unknown config setting",
key, x
)
}
}
}
} else {
eprintln!("$env.config.{} is not a record", key)
}
}
"filesize" => {
if let Ok((cols, inner_vals)) = value.as_record() {
for (key2, value) in cols.iter().zip(inner_vals) {
let key2 = key2.as_str();
match key2 {
"metric" => {
if let Ok(b) = value.as_bool() {
config.filesize_metric = b;
} else {
eprintln!("$env.config.{}.{} is not a bool", key, key2)
}
}
"format" => {
if let Ok(v) = value.as_string() {
config.filesize_format = v.to_lowercase();
} else {
eprintln!(
"$env.config.{}.{} is not a string",
key, key2
)
}
}
x => {
eprintln!(
"$env.config.{}.{} is an unknown config setting",
key, x
)
}
}
}
} else {
eprintln!("$env.config.{} is not a record", key)
}
}
// Misc. options
"color_config" => {
if let Ok(map) = create_map(value, &config) {
config.color_config = map;
@ -229,7 +531,7 @@ impl Value {
if let Ok(b) = value.as_bool() {
config.use_grid_icons = b;
} else {
eprintln!("$config.use_grid_icons is not a bool")
eprintln!("$env.config.{} is not a bool", key)
}
}
"footer_mode" => {
@ -245,128 +547,55 @@ impl Value {
},
};
} else {
eprintln!("$config.footer_mode is not a string")
eprintln!("$env.config.{} is not a string", key)
}
}
"float_precision" => {
if let Ok(i) = value.as_integer() {
config.float_precision = i;
} else {
eprintln!("$config.float_precision is not an integer")
eprintln!("$env.config.{} is not an integer", key)
}
}
"use_ansi_coloring" => {
if let Ok(b) = value.as_bool() {
config.use_ansi_coloring = b;
} else {
eprintln!("$config.use_ansi_coloring is not a bool")
}
}
"quick_completions" => {
if let Ok(b) = value.as_bool() {
config.quick_completions = b;
} else {
eprintln!("$config.quick_completions is not a bool")
}
}
"partial_completions" => {
if let Ok(b) = value.as_bool() {
config.partial_completions = b;
} else {
eprintln!("$config.partial_completions is not a bool")
}
}
"max_external_completion_results" => {
if let Ok(i) = value.as_integer() {
config.max_external_completion_results = i;
} else {
eprintln!("$config.max_external_completion_results is not an integer")
}
}
"completion_algorithm" => {
if let Ok(v) = value.as_string() {
config.completion_algorithm = v.to_lowercase();
} else {
eprintln!("$config.completion_algorithm is not a string")
}
}
"rm_always_trash" => {
if let Ok(b) = value.as_bool() {
config.rm_always_trash = b;
} else {
eprintln!("$config.rm_always_trash is not a bool")
}
}
"filesize_format" => {
if let Ok(v) = value.as_string() {
config.filesize_format = v.to_lowercase();
} else {
eprintln!("$config.filesize_format is not a string")
eprintln!("$env.config.{} is not a bool", key)
}
}
"edit_mode" => {
if let Ok(v) = value.as_string() {
config.edit_mode = v.to_lowercase();
} else {
eprintln!("$config.edit_mode is not a string")
}
}
"history_file_format" => {
if let Ok(b) = value.as_string() {
let val_str = b.to_lowercase();
config.history_file_format = match val_str.as_ref() {
"sqlite" => HistoryFileFormat::Sqlite,
"plaintext" => HistoryFileFormat::PlainText,
_ => {
eprintln!(
"unrecognized $config.history_file_format '{val_str}'"
);
HistoryFileFormat::PlainText
}
};
} else {
eprintln!("$config.history_file_format is not a string")
}
}
"max_history_size" => {
if let Ok(i) = value.as_i64() {
config.max_history_size = i;
} else {
eprintln!("$config.max_history_size is not an integer")
}
}
"sync_history_on_enter" => {
if let Ok(b) = value.as_bool() {
config.sync_history_on_enter = b;
} else {
eprintln!("$config.sync_history_on_enter is not a bool")
eprintln!("$env.config.{} is not a string", key)
}
}
"log_level" => {
if let Ok(v) = value.as_string() {
config.log_level = v.to_lowercase();
} else {
eprintln!("$config.log_level is not a string")
eprintln!("$env.config.{} is not a string", key)
}
}
"menus" => match create_menus(value) {
Ok(map) => config.menus = map,
Err(e) => {
eprintln!("$config.menus is not a valid list of menus");
eprintln!("$env.config.{} is not a valid list of menus", key);
eprintln!("{:?}", e);
}
},
"keybindings" => match create_keybindings(value) {
Ok(keybindings) => config.keybindings = keybindings,
Err(e) => {
eprintln!("$config.keybindings is not a valid keybindings list");
eprintln!("$env.config.{} is not a valid keybindings list", key);
eprintln!("{:?}", e);
}
},
"hooks" => match create_hooks(value) {
Ok(hooks) => config.hooks = hooks,
Err(e) => {
eprintln!("$config.hooks is not a valid hooks list");
eprintln!("$env.config.{} is not a valid hooks list", key);
eprintln!("{:?}", e);
}
},
@ -374,76 +603,196 @@ impl Value {
if let Ok(b) = value.as_bool() {
config.shell_integration = b;
} else {
eprintln!("$config.shell_integration is not a bool")
eprintln!("$env.config.{} is not a bool", key);
}
}
"buffer_editor" => {
if let Ok(v) = value.as_string() {
config.buffer_editor = v.to_lowercase();
} else {
eprintln!("$config.buffer_editor is not a string")
eprintln!("$env.config.{} is not a string", key);
}
}
"table_index_mode" => {
if let Ok(b) = value.as_string() {
let val_str = b.to_lowercase();
match val_str.as_ref() {
"always" => config.table_index_mode = TableIndexMode::Always,
"never" => config.table_index_mode = TableIndexMode::Never,
"auto" => config.table_index_mode = TableIndexMode::Auto,
_ => eprintln!(
"$config.table_index_mode must be a never, always or auto"
),
}
} else {
eprintln!("$config.table_index_mode is not a string")
}
}
"cd_with_abbreviations" => {
if let Ok(b) = value.as_bool() {
config.cd_with_abbreviations = b;
} else {
eprintln!("$config.cd_with_abbreviations is not a bool")
}
}
"case_sensitive_completions" => {
if let Ok(b) = value.as_bool() {
config.case_sensitive_completions = b;
} else {
eprintln!("$config.case_sensitive_completions is not a bool")
}
}
"enable_external_completion" => {
if let Ok(b) = value.as_bool() {
config.enable_external_completion = b;
} else {
eprintln!("$config.enable_external_completion is not a bool")
}
}
"table_trim" => config.trim_strategy = try_parse_trim_strategy(value, &config)?,
"show_banner" => {
if let Ok(b) = value.as_bool() {
config.show_banner = b;
} else {
eprintln!("$config.show_banner is not a bool")
}
}
"show_clickable_links_in_ls" => {
if let Ok(b) = value.as_bool() {
config.show_clickable_links_in_ls = b;
} else {
eprintln!("$config.show_clickable_links_in_ls is not a bool")
eprintln!("$env.config.{} is not a bool", key);
}
}
"render_right_prompt_on_last_line" => {
if let Ok(b) = value.as_bool() {
config.render_right_prompt_on_last_line = b;
} else {
eprintln!("$config.render_right_prompt_on_last_line is not a bool")
eprintln!("$env.config.{} is not a bool", key);
}
}
// Legacy config options (deprecated as of 2022-11-02)
"use_ls_colors" => {
legacy_options_used = true;
if let Ok(b) = value.as_bool() {
config.use_ls_colors = b;
} else {
eprintln!("$env.config.use_ls_colors is not a bool")
}
}
"rm_always_trash" => {
legacy_options_used = true;
if let Ok(b) = value.as_bool() {
config.rm_always_trash = b;
} else {
eprintln!("$env.config.rm_always_trash is not a bool")
}
}
"history_file_format" => {
legacy_options_used = true;
if let Ok(b) = value.as_string() {
let val_str = b.to_lowercase();
config.history_file_format = match val_str.as_ref() {
"sqlite" => HistoryFileFormat::Sqlite,
"plaintext" => HistoryFileFormat::PlainText,
_ => {
eprintln!(
"unrecognized $env.config.history_file_format '{val_str}'"
);
HistoryFileFormat::PlainText
}
};
} else {
eprintln!("$env.config.history_file_format is not a string")
}
}
"sync_history_on_enter" => {
legacy_options_used = true;
if let Ok(b) = value.as_bool() {
config.sync_history_on_enter = b;
} else {
eprintln!("$env.config.sync_history_on_enter is not a bool")
}
}
"max_history_size" => {
legacy_options_used = true;
if let Ok(i) = value.as_i64() {
config.max_history_size = i;
} else {
eprintln!("$env.config.max_history_size is not an integer")
}
}
"quick_completions" => {
legacy_options_used = true;
if let Ok(b) = value.as_bool() {
config.quick_completions = b;
} else {
eprintln!("$env.config.quick_completions is not a bool")
}
}
"partial_completions" => {
legacy_options_used = true;
if let Ok(b) = value.as_bool() {
config.partial_completions = b;
} else {
eprintln!("$env.config.partial_completions is not a bool")
}
}
"max_external_completion_results" => {
legacy_options_used = true;
if let Ok(i) = value.as_integer() {
config.max_external_completion_results = i;
} else {
eprintln!(
"$env.config.max_external_completion_results is not an integer"
)
}
}
"completion_algorithm" => {
legacy_options_used = true;
if let Ok(v) = value.as_string() {
let val_str = v.to_lowercase();
config.completion_algorithm = match val_str.as_ref() {
// This should match the MatchAlgorithm enum in completions::completion_options
"prefix" => val_str,
"fuzzy" => val_str,
_ => {
eprintln!(
"unrecognized $env.config.completions.algorithm '{val_str}'; expected either 'prefix' or 'fuzzy'"
);
val_str
}
};
} else {
eprintln!("$env.config.completion_algorithm is not a string")
}
}
"case_sensitive_completions" => {
legacy_options_used = true;
if let Ok(b) = value.as_bool() {
config.case_sensitive_completions = b;
} else {
eprintln!("$env.config.case_sensitive_completions is not a bool")
}
}
"enable_external_completion" => {
legacy_options_used = true;
if let Ok(b) = value.as_bool() {
config.enable_external_completion = b;
} else {
eprintln!("$env.config.enable_external_completion is not a bool")
}
}
"external_completer" => {
legacy_options_used = true;
if let Ok(v) = value.as_block() {
config.external_completer = Some(v)
}
}
"table_mode" => {
legacy_options_used = true;
if let Ok(v) = value.as_string() {
config.table_mode = v;
} else {
eprintln!("$env.config.table_mode is not a string")
}
}
"table_trim" => {
legacy_options_used = true;
config.trim_strategy = try_parse_trim_strategy(value, &config)?
}
"show_clickable_links_in_ls" => {
legacy_options_used = true;
if let Ok(b) = value.as_bool() {
config.show_clickable_links_in_ls = b;
} else {
eprintln!("$env.config.show_clickable_links_in_ls is not a bool")
}
}
"cd_with_abbreviations" => {
legacy_options_used = true;
if let Ok(b) = value.as_bool() {
config.cd_with_abbreviations = b;
} else {
eprintln!("$env.config.cd_with_abbreviations is not a bool")
}
}
"filesize_metric" => {
legacy_options_used = true;
if let Ok(b) = value.as_bool() {
config.filesize_metric = b;
} else {
eprintln!("$env.config.filesize_metric is not a bool")
}
}
"filesize_format" => {
legacy_options_used = true;
if let Ok(v) = value.as_string() {
config.filesize_format = v.to_lowercase();
} else {
eprintln!("$env.config.filesize_format is not a string")
}
}
// End legacy options
x => {
eprintln!("$config.{} is an unknown config setting", x)
eprintln!("$env.config.{} is an unknown config setting", x)
}
}
}
@ -451,13 +800,20 @@ impl Value {
eprintln!("$env.config is not a record");
}
if legacy_options_used {
eprintln!(
r#"The format of $env.config has recently changed, and several options have been grouped into sub-records. You may need to update your config.nu file.
Please consult https://www.nushell.sh/blog/2022-11-29-nushell-0.72.html for details. Support for the old format will be removed in an upcoming Nu release."#
);
}
Ok(config)
}
}
fn try_parse_trim_strategy(value: &Value, config: &Config) -> Result<TrimStrategy, ShellError> {
let map = create_map(value, config).map_err(|e| {
eprintln!("$env.config.table_trim is not a record");
eprintln!("$env.config.table.trim is not a record");
e
})?;
@ -467,7 +823,7 @@ fn try_parse_trim_strategy(value: &Value, config: &Config) -> Result<TrimStrateg
None => return Ok(TRIM_STRATEGY_DEFAULT),
},
None => {
eprintln!("$config.table_trim.methodology was not provided");
eprintln!("$env.config.table.trim.methodology was not provided");
return Ok(TRIM_STRATEGY_DEFAULT);
}
};
@ -478,7 +834,7 @@ fn try_parse_trim_strategy(value: &Value, config: &Config) -> Result<TrimStrateg
if let Ok(b) = value.as_bool() {
*try_to_keep_words = b;
} else {
eprintln!("$config.table_trim.wrap_try_keep_words is not a bool");
eprintln!("$env.config.table.trim.wrapping_try_keep_words is not a bool");
}
}
}
@ -487,7 +843,7 @@ fn try_parse_trim_strategy(value: &Value, config: &Config) -> Result<TrimStrateg
if let Ok(v) = value.as_string() {
*suffix = Some(v);
} else {
eprintln!("$config.table_trim.truncating_suffix is not a string")
eprintln!("$env.config.table.trim.truncating_suffix is not a string")
}
}
}
@ -505,9 +861,9 @@ fn try_parse_trim_methodology(value: &Value) -> Option<TrimStrategy> {
});
}
"truncating" => return Some(TrimStrategy::Truncate { suffix: None }),
_ => eprintln!("unrecognized $config.trim_methodology value; expected values ['truncating', 'wrapping']"),
_ => eprintln!("unrecognized $config.table.trim.methodology value; expected either 'truncating' or 'wrapping'"),
},
Err(_) => eprintln!("$config.trim_methodology is not a string"),
Err(_) => eprintln!("$env.config.table.trim.methodology is not a string"),
}
None

View File

@ -243,43 +243,55 @@ let light_theme = {
# The default config record. This is where much of your global configuration is setup.
let-env config = {
external_completer: null # check 'carapace_completer' above to as example
filesize_metric: false # true => (KB, MB, GB), false => (KiB, MiB, GiB)
table_mode: rounded # basic, compact, compact_double, light, thin, with_love, rounded, reinforced, heavy, none, other
use_ls_colors: true
rm_always_trash: false
ls: {
use_ls_colors: true # use the LS_COLORS environment variable to colorize output
clickable_links: true # enable or disable clickable links. Your terminal has to support links.
}
rm: {
always_trash: false # always act as if -t was given. Can be overridden with -p
}
cd: {
abbreviations: true # allows `cd s/o/f` to expand to `cd some/other/folder`
}
table: {
mode: rounded # basic, compact, compact_double, light, thin, with_love, rounded, reinforced, heavy, none, other
index_mode: always # "always" show indexes, "never" show indexes, "auto" = show indexes when a table has "index" column
trim: {
methodology: wrapping # wrapping or truncating
wrapping_try_keep_words: true # A strategy used by the 'wrapping' methodology
truncating_suffix: "..." # A suffix used by the 'truncating' methodology
}
}
history: {
max_size: 10000 # Session has to be reloaded for this to take effect
sync_on_enter: true # Enable to share history between multiple sessions, else you have to close the session to write history to file
file_format: "plaintext" # "sqlite" or "plaintext"
}
completions: {
case_sensitive: false # set to true to enable case-sensitive completions
quick: true # set this to false to prevent auto-selecting completions when only one remains
partial: true # set this to false to prevent partial filling of the prompt
algorithm: "prefix" # prefix or fuzzy
external: {
enable: true # set to false to prevent nushell looking into $env.PATH to find more suggestions, `false` recommended for WSL users as this look up my be very slow
max_results: 100 # setting it lower can improve completion performance at the cost of omitting some options
completer: null # check 'carapace_completer' above as an example
}
}
filesize: {
metric: true # true => KB, MB, GB (ISO standard), false => KiB, MiB, GiB (Windows standard)
format: "auto" # b, kb, kib, mb, mib, gb, gib, tb, tib, pb, pib, eb, eib, zb, zib, auto
}
color_config: $dark_theme # if you want a light theme, replace `$dark_theme` to `$light_theme`
use_grid_icons: true
footer_mode: "25" # always, never, number_of_rows, auto
quick_completions: true # set this to false to prevent auto-selecting completions when only one remains
partial_completions: true # set this to false to prevent partial filling of the prompt
completion_algorithm: "prefix" # prefix, fuzzy
float_precision: 2
# buffer_editor: "emacs" # command that will be used to edit the current line buffer with ctrl+o, if unset fallback to $env.EDITOR and $env.VISUAL
use_ansi_coloring: true
filesize_format: "auto" # b, kb, kib, mb, mib, gb, gib, tb, tib, pb, pib, eb, eib, zb, zib, auto
edit_mode: emacs # emacs, vi
max_history_size: 10000 # Session has to be reloaded for this to take effect
sync_history_on_enter: true # Enable to share the history between multiple sessions, else you have to close the session to persist history to file
history_file_format: "plaintext" # "sqlite" or "plaintext"
shell_integration: true # enables terminal markers and a workaround to arrow keys stop working issue
table_index_mode: always # "always" show indexes, "never" show indexes, "auto" = show indexes when a table has "index" column
cd_with_abbreviations: false # set to true to allow you to do things like cd s/o/f and nushell expand it to cd some/other/folder
case_sensitive_completions: false # set to true to enable case-sensitive completions
enable_external_completion: true # set to false to prevent nushell looking into $env.PATH to find more suggestions, `false` recommended for WSL users as this look up my be very slow
max_external_completion_results: 100 # setting it lower can improve completion performance at the cost of omitting some options
# A strategy of managing table view in case of limited space.
table_trim: {
methodology: wrapping, # truncating
# A strategy which will be used by 'wrapping' methodology
wrapping_try_keep_words: true,
# A suffix which will be used with 'truncating' methodology
# truncating_suffix: "..."
}
show_banner: true # true or false to enable or disable the banner
show_clickable_links_in_ls: true # true or false to enable or disable clickable links in the ls listing. your terminal has to support links.
render_right_prompt_on_last_line: false # true or false to enable or disable right prompt to be rendered on last line of the prompt.
hooks: {
pre_prompt: [{
$nothing # replace with source code to run before the prompt is shown