Posso acelerar a colagem no vim?


12

Copiei uma parte do HTML de uma página da Web e queria salvá-lo em um arquivo. Para isso, iniciei uma nova vim sessão em uma janela de terminal, com um (novo) nome de arquivo especificado na linha de comando, pressione ipara entrar no modo de inserção e, em seguida, CtrlShift+ Ve esperei enquanto era [-- INSERT --]mostrado na parte inferior e esperei ...

Como vimnão respondi após alguns segundos, abri o 'Editor de Texto' no menu Aplicativos → Acessórios, colei o texto (que apareceu em uma fração de segundo, o salvei com um novo nome, fechei e interrompi a sessão do Vim que ainda não foi feito, 1,5 minutos depois.A quantidade de texto era de 186K em 3200 linhas, não excessiva, eu diria, nem com linhas excessivamente longas.

Existe uma maneira de acelerar esse tipo de inserção vime / ou existe uma explicação para isso ser tão lento em comparação ao uso do Editor de Texto, que é horrível e orientado ao mouse?

(A porcentagem de CPU de acordo com topnão supera os 5%, embora eu tenha alguns processadores livres no sistema, portanto, pode haver algum problema de ligação de E / S, que não existe ao ler o mesmo texto de um arquivo)

Informações da versão:
Ubuntu 12.04
Vim: 7.3, com patches fornecidos pelo Ubuntu 12.04
bash: 4.2.25
gnome-terminal: 3.4.1.1


1
Eu acho que é lento porque está tendo que analisar a entrada e tentar formatá-la etc. Não tenho certeza da opção para fazer isso, mas presumiria que você pudesse desativar temporariamente esse recurso com / sem vim, fazer a colagem e, em seguida, reative-o. Tente também usar o :set pasterecurso para ver se ele melhora as coisas. Veja :help pastecomo descreve como vimnão faz distinção entre digitar e colar.
Slm

Eu esperaria vitentar analisar o arquivo ao ler (depois de salvar o caminho @ l0b0 sugerido) também. Mas isso funciona rápido.
Anthon

É verdade, mas estou imaginando que ele deve revisar tudo o que já foi analisado + o novo personagem que você está colando. Parece que é o que está acontecendo quando você edita um arquivo também, até certo ponto.
Slm

o :set pasteque parece realmente não faz diferença (não estou usando um cronômetro, apenas o relógio de parede).
Anthon

OK, foi só um pensamento ...
slm

Respostas:


14

Para salvar muito texto da área de transferência em um arquivo rapidamente, você pode executar cat > file.txt, colar o conteúdo e pressionar Ctrl- d.

Se você possui o xsel instalado, pode fazer isso :r !xselpara inserir a seleção "primária" (também conhecida como "mouse") no Vim ou :r !xsel -bpara inserir o buffer da "área de transferência" ( Ctrl- c). Você também pode salvar a seleção diretamente em um arquivo com xsel >file.txtou xsel -b >file.txt. Isso elimina a necessidade de ações de colar + EOF separadas e evita a impressão de todo o buffer de cópia no terminal.

Se você não possui xsel, mas xclip, os comandos correspondentes são xclip -outpara a seleção primária ou xclip -out -selection clipboardpara o buffer da área de transferência.


1
Obrigado, que pelo menos funciona sem ter que reverter para o mouse, e inserir o arquivo no vim (por exemplo, quando não inicio com um arquivo vazio) é rápido o suficiente.
Anthon

Eu não entendo por que isso não pode ser vinculado a ctrl + shift + v, não há absolutamente nenhum sentido nisso tudo.
Mchid 13/11/2016

2

Este é um problema de liberação do disco no buffer. O Vim tenta manter seu trabalho seguro e não pressupõe que você possa digitar vários milhares de caracteres por segundo. Leia :help swap-filepara alguns detalhes sobre o buffer. A solução para o seu problema é esta:

Desative o arquivo de swap do vim com:

vim -n <your file>

ou de dentro do vim antes da pasta:

:set noswapfile

Veja :help swapfilepara mais detalhes.

Outra opção é simplesmente desativar a sincronização com o disco do arquivo de troca, :set swapsync=mas essa opção leva mais pressionamentos de tecla para desfazer e eu sou preguiçoso. :)

Desativar a troca não é seguro para operações normais! Imediatamente após a colagem, use :set swapfileou :set swapsync=fsyncpara voltar ao comportamento normal (embora tecnicamente, o comportamento normal possa ter sido sincronizado e não fsync , verifique com :set swapsync?antecedência se você deseja seguir esse caminho).


1
isso não acelerou as coisas para mim ...
elegível

1

Se você tiver um xterm_clipboardrecurso, poderá usar os registradores *e +. Esses registradores fazem interface com o buffer de seleção primário X11 e a área de transferência (respectivamente).

Portanto, se você copiou algo via CTRL+ c, pode colá-lo no vim com "+p.

Se você simplesmente o destacou sem copiar, pode colá-lo com "*p.
Você também pode tornar o *buffer o buffer padrão fazendo isso :set clipboard=unnamed. Então qualquer puxão ( y), pasta ( p), etc, que não especifique um registro, usará o *registro. O Vim 7.3.74 também foi adicionado clipboard=unnamedplus, que usará o +registro por padrão.

Você também pode copiar as coisas na seleção e prancheta buffers principais por arrancar, por exemplo: "+yy.

 

Observe que, como mencionado, todos esses recursos precisam desse xterm_clipboardrecurso. Você pode ver se possui esse recurso fazendo :versiondentro do vim, ou a vim --versionpartir do shell, e procure +xterm_clipboard. Se diz -xterm_clipboard, você não o possui e teria que recompilar o vim.


Eu não tenho esse recurso. A recompilação da ajuda até o vim não está sendo executada no xterm? (Estou usando o gnome-terminal).
Anthon

@ Anthon Se você estiver usando o GUI VIM, acredito que os registros também estejam ativados. xterm_clipboardé apenas se estiver executando o vim a partir do terminal.
Patrick

Este é apenas texto, sem GUI VIM, mas não está sendo executado xterm.
Anthon

Oh, desculpe, eu interpretei errado. Sim xterm_clipboardse aplica a qualquer emulador de terminal, não apenas ao xterm. Eu mesmo uso urxvt.
Patrick
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.