teclas de seta não funcionam no modo de inserção

13

Quando pressiono as teclas de seta no modo de inserção, recebo caracteres em vez de navegação:

Pressionar as teclas de seta digita caracteres

Eu gostaria de poder usar as setas do teclado para navegar.


Coisas que eu tentei

Eu tenho set nocompatibleno meu ~/.vimrc( vimrc pastebin ), estou usando patógeno e aqui está o meu ~/.vim/bundlediretório:

YouCompleteMe/
emmet-vim/
nerdtree/
node/
vim-airline/
vim-markdown/

O problema só começou recentemente, não consigo lembrar a causa.

Alguns recomendam :set term=builtin_ansi, e isso resolve o problema, mas remove todas as minhas cores.


$ vim --version
VIM - Vi IMproved 7.4 (2013 Aug 10, compiled Aug 29 2016 12:51:13)
MacOS X (unix) version
Included patches: 1-2290
Compiled by Homebrew
Huge version without GUI.  Features included (+) or not (-):
...

Consulte http://pastebin.com/5z1HbpqW para obter toda a saída.

$ echo $TERM
xterm-256color

e no vim:

:set compatible?
nocompatible

:set term?
term=xterm-256color
theonlygusti
fonte
5
Talvez não um duplicado (não tenho certeza), mas, pelo menos, muito relacionada vi.stackexchange.com/q/5123/1841
statox
@ statox não é uma duplicata, pois estou usando o vim, não vi.
theonlygusti 30/09/16
11
Como você gravou sua tela assim?
Anthony
Você já tentou dicas deste site: vim.wikia.com/wiki/… ?
Grdzik 3/10
11
Livre-se do mapeamento do modo de inserção com escape. Linha 133
FDinoff 04/10

Respostas:

7

O que está causando o comportamento

Quando você pressiona a seta esquerda, seu terminal está enviando a seguinte seqüência de escape:

ESC O D

Isso também pode ser anotado como ^[OD, onde ^[está a notação Ctrl-[, que é outra maneira de anotar ou inserir o caractere ESC. (Experimente no modo de inserção!)

O Vim não está reconhecendo isso como uma sequência de escape e, portanto, está tratando essas teclas como se você as tivesse digitado:

  • Esc: Saia do modo de inserção,
  • O: Inicie uma nova linha acima do cursor e entre no modo de inserção,
  • D: Digite um caractere 'D'.

Você pode confirmar que é isso que o seu terminal está enviando, entrando no modo de inserção e pressionando Ctrl-Vseguido pela Leftseta.

O que está acontecendo de errado

A sequência de escape pode estar atingindo o tempo limite

A única maneira pela qual o Vim pode distinguir a sequência de escape dos mesmos três caracteres digitados manualmente é pelo tempo que ocorre entre o recebimento de cada caractere. Portanto, é possível em terminais lentos ou sistemas muito ocupados que haja um atraso suficiente entre cada caractere que o Vim esteja decidindo que não é uma sequência de escape e apenas interpretando as teclas conforme descrito acima.

Isso é descrito :help vt100-cursor-keyse mais adiante :help timeout - a solução sugerida é definir um ttimeoutlentempo limite suficientemente grande , mas desabilitando completamente, definindo ambos notimeoute nottimeouttambém funcionaria.

No entanto, dada a sua configuração, é pouco provável que esse seja o problema.

O Vim não reconhece a sequência

É mais provável que o problema seja que o Vim não reconheça a sequência de escape enviada e a interprete como pressionamentos de tecla. Você pode verificar isso com o seguinte comando:

:set <left>?

Em uma configuração de trabalho com sua configuração de terminal atual, isso deve fornecer uma das seguintes saídas:

t_kl <Left>      ^[O*D
t_kl <Left>      ^[OD

Se você vir mais alguma coisa 1 , o Vim e o seu terminal não estão falando o mesmo idioma.

A maneira correta de corrigir isso seria corrigir a configuração do terminal para que o banco de dados terminfo relate as seqüências que são realmente enviadas quando você pressiona as teclas de seta, mas isso pode ser complicado. Uma correção levemente hacky é alterar o que o seu terminal envia para corresponder ao que o Vim está esperando. Eu deduzo dos seus comentários que você está usando o Mac Terminal.app padrão: Você pode alterar as seqüências de escape enviadas para cada pressionamento de tecla em Preferências → Perfis → Seu perfil → Teclado.

No entanto, a solução mais fácil é provavelmente informar diretamente ao Vim quais seqüências de escape esperar. Você pode fazer isso configurando suas opções de terminal assim:

set <up>=^[OA
set <down>=^[OB
set <right>=^[OC
set <left>=^[OD

Observe que o ^[acima é um ESCcaractere literal . Você não pode simplesmente digitar ^seguido por [! A maneira mais fácil de inserir os mapeamentos é entrar, por exemplo,

set <left>=

e, ainda no modo de inserção, pressione Ctrl-Vseguido pela leftseta. Observe que você está configurando a sequência de escape diretamente para o que o Vim recebe quando você pressiona a tecla de seta ... enviando essa sequência!

1: Uma possibilidade provável é a sequência CSI :^[[D

Rico
fonte
Finalmente, graças à sua resposta, consegui corrigir as teclas do cursor no Windows Subsystem for Linux!
David Ferenczy Rogožan 6/03
5

Essa resposta resolveu exatamente o mesmo problema para mim.

Em ~/.vimrcadicione a seguinte linha:

set nocompatible

Após reiniciar o vim, o problema desapareceu

Teorético
fonte
2
Por isso, se você tiver uma colocação , deve ser redundante. :h 'nocompatible' default on, off when a vimrc or gvimrc file is found.vimrcset nocompatible
statox
2

A atualização do vimpacote corrigiu o problema de setas quebradas para mim.

Se você estiver no Ubuntu, execute apt upgrade vim. Curiosamente, apt install vimtambém ajuda. E ainda mais interessante, após a vimversão de atualização permanece a mesma:

VIM - Vi IMproved 7.4 (2013 Aug 10, compiled Nov 24 2016 16:44:48)
Included patches: 1-1689
Extra patches: 8.0.0056

Mas isso ajuda.

Mikhail Vasin
fonte
11
A versão pode permanecer a mesma, mas talvez os patches incluídos tenham sido atualizados? Caso contrário, não vejo como apt upgraderesolver o problema.
statox
Isso funcionou perfeitamente para mim no sistema operacional OS 5.1 Hera.
praneetloke