comportamento estranho VIM F1-10

3

Recentemente, comecei a encontrar um comportamento realmente chato no VIM:

Não importa se estou no modo inserir ou normal, se eu pressionar uma das teclas F, o vim não fará o que normalmente é pretendido:

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

Ao usar o GVim, tudo funciona conforme o esperado. Alguma sugestão? Eu estou usando a versão 7.3 no Ubuntu Maverick 10.10. Usando o terminador, mas mudar para o terminal padrão não ajuda.

    
por Predator117 16.03.2011 / 20:18

1 resposta

8

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

    
por 16.03.2011 / 20:59