Eu acho que sei o que está acontecendo.
Você não configurou vim
para desativar o modo de compatibilidade vi
.
Em vi
, você só pode pressionar as teclas de seta no modo comando . Quando no modo de inserção, as sequências de caracteres enviadas ao pressionar as teclas de seta são tratadas como se os caracteres fossem inseridos individualmente.
Agora, na inicialização, vi
define o terminal no modo de transmissão do teclado (kx). Nesse modo, os terminais geralmente enviam uma sequência de caracteres diferente ao pressionar as teclas de seta do que quando não.
Por exemplo, a tecla Up envia \eOA
no modo kx e \e[A
quando não.
Para definir o terminal no modo kx, ele procura o recurso smkx
(transmissão do teclado no modo de configuração) no banco de dados terminfo para o valor atual de $TERM
.
Se você observar o recurso smkx
para xterm
, konsole
e linux
, consulte:
$ infocmp -1 linux | grep smkx
$ infocmp -1 xterm | grep smkx
smkx=\E[?1h\E=,
$ infocmp -1 konsole | grep smkx
smkx=\E[?1h\E=,
Isso é smkx
não está definido na entrada linux
.
O que isso significa é que quando você inicia vim
com TERM=linux
, o vim não configura o terminal no modo kx, o que significa que envia \e[A
em vez de \eOA
quando você pressiona o Up chave por exemplo.
Agora, o que o \eOA
faz no vim quando você está no modo de inserção? \e
(ESC), sai do modo de inserção e retorna ao modo de comando. O
abre uma nova linha e entra no modo de inserção novamente, A
insere o caractere A
.
Enquanto \e[A
, \e
(ESC) deixa o modo de inserção, [A
é uma combinação desconhecida (em vim
, [
é um prefixo e é sempre seguida por outro caractere), portanto não faz nada.
Então, o que você precisa fazer é: manter $TERM
como está, não usar as teclas de seta no modo de inserção quando estiver na compatibilidade vi ou adicionar set nocp
ao seu ~/.vimrc
, para usar as teclas de seta modo de inserção.