Pare as seleções de colagem do vim como texto!


10

Uso o VI e o VIM há anos (30 ou mais) (no xterms, não em sua própria janela, gvim) e tenho uma enorme biblioteca de comandos do vim que dou ao vim usando o botão do meio do mouse como uma seleção.

Por exemplo, eu costumava fazer coisas como ...

 vi {many_hundreds_of_files}
   paste vim commands using mouse - one paste per file.

A seleção incluiria muitos comandos do VIM para fazer coisas como substituir teste, formatação, mover linhas, etc., etc., etc., e geralmente termina com: we: próximos comandos do VIM, no final da seleção, então o vim está pronto para eu colar novamente no próximo arquivo. Isso me permite atualizar um grande número de arquivos de maneiras MUITO complexas, sem a necessidade de scripts especiais (como edição local no perl) para fazer isso.

Algumas dessas pastas de comando do vim têm mais de 200 linhas (armazenadas em arquivos de texto que eu pop-up na tela e em "copiar tudo"!) Isso faz muitas alterações no conjunto de milhares de arquivos que estou reformatando. somente para o conjunto específico de arquivos, não para o meu trabalho diário do vim.EG: Re-formatação em massa para arquivos de texto / dados.

O problema...

Durante o meu último patch do sistema (Fedora 25), o vim agora cola a seleção do mouse como texto e não como comandos do vim, e parece que não consigo parar!

Ainda funciona bem em outro sistema (Fedora 24).

Se eu quiser colar como texto, entro no modo de inserção antes de colar! Não quero que o VIM cole automaticamente as seleções como texto quando não estiver no modo de inserção. Entendo que isso foi concebido como um recurso de segurança, mas, para mim, é um MAIOR problema de usabilidade.

Tentei voltar atrás com entradas terminfo (xterm-256color) a partir de uma máquina que não faz isso (especialmente a entrada terminosa "kmous"). Também observei a configuração ": set mouse =" do vim (que é nula!). Eu não sei se é o xterm (duvidoso), ou algo que mudou no VIM (provável), e os logs de alterações e o google foram inúteis.

Nada, no entanto, me parece o comportamento antigo.


Encontrado outro utilizador com o mesmo problema, menos detalhe, nenhuma solução unix.stackexchange.com/questions/346293/...
Anthony

1
Duvido que seja mais provável uma vimmudança: como é possível saber vimdentro de xtermalgo que é inserido através do teclado ou colado através do botão do mouse? Eu não conheço esse mecanismo. Por outro lado, xtermsabe que está em execução vimpara que possa decidir cercar a colagem com i<esc>. Tente (a) com um tipo diferente de janela do terminal e (b) uma cópia vimcom um nome diferente. Isso deve ajudar a restringir a causa do problema.
Philippos

Eu concordo com @philippos. Talvez algo diferente vimesteja seqüestrando seu método de colar. Talvez tente ssh'ing ou telneting em sua máquina e colando dessa maneira. Se você possui uma caixa do Windows, use o putty para ssh na sua máquina Fedora25 e cole dessa maneira.
Jim L

Não está diretamente relacionado, mas o gvim no Windows se comporta dessa maneira há anos. Ao instalar o gvim, você obtém dois executáveis gvim.exe(graphical-vim) e linha de comando vim.exe. Cole "itext" no gvim.exe e você obtém itext. Cole-o no vim.exe e você obterátext
Jim U

1
@ Philippos Esse mecanismo pode ser colado entre colchetes . Não sei como o Vim pode apoiá-lo, talvez a pastetoggleopção?
Gilles 'SO- stop be evil'

Respostas:


12

Bem, depois de passar por muitas páginas da web, muitas dando algumas dicas que pareciam não funcionar, encontrei uma dica (texto extra em torno de uma pasta) que me levou à causa e à solução do problema.

Parece que o vim incorporou nele várias entradas 'falsas' do termcap que ele usa quando reconhece terminais específicos (e às vezes erra, embora não esteja errado nesse caso).

As configurações do Termcap no vim são numerosas e, como tal, NÃO aparecem na lista de configurações ": set all" normais. Para vê-los, você precisa usar ": set termcap". A configuração específica do termocap 'não padrão' é "t_BE" (consulte vim ": help t_BE"). A ajuda embutida "xterm-bracketed-paste" explica essa configuração de termcap interna para vim.

Basicamente, se essa configuração for definida (neste caso pelo Vim, não termcap / terminfo), o vim o enviará ao xterm quando for iniciado, o que instrui o xterm a adicionar códigos especiais ao redor de qualquer texto que o usuário cole de uma fonte externa. Quando o vim os vê, entra automaticamente não apenas no modo de inserção, mas também define o 'modo de colar' para não formatar o texto.

Quanto mais tarde (modo de colagem), acho MUITO útil! O primeiro é o que tem me causado todo o problema.

A solução de força bruta é desativar a pasta entre colchetes adicionando isso ao ".vimrc"

:set t_BE=

Uma solução alternativa ....

Em vez de desativar completamente a pasta entre parênteses, pare o vim de executar uma ação quando vir a sequência inicial de uma pasta de terminal (do mouse), enquanto estiver no comando ou no modo normal.

:nmap <PasteStart>  <NOP>
:nmap <PasteEnd>    <NOP>
:cmap <PasteStart>  <NOP>
:cmap <PasteEnd>    <NOP>

Usar isso significa que, se você colar texto enquanto estiver no modo de inserção, o vim não tentará formatar (recuar) o texto que provavelmente já está recuado.

Isso não significa que não preciso mais alternar o modo de colar, pois também uso o alternar do modo de colar (mapeado para F2) para desativar "showbreak" e "listchars" (exibindo linhas quebradas, guias, espaços sem interrupção e espaços extras no final das linhas). Eu ainda precisaria colocar o vim nesse modo quando desejar fazer seleções de mouse para colar em outro lugar.

Comentários e sugestões sobre as soluções são bem-vindos.


Isso também parece funcionar em Cygwin Vm mas infelizmente não resolve o problema no VS Vim
James Robinson

@JamesRobinson Muito provavelmente é um terminal interno diferente para o VS
anthony
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.