Interação estranha vim / xterm: inserção automática do registro `` `ao abrir o arquivo

7

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: truedefini 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 .vimrce nenhum .vimdiretó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 insertedno "registro e chamar o vim algumas vezes. Se você vir um arquivo de uma linha xna primeira linha, está tudo bem; insira qpara 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 .vimrce .vimtemporariamente 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

Jens
fonte
Um set t_RS=ou set t_SH=em seu vimrc funciona?
Massa
@ Mass Sim, qualquer um deles funciona, ou seja, não há mais inserção de linha mágica. Com essas entradas, o :regcomando não mostra mais o ".conteúdo.
Jens
Você verificou se o github.com/vim/vim/pull/2126 resolve o seu problema? Qual é exatamente a saída :echo v:termresponse?
Christian Brabandt
@ChristianBrabandt A saída é ^[[>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!
Jens

Respostas:

4

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:

t_RS    request terminal cursor style           *t_RS* *'t_RS'*
t_SH    set cursor shape                        *t_SH* *'t_SH'*

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=ou set 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,

  • atualizando para a versão mais recente do vim
  • relate o bug (consulte :h bugs), observando cuidadosamente sua plataforma e emulador de terminal, o comportamento preciso visto e o valor de v:termresponse.
Massa
fonte