summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMaxime Coste <mawww@kakoune.org>2019-03-24 19:20:29 +1100
committerMaxime Coste <mawww@kakoune.org>2019-03-24 19:28:46 +1100
commitb531bab1cef58fcebc6c786bd63d6217a135204d (patch)
tree7c68e57fd6bdeaf487a119147befb7ac40daf2db
parent045efdc49ed39f90d4a0be56b3a9e4896533e7e2 (diff)
Add support for -shell-script-* completion in :prompt
Fixes #2754
-rw-r--r--doc/pages/commands.asciidoc9
-rw-r--r--src/commands.cc21
-rw-r--r--test/shell/prompt-shell-script-candidates/cmd1
-rw-r--r--test/shell/prompt-shell-script-candidates/in1
-rw-r--r--test/shell/prompt-shell-script-candidates/out1
-rw-r--r--test/shell/prompt-shell-script-candidates/rc3
-rw-r--r--test/shell/prompt-shell-script-completion/cmd1
-rw-r--r--test/shell/prompt-shell-script-completion/in1
-rw-r--r--test/shell/prompt-shell-script-completion/out1
-rw-r--r--test/shell/prompt-shell-script-completion/rc3
10 files changed, 42 insertions, 0 deletions
diff --git a/doc/pages/commands.asciidoc b/doc/pages/commands.asciidoc
index d4eda26a..8a215e3d 100644
--- a/doc/pages/commands.asciidoc
+++ b/doc/pages/commands.asciidoc
@@ -247,6 +247,15 @@ but not really useful in that context.
will have this command executed whenever the prompt content changes
or the prompt is aborted, respectively.
+ Completion support can be controlled with the same switches provided
+ by the *define-command* command, see
+ <<declaring-new-commands,Declaring new commands>>.
+
+ For *-shell-script-completions* and *-shell-script-candidates*
+ completions, token_to_complete will always be 1, and the full
+ prompt content will be passed as a single token. In other words,
+ word splitting does not take place.
+
*on-key* <command>::
wait for next key from user, then execute <command>, the key is
available through the `key` value, accessible through `$kak_key`
diff --git a/src/commands.cc b/src/commands.cc
index d2809254..31470f8f 100644
--- a/src/commands.cc
+++ b/src/commands.cc
@@ -272,6 +272,21 @@ private:
int m_token = -1;
};
+template<typename Completer>
+struct PromptCompleterAdapter
+{
+ PromptCompleterAdapter(Completer completer) : m_completer{completer} {}
+
+ Completions operator()(const Context& context, CompletionFlags flags,
+ StringView prefix, ByteCount cursor_pos)
+ {
+ return m_completer(context, flags, {String{String::NoCopy{}, prefix}}, 0, cursor_pos);
+ }
+
+private:
+ Completer m_completer;
+};
+
Scope* get_scope_ifp(StringView scope, const Context& context)
{
if (prefix_match("global", scope))
@@ -1862,6 +1877,8 @@ const CommandDesc prompt_cmd = {
{ "buffer-completion", { false, "use buffer completion for prompt" } },
{ "command-completion", { false, "use command completion for prompt" } },
{ "shell-completion", { false, "use shell command completion for prompt" } },
+ { "shell-script-completion", { true, "use shell command completion for prompt" } },
+ { "shell-script-candidates", { true, "use shell command completion for prompt" } },
{ "on-change", { true, "command to execute whenever the prompt changes" } },
{ "on-abort", { true, "command to execute whenever the prompt is canceled" } } },
ParameterDesc::Flags::None, 2, 2
@@ -1899,6 +1916,10 @@ const CommandDesc prompt_cmd = {
};
else if (parser.get_switch("shell-completion"))
completer = shell_complete;
+ else if (auto shell_script = parser.get_switch("shell-script-completion"))
+ completer = PromptCompleterAdapter{ShellScriptCompleter{shell_script->str()}};
+ else if (auto shell_script = parser.get_switch("shell-script-candidates"))
+ completer = PromptCompleterAdapter{ShellCandidatesCompleter{shell_script->str()}};
const auto flags = parser.get_switch("password") ?
PromptFlags::Password : PromptFlags::None;
diff --git a/test/shell/prompt-shell-script-candidates/cmd b/test/shell/prompt-shell-script-candidates/cmd
new file mode 100644
index 00000000..7cc38390
--- /dev/null
+++ b/test/shell/prompt-shell-script-candidates/cmd
@@ -0,0 +1 @@
+:foo<ret>b<tab><tab><ret>
diff --git a/test/shell/prompt-shell-script-candidates/in b/test/shell/prompt-shell-script-candidates/in
new file mode 100644
index 00000000..8b137891
--- /dev/null
+++ b/test/shell/prompt-shell-script-candidates/in
@@ -0,0 +1 @@
+
diff --git a/test/shell/prompt-shell-script-candidates/out b/test/shell/prompt-shell-script-candidates/out
new file mode 100644
index 00000000..5716ca59
--- /dev/null
+++ b/test/shell/prompt-shell-script-candidates/out
@@ -0,0 +1 @@
+bar
diff --git a/test/shell/prompt-shell-script-candidates/rc b/test/shell/prompt-shell-script-candidates/rc
new file mode 100644
index 00000000..6aaaf259
--- /dev/null
+++ b/test/shell/prompt-shell-script-candidates/rc
@@ -0,0 +1,3 @@
+define-command foo %{
+ prompt -shell-script-candidates %{ printf 'foo\nbar\nhaz\n' } ': ' %{exec i %val{text} <esc>}
+}
diff --git a/test/shell/prompt-shell-script-completion/cmd b/test/shell/prompt-shell-script-completion/cmd
new file mode 100644
index 00000000..7cc38390
--- /dev/null
+++ b/test/shell/prompt-shell-script-completion/cmd
@@ -0,0 +1 @@
+:foo<ret>b<tab><tab><ret>
diff --git a/test/shell/prompt-shell-script-completion/in b/test/shell/prompt-shell-script-completion/in
new file mode 100644
index 00000000..8b137891
--- /dev/null
+++ b/test/shell/prompt-shell-script-completion/in
@@ -0,0 +1 @@
+
diff --git a/test/shell/prompt-shell-script-completion/out b/test/shell/prompt-shell-script-completion/out
new file mode 100644
index 00000000..257cc564
--- /dev/null
+++ b/test/shell/prompt-shell-script-completion/out
@@ -0,0 +1 @@
+foo
diff --git a/test/shell/prompt-shell-script-completion/rc b/test/shell/prompt-shell-script-completion/rc
new file mode 100644
index 00000000..3fd111ba
--- /dev/null
+++ b/test/shell/prompt-shell-script-completion/rc
@@ -0,0 +1,3 @@
+define-command foo %{
+ prompt -shell-script-completion %{ printf 'foo\nbar\nhaz\n' } ': ' %{exec i %val{text} <esc>}
+}