Это потому, что терминал транслирует события 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
).