3

Недавно я столкнулся с действительно раздражающим поведением в VIM:

Независимо от того, нахожусь ли я в режиме вставки или в нормальном режиме, если я нажимаю одну из клавиш F, vim не делает то, что обычно делает:

F1 - inserts a "P"
F2 - inserts a "Q"
F3 - inserts a "R"
F4 - inserts a "S"
F5-10 - inverts case

При использовании GVim все работает как положено. Какие-либо предложения? Я использую версию 7.3 на Ubuntu Maverick 10.10. Использование терминатора, но переход на терминал по умолчанию не помогает.

1 ответ1

8

Это потому, что терминал транслирует события X в escape-последовательности, подобные этим:

<F1> -> ^[OP
<F2> -> ^[OQ
<F3> -> ^[OR
<F4> -> ^[OS
<F5> -> ^[[15~
<F6> -> ^[[17~

и так далее (^[ это escape-символ). В некоторых терминалах vim может получить эти последовательности из базы данных terminfo, но иногда база данных terminfo не соответствует фактически отправленным символам или не содержит записей key_f* . В этом случае нажатие <F1> приведет к возврату (выход из текущего режима, если это не нормальный режим), O (в нормальном режиме: создать новую строку перед строкой курсора и войти в режим вставки) и некоторый символ, который вставляется в новый строка (а для клавиш <F5>-... keys ~ это та команда, которая инвертирует регистр). Вы можете исправить это, поместив в vimrc что-то подобное

" Condition should identify terminal in question so "
" that it won't change anything for terminals without this problem "
if !has("gui_running") && $TERM is "xterm"
    for [key, code] in [["<F1>", "\eOP"],
                        \["<F2>", "\eOQ"],
                        \["<F5>", "\e[15~"],
                        \]
        execute "set" key."=".code
    endfor
endif

Если ваши коды отличаются от тех, которые я использовал в качестве примера, используйте <C-v><F1> (в режиме вставки или командной строки), чтобы получить то, что отправляет ваш терминал (больше информации в :h i_CTRL-V).

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .