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 ).