Make <c-n> show completion menu again when autocomplete is off

As pointed out in [1], when insert mode autocomplete is disabled,
<c-n> could be used to activate insert mode completions temporarily
[2].  This regressed in 6f7c5aed (Do not show custom completions when
autocomplete is off, 2022-01-03). Fix this by enabling completions
on <c-n>/<c-p>. This allows us to remove a special case for explicit
completers.

Alternative behavior (future?): make <c-n> toggle completion like
<c-o>.  This can be done today, as suggested by Screwtape on IRC:

	map global insert <c-n> %{<c-o><c-n><a-;>:toggle-ctrl-n<ret>}
	define-command toggle-ctrl-n %{
		hook global InsertCompletionShow .* %{ map window insert <c-n> <c-n> }
		hook global InsertCompletionHide .* %{ unmap window insert <c-n> <c-n> }
	}

[1] https://github.com/mawww/kakoune/pull/4493#issuecomment-1031189823
[2] <c-n> completion only lives for the lifetime of the completion
    menu, whereas <c-o> lasts until you exit insert mode. This means
    that autocompletion is much more convenient than <c-n> or <c-x>f,
    because those require an explicit completion request for each
    path component.
This commit is contained in:
Johannes Altmanninger 2022-02-07 13:31:56 +01:00
parent a4953c59ce
commit 43fc5b0078
5 changed files with 11 additions and 6 deletions

View File

@ -414,6 +414,7 @@ InsertCompleter::~InsertCompleter()
void InsertCompleter::select(int index, bool relative, Vector<Key>& keystrokes) void InsertCompleter::select(int index, bool relative, Vector<Key>& keystrokes)
{ {
m_enabled = true;
if (not setup_ifn()) if (not setup_ifn())
return; return;
@ -461,7 +462,7 @@ void InsertCompleter::select(int index, bool relative, Vector<Key>& keystrokes)
void InsertCompleter::update(bool allow_implicit) void InsertCompleter::update(bool allow_implicit)
{ {
m_enabled = allow_implicit or m_explicit_completer; m_enabled = allow_implicit;
if (m_explicit_completer and try_complete(m_explicit_completer)) if (m_explicit_completer and try_complete(m_explicit_completer))
return; return;

View File

@ -1,3 +1,4 @@
a2 a2
a3
./ui-in ./ui-in

View File

@ -1,6 +1,8 @@
set-option global autocomplete prompt set-option global autocomplete prompt
declare-option -hidden completions line1_completions declare-option -hidden completions line1_completions
declare-option -hidden completions line2_completions declare-option -hidden completions line2_completions
set-option global completers option=line1_completions option=line2_completions declare-option -hidden completions line3_completions
set-option global completers option=line1_completions option=line2_completions option=line3_completions
set-option global line1_completions "1.1+0@%val(timestamp)" "a1||a1" set-option global line1_completions "1.1+0@%val(timestamp)" "a1||a1"
set-option global line2_completions "2.1+0@%val(timestamp)" "a2||a2" set-option global line2_completions "2.1+0@%val(timestamp)" "a2||a2"
set-option global line3_completions "3.1+0@%sh{echo $(($kak_timestamp+1))}" "a3||a3"

View File

@ -1,10 +1,10 @@
ui_out -ignore 4 ui_out -ignore 4
ui_in '{ "jsonrpc": "2.0", "method": "keys", "params": [ "i" ] }' ui_in '{ "jsonrpc": "2.0", "method": "keys", "params": [ "i" ] }'
sleep .2 # trigger insert completion auto update sleep .2 # trigger insert completion auto update
# Implicit completion is disabled via autocomplete. # Implicit completion can be toggled with <c-o>.
ui_in '{ "jsonrpc": "2.0", "method": "keys", "params": [ "<c-n><esc>" ] }' ui_in '{ "jsonrpc": "2.0", "method": "keys", "params": [ "<esc>ji<c-o><c-n><esc>" ] }'
# Implicit completion can be toggled. # Implicit completion can be toggled with <c-n>.
ui_in '{ "jsonrpc": "2.0", "method": "keys", "params": [ "ji<c-o><c-n><esc>" ] }' ui_in '{ "jsonrpc": "2.0", "method": "keys", "params": [ "ji<c-n><esc>" ] }'
# Explicit completion still works. # Explicit completion still works.
ui_in '{ "jsonrpc": "2.0", "method": "keys", "params": [ "ji./ui-<c-x>f<c-n>" ] }' ui_in '{ "jsonrpc": "2.0", "method": "keys", "params": [ "ji./ui-<c-x>f<c-n>" ] }'