# HG changeset patch # User Christian Brabandt # Date 1704404704 -3600 # Node ID a197265a2e0723735b156b12938b869a736f55d5 # Parent ffbe5109233f058e215d9272a5a38817733620b8 patch 9.1.0010: Keymap completion is not available Commit: https://github.com/vim/vim/commit/81642d9d6ff5cd6a90a012b1b98632ce51eeb1a8 Author: Doug Kearns Date: Thu Jan 4 22:37:44 2024 +0100 patch 9.1.0010: Keymap completion is not available Problem: Keymap completion is not available Solution: Add keymap completion (Doug Kearns) Add keymap completion to the 'keymap' option, user commands and builtin completion functions. closes: #13692 Signed-off-by: Doug Kearns Signed-off-by: Christian Brabandt diff --git a/runtime/doc/builtin.txt b/runtime/doc/builtin.txt --- a/runtime/doc/builtin.txt +++ b/runtime/doc/builtin.txt @@ -1,4 +1,4 @@ -*builtin.txt* For Vim version 9.1. Last change: 2023 Dec 24 +*builtin.txt* For Vim version 9.1. Last change: 2024 Jan 04 VIM REFERENCE MANUAL by Bram Moolenaar @@ -3570,6 +3570,7 @@ getcompletion({pat}, {type} [, {filtered help help subjects highlight highlight groups history |:history| suboptions + keymap keyboard mappings locale locale names (as output of locale -a) mapclear buffer argument mapping mapping name diff --git a/runtime/doc/map.txt b/runtime/doc/map.txt --- a/runtime/doc/map.txt +++ b/runtime/doc/map.txt @@ -1,4 +1,4 @@ -*map.txt* For Vim version 9.1. Last change: 2023 December 31 +*map.txt* For Vim version 9.1. Last change: 2024 Jan 04 VIM REFERENCE MANUAL by Bram Moolenaar @@ -1631,6 +1631,7 @@ completion can be enabled: -complete=help help subjects -complete=highlight highlight groups -complete=history :history suboptions + -complete=keymap keyboard mappings -complete=locale locale names (as output of locale -a) -complete=mapclear buffer argument -complete=mapping mapping name diff --git a/src/cmdexpand.c b/src/cmdexpand.c --- a/src/cmdexpand.c +++ b/src/cmdexpand.c @@ -50,6 +50,7 @@ cmdline_fuzzy_completion_supported(expan && xp->xp_context != EXPAND_FILES_IN_PATH && xp->xp_context != EXPAND_FILETYPE && xp->xp_context != EXPAND_HELP + && xp->xp_context != EXPAND_KEYMAP && xp->xp_context != EXPAND_OLD_SETTING && xp->xp_context != EXPAND_STRING_SETTING && xp->xp_context != EXPAND_SETTING_SUBTRACT @@ -1394,6 +1395,7 @@ addstar( || context == EXPAND_COMPILER || context == EXPAND_OWNSYNTAX || context == EXPAND_FILETYPE + || context == EXPAND_KEYMAP || context == EXPAND_PACKADD || context == EXPAND_RUNTIME || ((context == EXPAND_TAGS_LISTFILES @@ -3131,6 +3133,13 @@ ExpandFromContext( char *directories[] = {"syntax", "indent", "ftplugin", NULL}; return ExpandRTDir(pat, 0, numMatches, matches, directories); } +#ifdef FEAT_KEYMAP + if (xp->xp_context == EXPAND_KEYMAP) + { + char *directories[] = {"keymap", NULL}; + return ExpandRTDir(pat, 0, numMatches, matches, directories); + } +#endif #if defined(FEAT_EVAL) if (xp->xp_context == EXPAND_USER_LIST) return ExpandUserList(xp, matches, numMatches); diff --git a/src/option.c b/src/option.c --- a/src/option.c +++ b/src/option.c @@ -7412,6 +7412,13 @@ set_context_in_set_cmd( xp->xp_context = EXPAND_FILETYPE; return; } +#ifdef FEAT_KEYMAP + if (options[opt_idx].var == (char_u *)&p_keymap) + { + xp->xp_context = EXPAND_KEYMAP; + return; + } +#endif // Now pick. If the option has a custom expander, use that. Otherwise, just // fill with the existing option value. diff --git a/src/testdir/test_cmdline.vim b/src/testdir/test_cmdline.vim --- a/src/testdir/test_cmdline.vim +++ b/src/testdir/test_cmdline.vim @@ -545,6 +545,13 @@ func Test_getcompletion() let l = getcompletion('horse', 'filetype') call assert_equal([], l) + if has('keymap') + let l = getcompletion('acc', 'keymap') + call assert_true(index(l, 'accents') >= 0) + let l = getcompletion('nullkeymap', 'keymap') + call assert_equal([], l) + endif + let l = getcompletion('z', 'syntax') call assert_true(index(l, 'zimbu') >= 0) let l = getcompletion('emacs', 'syntax') diff --git a/src/testdir/test_options.vim b/src/testdir/test_options.vim --- a/src/testdir/test_options.vim +++ b/src/testdir/test_options.vim @@ -435,6 +435,14 @@ func Test_set_completion() call assert_equal('"set syntax=sshdconfig', @:) call feedkeys(":set syntax=a\\\"\", 'xt') call assert_equal('"set syntax=' .. getcompletion('a*', 'syntax')->join(), @:) + + if has('keymap') + " Expand values for 'keymap' + call feedkeys(":set keymap=acc\\\"\", 'xt') + call assert_equal('"set keymap=accents', @:) + call feedkeys(":set keymap=a\\\"\", 'xt') + call assert_equal('"set keymap=' .. getcompletion('a*', 'keymap')->join(), @:) + endif endfunc " Test handling of expanding individual string option values diff --git a/src/usercmd.c b/src/usercmd.c --- a/src/usercmd.c +++ b/src/usercmd.c @@ -73,6 +73,9 @@ static struct {EXPAND_HELP, "help"}, {EXPAND_HIGHLIGHT, "highlight"}, {EXPAND_HISTORY, "history"}, +#if defined(FEAT_KEYMAP) + {EXPAND_KEYMAP, "keymap"}, +#endif #if defined(HAVE_LOCALE_H) || defined(X_LOCALE) {EXPAND_LOCALES, "locale"}, #endif diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -705,6 +705,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 10, +/**/ 9, /**/ 8, diff --git a/src/vim.h b/src/vim.h --- a/src/vim.h +++ b/src/vim.h @@ -841,6 +841,7 @@ extern int (*dyn_libintl_wputenv)(const #define EXPAND_SETTING_SUBTRACT 55 #define EXPAND_ARGOPT 56 #define EXPAND_TERMINALOPT 57 +#define EXPAND_KEYMAP 58 // Values for exmode_active (0 is no exmode) #define EXMODE_NORMAL 1