Este está me deixando louco. Estou usando o XTerm (330) e o vim mais recente 8.0.1365 (no FreeBSD).
Às vezes, nem sempre, cerca de 1 em cada 5, quando abro um arquivo com o vim, uma linha engraçada é inserida acima da linha 1. Depois de muito coçar a cabeça, percebi que era a última linha que eu excluí em uma sessão anterior. Em outras palavras, parece que ""P
(colar o "
registro) é executado.
Após mais algumas investigações, descobri que isso só acontece quando *sunKeyboard: true
defini os recursos do XTerm e quando uso uma fonte renderizada, como -fa "DejaVu Sans Mono:size=24"
. (Eu disse que era estranho, não disse?). Eu não tenho nenhum .vimrc
e nenhum .vim
diretório, para evitar quaisquer truques plug-in de jogo em mim.
Eu posso reproduzir o efeito um pouco com os seguintes comandos:
#!/bin/sh
rm -f .viminfo; echo inserted >bar; echo x >baz
vim -c d -c wq bar
echo '*sunKeyboard: true' > XTerm
export XAPPLRESDIR=$PWD
for i in 1 2 3 4 5 6; do
xterm -fa "DejaVu Sans Mono:size=24" -e vim baz
done
Isto irá criar os arquivos necessários, colocar inserted
no "
registro e chamar o vim algumas vezes. Se você vir um arquivo de uma linha x
na primeira linha, está tudo bem; insira q
para a próxima chamada. Se, no entanto, você vê
inserte2
x
você reproduziu o problema. Observe também que o último caractere da linha 1 foi substituído por 2
. Isso parece vir do .
registro. Aqui estão os registros:
:reg
--- Registers ---
"" inserted^J
"1 inserted^J
". 2
"% baz
- Tentando o script várias vezes, você pode reproduzir o problema? Certifique-se de mover-se
.vimrc
e.vim
temporariamente fora do caminho. - Se sim, você pode me dizer o que está acontecendo aqui?
- Alguma sugestão de como chegar ao fundo disso?
ATUALIZAR
Parece que eu não sou o único: https://github.com/vim/vim/issues/2238
set t_RS=
ouset t_SH=
em seu vimrc funciona?:reg
comando não mostra mais o".
conteúdo.:echo v:termresponse
?^[[>19;331;0c
. A página do github é um labirinto torcido, do qual não faço ideia como obter informações. Na parte inferior, aparece "fechado", mas não consigo encontrar um número de patch, como "corrigido em 8.0. ####". Obrigado por reservar um tempo para comentar!Respostas:
Quando o vim é iniciado, ele interroga o emulador de terminal, que responde com os códigos dos terminais. O vim geralmente captura isso em
v:termresponse
. Às vezes, no entanto, os códigos são aprovados e frequentemente se parecem com comandos vim e causam comportamento não intencional.Duas das opções que controlam o que o vim envia parecem causar problemas a muitas pessoas:
Estes foram adicionados recentemente para permitir que o vim defina a forma do cursor e determine o cursor padrão do terminal. Definir um desses itens como vazio (
set t_SH=
ouset t_RS=
) faz com que o vim pule a verificação. É a resposta do seu terminal que está causando o problema.Isso provavelmente é um bug do vim, porque deve funcionar por padrão no xterm. Além de definir essas opções como vazias, sugiro,
:h bugs
), observando cuidadosamente sua plataforma e emulador de terminal, o comportamento preciso visto e o valor dev:termresponse
.fonte