Executando certas operações sem limpar o registro

30

Freqüentemente, nos arquivos de configuração, posso copiar e colar um bloco de linhas, e quero fazer pequenas alterações nesse bloco. Depois de colar, eu uso xpara excluir os caracteres que quero remover e depois colar o próximo bloco. Exceto xcoloca os caracteres excluídos na área de transferência, então eu tenho que copiar novamente o bloco de linhas novamente.

Existe uma maneira de fazer isso sem entrar no modo de inserção?

durron597
fonte
Jasper encontrou perguntas semelhantes no Stack Overflow : [Alguma maneira de excluir no vim sem sobrescrever seu último puxão? [duplicate]] ( stackoverflow.com/questions/3638542/… ) e No vim existe uma maneira de excluir sem colocar texto no registro?
Gilles 'SO- stop be evil'

Respostas:

35

Suas opções são:

  1. Use o registro do buraco negro _. Por exemplo, para excluir uma linha, você digitaria "_dd. Isso exclui sem afetar a área de transferência.
  2. Nomeie explicitamente um registro para o arranco original. Por exemplo, para puxar uma linha em um registro nomeado, digite-o "ayye cole-o"ap
  3. Use os registros do arranco para recuperar o arranco original. Você pode puxar, excluir conforme necessário e quando colar o tipo"0p
  4. Use um plug-in como o vim-easyclip para fornecer um operador de corte distinto do operador de exclusão (divulgação completa: escrevi isso)

Corra :help registerspara obter mais detalhes nos 3 primeiros

Steve Vermeulen
fonte
4
Então, para xeu usar "_xentão?
precisa saber é o seguinte
1
Está correto.
Steve Vermeulen
2
@ durron597 se você estiver excluindo um caractere de cada vez x, provavelmente aprenderá a excluir exclusões de movimento, como dt)quais são excluídas até o próximo parêntese próximo das d2Wquais exclui os próximos dois tokens separados por espaços em branco. Então você pode fazer algo como "_di{dentro de uma região reforçada, que é algo que faço o tempo todo. No modo normal, isso significa " excluir tudo dentro desta região preparada para o buraco negro "
OregonTrail
Adicionado nnoremap x "_xao meu ~/.vimrc(explicação aqui: stackoverflow.com/questions/54255/… ).
Victoria Stuart
11

xnão coloca coisas na área de transferência, coloca-as em um registro . Se você não informar em qual registro colocar, ele será inserido no registro sem nome, que naturalmente substituirá o conteúdo anterior. Em vez disso, diga qual registro usar " REGISTER x:, em que REGISTRO é uma única letra. Você usa o mesmo prefixo de registro de cotação ppara colar a partir desse registro. (Observação: letras minúsculas substituem o conteúdo; letras maiúsculas são anexadas).

Existem também dois registros especiais "0e "1. "0é o ytexto arrancado mais recentemente ( ), que permanecerá mesmo se você excluir algum texto com outro comando (como x). "1é o texto excluído mais recentemente, desde que esse texto não seja pequeno (uma linha). O texto excluído pequeno entra "-.

Finalmente, como Steve Vermeulen aponta, você pode dizer ao vim para não salvar o texto excluído especificando o registro do buraco negro "_.

O comando de ajuda relevante é :help registers.

derobert
fonte
3

O :letcomando permitirá redefinir um registro nomeado. Na linha de comando do vim, pressionar Control+ R duas vezes 1 e, em seguida, o nome do registro colará o conteúdo do registro no comando. Em seguida, você pode modificar o que foi colado e salvar o registro com suas modificações.

Exemplo:

  • No modo normal, em uma linha que contém o texto "Foo Bar", digitar "fyypuxa a linha inteira ( yy) para o fregistro ( "f).
  • Digite :let @f=', e Control+ r, Control+ rnovamente, então f, e você deve vê-lo colar em "Foo Bar", para que sua linha de comando agora leia :let @f='Foo Bar, com o cursor no final.
  • Agora você pode usar as setas e excluir as teclas para editar o que acabou de colar, como :let @f='foo bar baz.
  • Termine a citação: :let @f='foo bar baz'e pressione Enter.

Agora você redefiniu o conteúdo do fregistro para "foo bar baz".

(Isso também funciona para macros! :help letPara mais informações.)


1 Control + rpermite inserir um registro quando você já está no modo de inserção, como se estivesse digitando os caracteres. Usar essa sequência duas vezes é importante porque "o texto é inserido literalmente, não como se fosse digitado. Isso difere quando o registro contém caracteres como <BS>". - o vimdoc insert.txt,:help i_CTRL-R_CTRL-R

alxndr
fonte
0

Relacionado ao registro blackhole "_mencionado por @derobert, você pode encontrar um screencast útil em http://vimcasts.org/episodes/meet-the-yank-register/

O Vim usa os termos delete, yank e put, no lugar da terminologia mais padrão recortar, copiar e colar. Começando com a mesma letra, colocar e colar são facilmente intercambiáveis. Depois de se acostumar com a palavra yank, ela se torna sinônimo de cópia. Mas o uso da palavra 'excluir' pelo Vim é problemático. Na maioria dos contextos, a palavra excluir significa apenas remover. Mas a operação de exclusão do Vim copia o texto em um registro e o remove do documento. Em outras palavras, a operação de exclusão do Vim se comporta como um corte.

Marlon León
fonte
2
Isso não fornece uma resposta para a pergunta. Para criticar ou solicitar esclarecimentos a um autor, deixe um comentário abaixo da postagem - você sempre pode comentar em suas próprias postagens e, quando tiver reputação suficiente , poderá comentar em qualquer post .
jamessan
Tentei comentar a postagem original, mas não consegui. O I única alternativa tinha era à que eu escolhi @jamessan
Marlon León
0

Plugin ReplaceWithRegister

http://www.vim.org/scripts/script.php?script_id=2703 (2009-2014)

Sugere o mapeamento gr.

  1. puxão
  2. selecione visualmente o texto que deseja substituir e pressione gr
  3. passar para o próximo bloco que você deseja substituir

Como alternativa, use gr<text object>para fazer isso sem uma seleção visual. O dot-repeat é suportado quando os plug-ins repeat.vimde Tim Pope e visualrepeat.vimde Ingo Karkat são instalados.

Hotschke
fonte