1
1
mirror of https://github.com/mawww/kakoune.git synced 2024-09-21 01:37:44 +03:00

Merge remote-tracking branch 'laelath/shell-command-completion'

This commit is contained in:
Maxime Coste 2018-10-06 10:47:23 +10:00
commit 5bdcfab018
11 changed files with 43 additions and 29 deletions

View File

@ -291,6 +291,9 @@ New commands can be defined using the *define-command* command:
try command completion on any parameter passed to this command
*-shell-completion*:::
try shell command completion on any parameter passed to this command
*-shell-script-completion*:::
following string is a shell command which takes parameters as
positional params and output one completion candidate per line.
The provided shell command will run after each keypress
@ -305,7 +308,7 @@ New commands can be defined using the *define-command* command:
Position of the cursor inside the token being completed, in bytes
from token start.
*-shell-candidates*:::
*-shell-script-candidates*:::
following string is a shell command which takes parameters as
positional params and output one completion candidate per line.
The provided shell command will run once at the beginning of each

View File

@ -7,7 +7,7 @@ declare-option -docstring "list of paths to tag files to parse when looking up a
str-list ctagsfiles 'tags'
define-command -params ..1 \
-shell-candidates %{
-shell-script-candidates %{
realpath() { ( path=$(readlink "$1"); cd "$(dirname "$1")"; printf "%s/%s\n" "$(pwd -P)" "$(basename "$1")" ) }
eval "set -- $kak_opt_ctagsfiles"
for candidate in "$@"; do

View File

@ -131,7 +131,7 @@ define-command -params 1 -hidden doc-render %{
}
define-command -params 1..2 \
-shell-candidates %{
-shell-script-candidates %{
if [ "$kak_token_to_complete" -eq 0 ]; then
find "${kak_runtime}/doc/" -type f -name "*.asciidoc" | sed 's,.*/,,; s/\.[^/]*$//'
elif [ "$kak_token_to_complete" -eq 1 ]; then

View File

@ -20,10 +20,10 @@ add-highlighter shared/kakrc/shell1 region -recurse '\{' '(^|\h)\K%?%sh\{' '\}'
add-highlighter shared/kakrc/shell2 region -recurse '\(' '(^|\h)\K%?%sh\(' '\)' ref sh
add-highlighter shared/kakrc/shell3 region -recurse '\[' '(^|\h)\K%?%sh\[' '\]' ref sh
add-highlighter shared/kakrc/shell4 region -recurse '<' '(^|\h)\K%?%sh<' '>' ref sh
add-highlighter shared/kakrc/shell5 region -recurse '\{' '(^|\h)\K-shell-(completion|candidates)\h+%\{' '\}' ref sh
add-highlighter shared/kakrc/shell6 region -recurse '\(' '(^|\h)\K-shell-(completion|candidates)\h+%\(' '\)' ref sh
add-highlighter shared/kakrc/shell7 region -recurse '\[' '(^|\h)\K-shell-(completion|candidates)\h+%\[' '\]' ref sh
add-highlighter shared/kakrc/shell8 region -recurse '<' '(^|\h)\K-shell-(completion|candidates)\h+%<' '>' ref sh
add-highlighter shared/kakrc/shell5 region -recurse '\{' '(^|\h)\K-script-(completion|candidates)\h+%\{' '\}' ref sh
add-highlighter shared/kakrc/shell6 region -recurse '\(' '(^|\h)\K-script-(completion|candidates)\h+%\(' '\)' ref sh
add-highlighter shared/kakrc/shell7 region -recurse '\[' '(^|\h)\K-script-(completion|candidates)\h+%\[' '\]' ref sh
add-highlighter shared/kakrc/shell8 region -recurse '<' '(^|\h)\K-script-(completion|candidates)\h+%<' '>' ref sh
evaluate-commands %sh{
# Grammar

View File

@ -51,8 +51,8 @@ define-command -hidden -params 2..3 man-impl %{ evaluate-commands %sh{
} }
define-command -params ..1 \
-shell-candidates %{
find /usr/share/man/ -name '*.[1-8]*' | sed 's,^.*/\(.*\)\.\([1-8][a-zA-Z]*\).*$,\1(\2),'
-shell-script-candidates %{
find /usr/share/man/ -name '*.[1-8]*' | sed 's,^.*/\(.*\)\.\([1-8][a-zA-Z]*\).*$,\1(\2),'
} \
-docstring %{man [<page>]: manpage viewer wrapper
If no argument is passed to the command, the selection will be used as page

View File

@ -27,7 +27,7 @@ define-command -params 1.. \
-docstring %sh{printf 'git [<arguments>]: git wrapping helper
All the optional arguments are forwarded to the git utility
Available commands:\n add\n rm\n blame\n commit\n checkout\n diff\n hide-blame\n hide-diff\n log\n show\n show-diff\n status\n update-diff'} \
-shell-candidates %{
-shell-script-candidates %{
if [ $kak_token_to_complete -eq 0 ]; then
printf "add\nrm\nblame\ncommit\ncheckout\ndiff\nhide-blame\nhide-diff\nlog\nshow\nshow-diff\nstatus\nupdate-diff\n"
else

View File

@ -43,9 +43,7 @@ If no client is passed then the current one is used} \
define-command -docstring %{kitty-repl [<arguments>]: create a new window for repl interaction
All optional parameters are forwarded to the new window} \
-params .. \
-shell-candidates %{
find $(echo $PATH | tr ':' ' ') -mindepth 1 -maxdepth 1 -executable -printf "%f\n"
} \
-shell-completion \
kitty-repl %{ evaluate-commands %sh{
if [ $# -eq 0 ]; then cmd="${SHELL:-/bin/sh}"; else cmd="$*"; fi
kitty @ new-window --no-response --window-type $kak_opt_kitty_window_type --title kak_repl_window --cwd "$PWD" $cmd < /dev/null > /dev/null 2>&1 &

View File

@ -2,7 +2,7 @@
define-command -docstring %{x11-repl [<arguments>]: create a new window for repl interaction
All optional parameters are forwarded to the new window} \
-params .. \
-command-completion \
-shell-completion \
x11-repl %{ evaluate-commands %sh{
if [ -z "${kak_opt_termcmd}" ]; then
echo "echo -markup '{Error}termcmd option is not set'"

View File

@ -1,5 +1,5 @@
def -params 1 -docstring "colorscheme <name>: enable named colorscheme" \
-shell-candidates %{
-shell-script-candidates %{
find -L "${kak_runtime}/colors" "${kak_config}/colors" -type f -name '*\.kak' \
| while read -r filename; do
basename="${filename##*/}"

View File

@ -997,7 +997,7 @@ void define_command(const ParametersParser& parser, Context& context, const Shel
return complete_buffer_name(context, flags, params[token_to_complete], pos_in_token);
};
}
else if (auto shell_cmd_opt = parser.get_switch("shell-completion"))
else if (auto shell_cmd_opt = parser.get_switch("shell-script-completion"))
{
String shell_cmd = shell_cmd_opt->str();
completer = [=](const Context& context, CompletionFlags flags,
@ -1022,7 +1022,7 @@ void define_command(const ParametersParser& parser, Context& context, const Shel
return Completions{ 0_byte, pos_in_token, std::move(candidates) };
};
}
else if (auto shell_cmd_opt = parser.get_switch("shell-candidates"))
else if (auto shell_cmd_opt = parser.get_switch("shell-script-candidates"))
{
String shell_cmd = shell_cmd_opt->str();
Vector<std::pair<String, UsedLetters>, MemoryDomain::Completion> candidates;
@ -1082,6 +1082,15 @@ void define_command(const ParametersParser& parser, Context& context, const Shel
context, flags, params, token_to_complete, pos_in_token);
};
}
else if (parser.get_switch("shell-completion"))
{
completer = [](const Context& context, CompletionFlags flags,
CommandParameters params,
size_t token_to_complete, ByteCount pos_in_token)
{
return shell_complete(context, flags, params[token_to_complete], pos_in_token);
};
}
auto docstring = trim_whitespaces(parser.get_switch("docstring").value_or(StringView{}));
@ -1093,17 +1102,18 @@ const CommandDesc define_command_cmd = {
"def",
"define-command [<switches>] <name> <cmds>: define a command <name> executing <cmds>",
ParameterDesc{
{ { "params", { true, "take parameters, accessible to each shell escape as $0..$N\n"
"parameter should take the form <count> or <min>..<max> (both omittable)" } },
{ "override", { false, "allow overriding an existing command" } },
{ "hidden", { false, "do not display the command in completion candidates" } },
{ "docstring", { true, "define the documentation string for command" } },
{ "file-completion", { false, "complete parameters using filename completion" } },
{ "client-completion", { false, "complete parameters using client name completion" } },
{ "buffer-completion", { false, "complete parameters using buffer name completion" } },
{ "command-completion", { false, "complete parameters using kakoune command completion" } },
{ "shell-completion", { true, "complete parameters using the given shell-script" } },
{ "shell-candidates", { true, "get the parameter candidates using the given shell-script" } } },
{ { "params", { true, "take parameters, accessible to each shell escape as $0..$N\n"
"parameter should take the form <count> or <min>..<max> (both omittable)" } },
{ "override", { false, "allow overriding an existing command" } },
{ "hidden", { false, "do not display the command in completion candidates" } },
{ "docstring", { true, "define the documentation string for command" } },
{ "file-completion", { false, "complete parameters using filename completion" } },
{ "client-completion", { false, "complete parameters using client name completion" } },
{ "buffer-completion", { false, "complete parameters using buffer name completion" } },
{ "command-completion", { false, "complete parameters using kakoune command completion" } },
{ "shell-completion", { false, "complete parameters using shell command completion" } },
{ "shell-script-completion", { true, "complete parameters using the given shell-script" } },
{ "shell-script-candidates", { true, "get the parameter candidates using the given shell-script" } } },
ParameterDesc::Flags::None,
2, 2
},
@ -1828,6 +1838,7 @@ const CommandDesc prompt_cmd = {
{ "client-completion", { false, "use client completion for prompt" } },
{ "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" } },
{ "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
@ -1863,6 +1874,8 @@ const CommandDesc prompt_cmd = {
return CommandManager::instance().complete(
context, flags, prefix, cursor_pos);
};
else if (parser.get_switch("shell-completion"))
completer = shell_complete;
const auto flags = parser.get_switch("password") ?
PromptFlags::Password : PromptFlags::None;

View File

@ -1 +1 @@
def my-command -params 0..1 -shell-candidates %{ printf "aaa\nbbb\nccc" } %{ exec i %arg{1} <esc> }
def my-command -params 0..1 -shell-script-candidates %{ printf "aaa\nbbb\nccc" } %{ exec i %arg{1} <esc> }