@@ -8,7 +8,6 @@ use super::*;
8use helix_core::{encoding, shellwords::Shellwords};
8use helix_core::{encoding, shellwords::Shellwords};
9use helix_view::document::DEFAULT_LANGUAGE_NAME;
9use helix_view::document::DEFAULT_LANGUAGE_NAME;
10use helix_view::editor::{Action, CloseError, ConfigEvent};
10use helix_view::editor::{Action, CloseError, ConfigEvent};
11−use serde_json::Value;
12use ui::completers::{self, Completer};
11use ui::completers::{self, Completer};
14#[derive(Clone)]
13#[derive(Clone)]
@@ -1790,8 +1789,8 @@ fn toggle_option(
1790 return Ok(());
1789 return Ok(());
1793− if args.len() != 1 {
1792+ if args.is_empty() {
1794− anyhow::bail!("Bad arguments. Usage: `:toggle key`");
1793+ anyhow::bail!("Bad arguments. Usage: `:toggle key [values]?`");
1796 let key = &args[0].to_lowercase();
1795 let key = &args[0].to_lowercase();
@@ -1801,22 +1800,48 @@ fn toggle_option(
1801 let pointer = format!("/{}", key.replace('.', "/"));
1800 let pointer = format!("/{}", key.replace('.', "/"));
1802 let value = config.pointer_mut(&pointer).ok_or_else(key_error)?;
1801 let value = config.pointer_mut(&pointer).ok_or_else(key_error)?;
1804− let Value::Bool(old_value) = *value else {
1803+ *value = match value.as_bool() {
1805− anyhow::bail!("Key `{}` is not toggle-able", key)
1804+ Some(value) => {
1807+ "Bad arguments. For boolean configurations use: `:toggle key`"
1809+ serde_json::Value::Bool(!value)
1814+ "Bad arguments. For non-boolean configurations use: `:toggle key val1 val2 ...`",
1818+ "Bad configuration. Cannot cycle non-string configurations"
1823+ .expect("programming error: should have been ensured before");
1825+ serde_json::Value::String(
1828+ .skip_while(|e| *e != value)
1830+ .unwrap_or_else(|| &args[1])
1808− let new_value = !old_value;
1836+ let status = format!("'{key}' is now set to {value}");
1809− *value = Value::Bool(new_value);
1810− // This unwrap should never fail because we only replace one boolean value
1811− // with another, maintaining a valid json config
1812− let config = serde_json::from_value(config).unwrap();
1837+ let config = serde_json::from_value(config)
1838+ .map_err(|_| anyhow::anyhow!("Could not parse field: `{:?}`", &args))?;
1814 cx.editor
1840 cx.editor
1815 .config_events
1841 .config_events
1817 .send(ConfigEvent::Update(config))?;
1843 .send(ConfigEvent::Update(config))?;
1818− cx.editor
1844+ cx.editor.set_status(status);
1819− .set_status(format!("Option `{}` is now set to `{}`", key, new_value));