From 6b84344e205a07261faae4f85f28175401fa7414 Mon Sep 17 00:00:00 2001 From: A-Walrus <58790821+A-Walrus@users.noreply.github.com> Date: Sat, 6 Aug 2022 20:16:18 +0300 Subject: [PATCH] Add completion for nested settings (#3183) Co-authored-by: Michael Davis --- helix-term/src/ui/mod.rs | 26 ++++++++++++++++++++------ 1 file changed, 20 insertions(+), 6 deletions(-) diff --git a/helix-term/src/ui/mod.rs b/helix-term/src/ui/mod.rs index 257608f0..113bc486 100644 --- a/helix-term/src/ui/mod.rs +++ b/helix-term/src/ui/mod.rs @@ -283,14 +283,28 @@ pub mod completers { names } + /// Recursive function to get all keys from this value and add them to vec + fn get_keys(value: &serde_json::Value, vec: &mut Vec, scope: Option<&str>) { + if let Some(map) = value.as_object() { + for (key, value) in map.iter() { + let key = match scope { + Some(scope) => format!("{}.{}", scope, key), + None => key.clone(), + }; + get_keys(value, vec, Some(&key)); + if !value.is_object() { + vec.push(key); + } + } + } + } + pub fn setting(_editor: &Editor, input: &str) -> Vec { static KEYS: Lazy> = Lazy::new(|| { - serde_json::json!(Config::default()) - .as_object() - .unwrap() - .keys() - .cloned() - .collect() + let mut keys = Vec::new(); + let json = serde_json::json!(Config::default()); + get_keys(&json, &mut keys, None); + keys }); let matcher = Matcher::default();