@@ -872,34 +872,32 @@ pub(super) fn goto_line_number(
872872 Ok(())
873873}
874874
875+/// Change config at runtime. Access nested values by dot syntax, for
876+/// example to disable smart case search, use `:set search.smart-case false`.
875877fn setting(
876878 cx: &mut compositor::Context,
877879 args: &[Cow<str>],
878880 _event: PromptEvent,
879881) -> anyhow::Result<()> {
880− let runtime_config = &mut cx.editor.config;
881−
882882 if args.len() != 2 {
883883 anyhow::bail!("Bad arguments. Usage: `:set key field`");
884884 }
885−
886885 let (key, arg) = (&args[0].to_lowercase(), &args[1]);
887886
888− match key.as_ref() {
889− "scrolloff" => runtime_config.scrolloff = arg.parse()?,
890− "scroll-lines" => runtime_config.scroll_lines = arg.parse()?,
891− "mouse" => runtime_config.mouse = arg.parse()?,
892− "line-number" => runtime_config.line_number = arg.parse()?,
893− "middle-click_paste" => runtime_config.middle_click_paste = arg.parse()?,
894− "auto-pairs" => runtime_config.auto_pairs = arg.parse()?,
895− "auto-completion" => runtime_config.auto_completion = arg.parse()?,
896− "completion-trigger-len" => runtime_config.completion_trigger_len = arg.parse()?,
897− "auto-info" => runtime_config.auto_info = arg.parse()?,
898− "true-color" => runtime_config.true_color = arg.parse()?,
899− "search.smart-case" => runtime_config.search.smart_case = arg.parse()?,
900− "search.wrap-around" => runtime_config.search.wrap_around = arg.parse()?,
901− _ => anyhow::bail!("Unknown key `{}`.", args[0]),
902− }
887+ let key_error = || anyhow::anyhow!("Unknown key `{key}`");
888+ let field_error = |_| anyhow::anyhow!("Could not parse field `{arg}`");
889+
890+ let mut config = serde_json::to_value(&cx.editor.config).unwrap();
891+ let pointer = format!("/{}", key.replace('.', "/"));
892+ let value = config.pointer_mut(&pointer).ok_or_else(key_error)?;
893+
894+ *value = if value.is_string() {
895+ // JSON strings require quotes, so we can't .parse() directly
896+ serde_json::Value::String(arg.to_string())
897+ } else {
898+ arg.parse().map_err(field_error)?
899+ };
900+ cx.editor.config = serde_json::from_value(config).map_err(field_error)?;
903901
904902 Ok(())
905903}