ti-enxame.com

Qualquer maneira de apagar no vim sem substituir seu último puxão?

Eu amo vim, mas uma pegadinha comum é:

  • arrancar uma linha
  • vá para onde você gostaria de colá-lo
  • excluir o que há
  • cole seu yank, só para descobrir que ele cola o que acabou de deletar

Obviamente, o fluxo de trabalho é excluído primeiro, segundo. Mas seria muito bom se eu não fizesse ter para. Alguém tem um truque para isso? O vim tem um buffer de colar que funciona bem, ou existe uma configuração .vimrc que eu possa mudar?

254
tedsuo

Passe para o registro _, o buraco negro.

Para apagar uma linha sem colocá-la nos registradores:

"_dd

Veja também :help registers .

É provavelmente mais seguro, se você quiser colar algo repetidas vezes, para transformá-lo em um registro "nomeado".

"aY

Arranca uma linha no registo a. Cole com "ap.

298
dash-tom-bang

Sua linha arrancada ainda deve estar no registro 0. Então faça

"0p

para colar a linha (e excluir sempre que quiser)

166
mb14

Todas as operações de yank e delete gravam no registrador sem nome por padrão. No entanto, a eliminação mais recente e a mais recente são sempre armazenadas (separadamente) nos registros numerados. O registrador 0 contém o yank mais recente . Os registradores 1-9 mantêm as 9 exclusões mais recentes (com 1 sendo o mais recente).

Em outras palavras, um delete sobrescreve o yank mais recente no registrador sem nome, mas ele ainda está lá no registrador 0 O truque do blackhole-register ("_dd ) mencionado nas outras respostas funciona porque evita sobrescrever o registro não nomeado, mas não é necessário.

Você faz referência a um registrador usando aspas duplas, então colar o texto mais recentemente arrancado pode ser feito assim:

"0p

Esta é uma excelente referência:

81
Wayne Burkett

outra possibilidade é:

puxar suas linhas como você faria normalmente

vá para onde você deseja colá-los, entre no modo de linha visual (V)

selecione as linhas que deseja substituir

pressione p para colar suas linhas.

isso também tem o benefício adicional, que o buffer é "trocado" com o conteúdo substituído

38
knittl

Eu uso o mapeamento a seguir para facilitar a exclusão do registro de buraco negro:

nnoremap R "_d

Desta forma, dd torna-se Rd e d$ torna-se R$. Note que R normalmente está ligado para entrar no modo de substituição, mas eu descobri que nunca usei isso, então foi a chave mais fácil de lembrar para um recurso "remover realmente".

23
Jörn Horstmann
" map paste, yank and delete to named register so the content
" will not be overwritten
nnoremap d "xd
vnoremap d "xd
nnoremap y "xy
vnoremap y "xy
nnoremap p "xp
vnoremap p "xp
8
Pencilcheck

Eu escrevi este plugin (yankstack.vim) para resolver este problema. Dá-lhe algo como anel de matar do Emacs para vim. Você pode tirar ou deletar várias coisas, fazer uma colagem e, em seguida, alternar entre seus históricos de texto interrompido/morto. Eu acho mais fácil do que ter que lembrar o registro em que eu coloquei algo.

No meu .vimrc, eu tenho esses mapeamentos:

nmap <M-p> <Plug>yankstack_substitute_older_paste
nmap <M-P> <Plug>yankstack_substitute_newer_paste

o que me deixa acertar ALT-p ou ALT-SHIFT-p para ir e voltar do meu histórico de pastas.

5
max

Para sua pergunta específica, como solicitado, você não poderia simplesmente trocar a ordem das duas últimas etapas?

  • yank line (mesmo)
  • mover para o novo local (mesmo)
  • cole a linha puxada (foi o passo 4)
  • excluir linha que você não quer (foi o passo)

Concedido, eu costumo usar um registro nomeado para esse tipo de coisa, mas às vezes a solução é mais simples do que o que me vem pela primeira vez.

4
Dan

Você poderia usar registradores: "<register><command>

Por exemplo.:

Isso puxa uma linha para o registrador a, apaga uma linha diferente e depois cola o registrador a

"ayy` (move) `dd"aP
1
DarkDust

Acho todos esses combos-chave pesados. Em vez disso, escrevi uma função para ativar e desativar o comportamento "efeito colateral" do vim de sobrescrever buffers de operações de exclusão. Dessa forma, você pode simplesmente desativá-la, excluí-la livremente e voltar a ativá-la quando terminar.

Veja minha resposta aqui: https://stackoverflow.com/a/12649560/778118

Para usá-lo basta colocá-lo no seu .vimrc

1
Magnus

Você também pode experimentar o seguinte script: ReplaceWithRegister at vim.org/scripts/

1
dmedvinsky

Se você é um usuário malvado, você pode considerar o remapeamento de X para fazer o equivalente a "_d. No entanto, o aperfeiçoamento da implementação foi um pouco complicado para mim. No entanto, descobri que

(define-key evil-normal-state-map "X" 'evil-destroy)
(define-key evil-visual-state-map "X" 'evil-destroy)

(evil-define-operator evil-destroy (beg end type register yank-handler)
  "delete without yanking text"
  (evil-delete beg end type 95 yank-handler)
)

integra-se muito bem. Por exemplo, digitar XX funcionará de forma análoga ao dd, assim como X $ a d $, X0 a d0, etc ...

Se você está curioso para saber como ele funciona, "95" representa o "_ register, então ele simplesmente redireciona sua chamada para deletar como se" tivesse sido o registrador pressionado.

0
RussellStewart

O truque é que você sabe que quer pegar algo e se mover, e você está usando o primeiro registro 'preguiçoso' (que é substituído pelo que você acabou de deletar).

Você precisa aprender a "cortar" no vim.

Antes de excluir, especifique qualquer registrador diferente do código ". Dica: confira seus registros com :reg

agora, você seleciona um novo registro pressionando " antes de qualquer comando (no modo de comando, obviamente)

  1. selecione o que você deseja "cortar" (ou, na etapa 2, especifique um intervalo)
  2. Mude o registrador para qualquer coisa (1 aqui) e delete: "1d ou "1x ou até mesmo "1c
  3. vá para o novo local, exclua um pouco mais
  4. agora você está pronto para colar o que cortou e armazenou no registro 1: "1p ou "1P

feito. isso também tem a vantagem de resolver o usecase: deletar 5 coisas diferentes de um lugar, e cada pedaço vai para um destino diferente ... basta colocar um em "1 outro em "2 e assim por diante ... vá para cada destino e cole.

0
gcb