on master help sign in
Support multiple arguments for debug configs
9d2f2a9Dmitry Sharshakov
helix-term/src/ui/editor.rs+21−15
@@ -1,6 +1,7 @@
1use crate::{
1use crate::{
2 commands,
2 commands,
3− compositor::{Component, Context, EventResult},
3+ compositor::{Component, Compositor, Context, EventResult},
4+ job::Callback,
4 key,
5 key,
5 keymap::{KeymapResult, Keymaps},
6 keymap::{KeymapResult, Keymaps},
6 ui::{Completion, ProgressSpinners},
7 ui::{Completion, ProgressSpinners},
@@ -709,12 +710,11 @@ impl EditorView {
709 );
710 );
710 }
711 }
711
712
712− fn request_parameter(
713+ fn debug_parameter_prompt(
713 completions: Vec<String>,
714 completions: Vec<String>,
714 config_name: String,
715 config_name: String,
715− cxt: &mut commands::Context,
716 mut params: Vec<String>,
716 mut params: Vec<String>,
717− ) {
717+ ) -> Prompt {
718 let noop = |_input: &str| Vec::new();
718 let noop = |_input: &str| Vec::new();
719 let completer = match completions.get(0).map(|x| x.as_str()) {
719 let completer = match completions.get(0).map(|x| x.as_str()) {
720 Some("filename") => super::completers::filename,
720 Some("filename") => super::completers::filename,
@@ -725,7 +725,7 @@ impl EditorView {
725 }
725 }
726 None => noop,
726 None => noop,
727 };
727 };
728− let prompt = Prompt::new(
728+ Prompt::new(
729 "arg: ".to_owned(),
729 "arg: ".to_owned(),
730 None,
730 None,
731 completer,
731 completer,
@@ -737,13 +737,19 @@ impl EditorView {
737 params.push(input.to_owned());
737 params.push(input.to_owned());
738
738
739 if params.len() < completions.len() {
739 if params.len() < completions.len() {
740− todo!();
740+ let completions = completions.clone();
741− // Self::request_parameter(
741+ let config_name = config_name.clone();
742− // completions.clone(),
742+ let params = params.clone();
743− // config_name.clone(),
743+ let callback = Box::pin(async move {
744− // cxt,
744+ let call: Callback =
745− // params.clone(),
745+ Box::new(move |_editor: &mut Editor, compositor: &mut Compositor| {
746− // );
746+ let prompt =
747+ Self::debug_parameter_prompt(completions, config_name, params);
748+ compositor.push(Box::new(prompt));
749+ });
750+ Ok(call)
751+ });
752+ cx.jobs.callback(callback);
747 } else {
753 } else {
748 commands::dap_start_impl(
754 commands::dap_start_impl(
749 cx.editor,
755 cx.editor,
@@ -753,8 +759,7 @@ impl EditorView {
753 );
759 );
754 }
760 }
755 },
761 },
756− );
762+ )
757− cxt.push_layer(Box::new(prompt));
758 }
763 }
759
764
760 /// Handle events by looking them up in `self.keymaps`. Returns None
765 /// Handle events by looking them up in `self.keymaps`. Returns None
@@ -785,7 +790,8 @@ impl EditorView {
785 let completions = cxt.editor.debug_config_completions.clone().unwrap();
790 let completions = cxt.editor.debug_config_completions.clone().unwrap();
786 let completion = completions.get(i).unwrap().clone();
791 let completion = completions.get(i).unwrap().clone();
787 if !completion.is_empty() {
792 if !completion.is_empty() {
788− Self::request_parameter(completion, name, cxt, Vec::new());
793+ let prompt = Self::debug_parameter_prompt(completion, name, Vec::new());
794+ cxt.push_layer(Box::new(prompt));
789 }
795 }
790 }
796 }
791 _ => return None,
797 _ => return None,
languages.toml+2−2
@@ -173,8 +173,8 @@ args = { mode = "exec", program = "{0}" }
173[[language.debugger.templates]]
173[[language.debugger.templates]]
174name = "test"
174name = "test"
175request = "launch"
175request = "launch"
176−completion = [ "directory" ]
176+completion = [ "directory", "directory" ]
177−args = { mode = "test", program = "{0}" }
177+args = { mode = "test", program = "{0}", output = "{1}" }
178
178
179[[language.debugger.templates]]
179[[language.debugger.templates]]
180name = "attach"
180name = "attach"