Isso ocorre porque terminal converte eventos X em seqüências de escape como estas:
<F1> -> ^[OP
<F2> -> ^[OQ
<F3> -> ^[OR
<F4> -> ^[OS
<F5> -> ^[[15~
<F6> -> ^[[17~
e assim por diante ( ^[
é um caractere de escape). Em alguns terminais, o vim é capaz de obter essas seqüências a partir do banco de dados terminfo, mas, às vezes, o banco de dados terminfo não corresponde aos caracteres realmente enviados ou não contém key_f*
entradas. Nesse caso, pressionar <F1>
resultará na obtenção de escape (escapa do modo atual, a menos que seja o modo normal), O
(no modo normal: cria uma nova linha antes da linha do cursor e entra no modo de inserção) e algum caractere inserido a nova linha (e para <F5>-...
keys ~
é o comando que inverte o caso). Você pode consertá-lo, colocando em vimrc algo parecido com isso
" 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
Se seus códigos forem diferentes daqueles que usei como exemplo, use <C-v><F1>
(nos modos inserir ou linha de comando) para obter o que seu terminal está enviando (mais informações em :h i_CTRL-V
).