Как узнать, на что сопоставлен ключ?

13

Я знаю, что выполнение :mapкоманд без аргументов должно дать мне список пользовательских отображений, но, например, когда я нажимаю Ctrl-W, Ctrl-I что-то происходит, но я не знаю, какая функция была только что реализована как встроенные отображения не появляются в :mapкомандах.

Как мне узнать, что делает ключ?

Безумный вомбат
источник
Возможно Как мне перейти к темам в документации Vim? полезно ;-)
Мартин Турной
На самом деле, нет. В emacs я могу нажать Ctrl-H k, нажав клавишу, о которой я хочу знать, и она даст мне информацию о привязке. Vim, кажется, не хватает этой функции. Как мне узнать, на какую карту назначена конкретная комбинация клавиш?
Безумный Вомбат
Вы читали помеченный дубликат? Потому что это говорит вам о том, как запросить справочную систему Vim для получения этой информации (элемент списка № 8): :help CTRL-W_CTRL-Iили:help CTRL-W_i
Мартин Турной
2
Я проголосовал за повторное открытие, потому что форма вопроса после редактирования имеет полезный ответ («: map <Keys> для печати активных сопоставлений»), чем то, что содержится в дубликате, связанном в настоящее время, о справочной навигации.
1
Но ОП, похоже, знает, что это его первая фраза. Было бы неплохо, чтобы Vim имел способ показать (аналогичным образом) все неотображенные ключи, то есть то, что они делают по умолчанию.
VanLaser

Ответы:

10

Ты не можешь

Вот исходный код C для того, что <C-w><C-i>делает:

normal.c:

/*
 * This table contains one entry for every Normal or Visual mode command.
 * The order doesn't matter, init_normal_cmds() will create a sorted index.
 * It is faster when all keys from zero to '~' are present.
 */
static const struct nv_cmd
{
    int         cmd_char;       /* (first) command character */
    nv_func_T   cmd_func;       /* function for this command */
    short_u     cmd_flags;      /* NV_ flags */
    short       cmd_arg;        /* value for ca.arg */
} nv_cmds[] =
{

[...]

    {Ctrl_W,    nv_window,      0,                      0},
};

[...]

/*
 * CTRL-W: Window commands
 */
    static void
nv_window(cmdarg_T *cap)
{
    if (!checkclearop(cap->oap))
        do_window(cap->nchar, cap->count0, NUL); /* everything is in window.c */
}

window.c:

/*
 * all CTRL-W window commands are handled here, called from normal_cmd().
 */
    void
do_window(
[..]
) {
    switch (nchar)
    {
[..]
    case 'i':                       /* Go to any match */
    case Ctrl_I:
                type = FIND_ANY;
                /* FALLTHROUGH */

[..]
    default:    beep_flush();
                break;

Я не совсем уверен, где typeберется переменная, мне не хотелось это искать, но дело в том, что нет реальной возможности сказать «этот ключ сопоставлен с этой функциональностью». По сути, это просто a, structкоторый отображает a charв функцию, а реализация второго нажатия клавиши ( <C-i>) - просто случайное уродство!

Это отличается от Emacs, где (я полагаю) все находится в Лиспе, и ваши пользовательские отображения ничем не отличаются от стандартных отображений Emacs. Но в Vim у вас есть «магические» отображения, предоставляемые кодом C, которые сопоставляются с функциями C, которые никогда не отображаются в Vim. Я всегда говорю, что Vim имеет лучшую идею, но Emacs имеет лучшую реализацию ;-)

Таким образом, единственный способ - найти его в файлах справки. Вот почему я закрыл это как дубликат « Как перейти к темам в документации Vim», так как это единственный практический ответ, который может дать каждый. Можно действительно утверждать, что можно было бы дать более глубокое объяснение этого вопроса (как я только что сделал), и если бы вы утверждали, что вместо ответа (теперь удаленного) я, вероятно, сказал бы «вы» прав, извините за ошибку "и заново открыл ее ;-)

В любом случае, чтобы кратко проиллюстрировать условные обозначения на нескольких примерах:

  • :help w- отображение нормального режима для w(с учетом регистра);
  • :help g8- отображение нормального режима для g8;
  • :help v_o- отображение визуального режима для o; другие режимы cдля командной строки и iдля вставки;
  • :help CTRL-W- отображение нормального режима для <C-w>;
  • :help i_CTRL-W- вставить режим отображения для <C-w>;
  • :help CTRL-W_CTRL-I- отображение нормального режима для <C-w><C-i>;
  • :help i_CTRL-G_<Down>- вставить режим отображения для <C-g><Down>.
Мартин Турной
источник
1
Один важный момент: справка, которая, кажется, всегда не учитывается, - это то, что вызывается commandline completionв vim help с использованием CTRL-D (я называю это «поиск в справке»). Введите :h CTRL-Wзатем нажмите <CTRL-D>, и вы получите список всех команд , содержащих строку «CTRL-W», например, CTRL-W, CTRL-W_^, CTRL-W-<Down>, .... Наберите :h g8<CTRL-D>и вы увидите g8и в 8g8качестве доступных предметов справки. Без этого вы должны точно ввести тему справки, и найти точную строку, которая работает, сложно.
JESii
1

Я думаю, что вы можете получить сопоставления с помощью следующих команд

:nmap - Mapping on normal mode
:cmap - Mapping on command mode
:vmap - Mapping on visual mode

Надеюсь, это поможет!

Дэвид Ю
источник
2
Я не думаю, что это поможет из-за первых нескольких слов первой строки вопроса.