Як дізнатися, для чого відображений ключ?


13

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

Як дізнатися, що робить ключ?



Не зовсім. У emacs я можу зайти Ctrl-H k натиснути клавішу, про яку я хочу знати, і вона дасть мені обов'язкову інформацію. Віму, здається, не вистачає цієї функції. Як дізнатися, на яку карту поєднується певна комбінація клавіш?
Mad Wombat

Ви читали позначений дублікат? Тому що це говорить про те, як запитувати довідкову систему Vim на цю інформацію (пункт списку № 8): :help CTRL-W_CTRL-Iабо:help CTRL-W_i
Martin Tournoij

2
Я проголосував за повторне відкриття, тому що форма запитання після редагування має корисну іншу відповідь (": карта <Ключі> для друку активних відображень"), ніж те, що є у пов'язаному на даний момент дублікаті про навігацію довідки.

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змінна потрапляє, мені не здавалося, що я шукаю це, але справа в тому, що немає реальної можливості сказати "цей ключ відображений у цій функціональності". По суті, це лише те, structщо відображає функцію chara, а реалізація другого натискання клавіш ( <C-i>) - це просто спеціальне неподобство!

Це відрізняється від Emacs, де (я припускаю) все є в Lisp, а ваші власні відображення нічим не відрізняються від відображень за замовчуванням 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 за допомогою 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
Я не думаю, що це допоможе через перші кілька слів першого рядка питання.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.