Сопоставление клавиш цифровой клавиатуры в vim

Я не могу заставить это сопоставление работать в vim внутри терминала xterm.

:map <k0> :echo 'Hello'<CR>

Я могу заставить то же самое сопоставление работать нормально в gvim. Если я выполню указанную выше команду в vim на терминале, он примет ее и правильно отобразится, когда я наберу :map. Но в обычном режиме, если я нажимаю клавишу клавиатуры 0, в строке состояния появляется «0», а затем исчезает при следующем нажатии клавиши.

Я использую vim, поставляемый с Fedora 14, если это имеет значение, и обычный xterm. Клавиши клавиатуры отлично работают в режиме вставки, как с включенным, так и с выключенным цифровым замком.

Что мне не хватает?


person PonyEars    schedule 08.09.2011    source источник


Ответы (2)


Попробуйте добавить эту строку в свой ~/.Xdefaults:

xterm*appkeypadDefault: false

и перезапустите xterm.

«Режим клавиатуры приложения», вероятно, является причиной ваших проблем.

Но я не думаю, что вы должны делать то, что вы делаете. В режиме --NORMAL-- числовой ввод используется для указания «количества», как в 4dd. Сопоставление чисел с другими командами быстро приведет к проблемам.

Вы должны добавить тег xterm к своему вопросу.

person romainl    schedule 08.09.2011
comment
Хм, спасибо, но это не сработало. Кроме того, «false» — это значение по умолчанию для xtermappkeypadDefault, как показано на справочной странице xterm. Я использовал vim для всего более десяти лет, и я никогда не использовал свою *клавиатуру для указания повторений (не нужно отрывать руки от исходного положения, что является одним из преимуществ vim). Так что я в порядке с отображением клавиатуры. - person PonyEars; 09.09.2011

В вопросе есть некоторая двусмысленность, которая может указывать на реальную проблему. vim принимает эту привязку для k0, предполагая, что это функциональная клавиша.

Большинство клавиатур, которые вы видите, нумеруются функциональными клавишами, начинающимися с 1, и в некоторых описаниях терминалов функциональная клавиша 1 приравнивается к k0, а некоторые приравнивают ее k0 к функциональной клавише 10. Это также возможно, что кто-то предположит, что это часть цифровой клавиатуры, но маловероятно (поскольку клавиатура использует другую последовательность символов, чем функциональные клавиши).

Это предполагает, что вы использовали описание терминала, которое знает о функциональных клавишах. В описании терминала vt100 этого нет, так как vt100 не имеет функциональных клавиш (кроме PF1 - PF4, которые зависят или не зависят от того, с кем вы разговариваете). Но если бы у вас был TERM=vt100, то некоторые элементы цифровой клавиатуры можно было бы распознать на основе описания терминала (см., например, длинный комментарий над vt100+fnkeys описание).

Однако его нет в TERM=xterm.

Что вы упускаете из виду, так это то, что vim (возможно, полезно) изменяет описание терминала, используя встроенные термины. Он распознает PF1 и т. д., используя такие записи таблицы:

{K_XF1,             IF_EB("\033O*P", ESC_STR "O*P")},
{K_XF2,             IF_EB("\033O*Q", ESC_STR "O*Q")},
{K_XF3,             IF_EB("\033O*R", ESC_STR "O*R")},
{K_XF4,             IF_EB("\033O*S", ESC_STR "O*S")},

Но записей для цифровых ключей нет; для ключа 0 нет "\033O*p".

Если у vim есть (в описании терминала) k0, и вы ни на что не сопоставили его, vim будет рассматривать его как литерал 0. То же самое происходит с k1 и т. д., фактически рассматривая функциональные клавиши и цифровую клавиатуру как одно и то же.

Что бы это ни стоило, GNU screen делает то же самое, но также и для пронумерованных ключей. Если я запущу vim внутри screen, vim увидит только 0. Литерал 0 в vim мало что делает в командном режиме.

person Thomas Dickey    schedule 21.11.2016