on master help sign in
Customized completion for template parameters
94901b8Dmitry Sharshakov
helix-dap/src/types.rs+1
@@ -7,6 +7,7 @@ use std::{collections::HashMap, path::PathBuf};
7pub struct DebugTemplate {
7pub struct DebugTemplate {
8 pub name: String,
8 pub name: String,
9 pub request: String,
9 pub request: String,
10+ pub completion: Option<Vec<String>>,
10 pub args: HashMap<String, String>,
11 pub args: HashMap<String, String>,
11}
12}
12
13
helix-term/src/commands.rs+7
@@ -4630,6 +4630,13 @@ fn dap_launch(cx: &mut Context) {
4630 };
4630 };
4631
4631
4632 cx.editor.debug_config_picker = Some(config.templates.iter().map(|t| t.name.clone()).collect());
4632 cx.editor.debug_config_picker = Some(config.templates.iter().map(|t| t.name.clone()).collect());
4633+ cx.editor.debug_config_completions = Some(
4634+ config
4635+ .templates
4636+ .iter()
4637+ .map(|t| t.completion.clone())
4638+ .collect(),
4639+ );
4633}
4640}
4634
4641
4635fn dap_toggle_breakpoint(cx: &mut Context) {
4642fn dap_toggle_breakpoint(cx: &mut Context) {
helix-term/src/ui/editor.rs+20−3
@@ -25,6 +25,7 @@ use helix_view::{
25 keyboard::{KeyCode, KeyModifiers},
25 keyboard::{KeyCode, KeyModifiers},
26 Document, Editor, Theme, View,
26 Document, Editor, Theme, View,
27};
27};
28+use log::warn;
28use std::borrow::Cow;
29use std::borrow::Cow;
29
30
30use crossterm::event::{Event, MouseButton, MouseEvent, MouseEventKind};
31use crossterm::event::{Event, MouseButton, MouseEvent, MouseEventKind};
@@ -729,14 +730,30 @@ impl EditorView {
729 code: KeyCode::Char(char),
730 code: KeyCode::Char(char),
730 ..
731 ..
731 } => {
732 } => {
732− let name = match picker.iter().find(|t| t.starts_with(char)) {
733+ let (i, name) = match picker.iter().position(|t| t.starts_with(char)) {
733− Some(n) => n.clone(),
734+ Some(pos) => (pos, picker.get(pos).unwrap().clone()),
734 None => return None,
735 None => return None,
735 };
736 };
737+ let completions = cxt.editor.debug_config_completions.clone().unwrap();
738+ let noop = |_input: &str| Vec::new();
739+ let completer = match completions.get(i) {
740+ Some(Some(completion)) => {
741+ match completion.get(0).and_then(|x| Some(x.as_str())) {
742+ Some("filename") => super::completers::filename,
743+ Some("directory") => super::completers::directory,
744+ Some(complete) => {
745+ warn!("Unknown debug config autocompleter: {}", complete);
746+ noop
747+ }
748+ None => noop,
749+ }
750+ }
751+ _ => noop,
752+ };
736 let prompt = Prompt::new(
753 let prompt = Prompt::new(
737 "arg:".to_owned(),
754 "arg:".to_owned(),
738 None,
755 None,
739− super::completers::filename,
756+ completer,
740 move |cx: &mut crate::compositor::Context,
757 move |cx: &mut crate::compositor::Context,
741 input: &str,
758 input: &str,
742 event: PromptEvent| {
759 event: PromptEvent| {
helix-view/src/editor.rs+2
@@ -77,6 +77,7 @@ pub struct Editor {
77 pub debugger: Option<helix_dap::Client>,
77 pub debugger: Option<helix_dap::Client>,
78 pub debugger_events: SelectAll<UnboundedReceiverStream<helix_dap::Payload>>,
78 pub debugger_events: SelectAll<UnboundedReceiverStream<helix_dap::Payload>>,
79 pub debug_config_picker: Option<Vec<String>>,
79 pub debug_config_picker: Option<Vec<String>>,
80+ pub debug_config_completions: Option<Vec<Option<Vec<String>>>>,
80 pub variables: Option<Vec<String>>,
81 pub variables: Option<Vec<String>>,
81 pub variables_page: usize,
82 pub variables_page: usize,
82
83
@@ -120,6 +121,7 @@ impl Editor {
120 debugger: None,
121 debugger: None,
121 debugger_events: SelectAll::new(),
122 debugger_events: SelectAll::new(),
122 debug_config_picker: None,
123 debug_config_picker: None,
124+ debug_config_completions: None,
123 variables: None,
125 variables: None,
124 variables_page: 0,
126 variables_page: 0,
125 syn_loader: config_loader,
127 syn_loader: config_loader,
languages.toml+6
@@ -30,6 +30,7 @@ port-arg = "-p {}"
30[[language.debugger.templates]]
30[[language.debugger.templates]]
31name = "binary"
31name = "binary"
32request = "launch"
32request = "launch"
33+completion = [ "filename" ]
33args = { console = "internalConsole", program = "{0}" }
34args = { console = "internalConsole", program = "{0}" }
34
35
35[[language.debugger.templates]]
36[[language.debugger.templates]]
@@ -97,6 +98,7 @@ port-arg = "-p {}"
97[[language.debugger.templates]]
98[[language.debugger.templates]]
98name = "binary"
99name = "binary"
99request = "launch"
100request = "launch"
101+completion = [ "filename" ]
100args = { console = "internalConsole", program = "{0}" }
102args = { console = "internalConsole", program = "{0}" }
101
103
102[[language.debugger.templates]]
104[[language.debugger.templates]]
@@ -125,6 +127,7 @@ port-arg = "-p {}"
125[[language.debugger.templates]]
127[[language.debugger.templates]]
126name = "binary"
128name = "binary"
127request = "launch"
129request = "launch"
130+completion = [ "filename" ]
128args = { console = "internalConsole", program = "{0}" }
131args = { console = "internalConsole", program = "{0}" }
129
132
130[[language.debugger.templates]]
133[[language.debugger.templates]]
@@ -155,16 +158,19 @@ port-arg = "-l 127.0.0.1:{}"
155[[language.debugger.templates]]
158[[language.debugger.templates]]
156name = "source"
159name = "source"
157request = "launch"
160request = "launch"
161+completion = [ "filename" ]
158args = { mode = "debug", program = "{0}" }
162args = { mode = "debug", program = "{0}" }
159
163
160[[language.debugger.templates]]
164[[language.debugger.templates]]
161name = "binary"
165name = "binary"
162request = "launch"
166request = "launch"
167+completion = [ "filename" ]
163args = { mode = "exec", program = "{0}" }
168args = { mode = "exec", program = "{0}" }
164
169
165[[language.debugger.templates]]
170[[language.debugger.templates]]
166name = "test"
171name = "test"
167request = "launch"
172request = "launch"
173+completion = [ "directory" ]
168args = { mode = "test", program = "{0}" }
174args = { mode = "test", program = "{0}" }
169
175
170[[language.debugger.templates]]
176[[language.debugger.templates]]