Como excluir (não cortar) no Vim?

145

Como posso excluir uma linha sem colocá-la no meu buffer padrão?

Exemplo:

line that will be copied.

line that I want to be substitued with the previous one.

O que estou tentando fazer:

yy
dd
p

Mas o Vim substitui a string copiada recentemente pela excluída (cortada). Eu sei que eu posso usar tampões como, "1yy, ddem seguida "1p, mas sempre se esqueça de colocar a corda copiado em um buffer então eu preciso para colar meus conteúdos primeiro (linha que será copiado) e exclua o que eu quero (linha que eu quero para ser substituído pelo anterior.)

Como posso realmente excluir um texto no Vi (m) sem copiá-lo?

Outra questão relacionada é como posso encaminhar excluir uma palavra no modo de inserção? Eu quero algo semelhante ao Ctrl+ w.

MaikoID
fonte

Respostas:

130

Use o "registo buraco negro", "_para realmente apagar alguma coisa: "_d.
Use "_dPpara colar algo e mantê-lo disponível para colar ainda mais.

Para a segunda pergunta, você poderia usar <C-o>dw. <C-o>é usado para executar um comando normal sem sair do modo de inserção .

Você pode configurar seus próprios mapeamentos para economizar digitação, é claro. Eu tenho estes:

nnoremap <leader>d "_d
xnoremap <leader>d "_d
xnoremap <leader>p "_dP
romainl
fonte
thx, você responde minhas duas perguntas. Mas não entendi como esses comandos noremap me ajudarão. Estou perdendo a função de corte, certo?
MaikoID
3
Não, dainda "corta" e painda "cola", enquanto <leader>dexclui para real e <leader>pjoga fora o texto selecionado e cola o conteúdo do registro padrão. <leader>ppermite colar o mesmo texto várias vezes sem precisar usar registros nomeados.
Romainl
119

O registro do buraco negro "_ fará o truque, mas há uma solução melhor:

Ao inserir a linha de volta com o pcomando, você está colando o conteúdo do registro padrão (volátil) "", que foi substituído por dd. Mas você ainda pode colar a partir do registro yank (não volátil) "0, que não será sobrescrito pelo comando delete dd.

Portanto, estes são os comandos que você deseja usar conforme o seu exemplo:

yy
dd
"0p
cutemachine
fonte
1
Ótimo, essa deve ser a resposta aceita. É muito mais fácil especificar manualmente um registro sempre que quero colar do que continuar especificando um registro sempre que excluir algo.
JShorthouse
44

Essa é uma das coisas que eu não gostei no vim ... acabei mapeando ddpara o registro do buraco negro no meu .vimrc e a vida tem sido boa desde:

nnoremap d "_d
vnoremap d "_d
kprobst
fonte
6
então como você corta?
VitalyB
11
v/Vcom xtambém é cortado. E cortar com xtambém é coerente com Ctrl + xqualquer sistema operacional.
WesternGun 3/11
22

os seguintes mapeamentos produzirão:

  • d => "excluir"
  • líder d => "cut"
nnoremap x "_x
nnoremap d "_d
nnoremap D "_D
vnoremap d "_d

nnoremap <leader>d ""d
nnoremap <leader>D ""D
vnoremap <leader>d ""d

Além disso, é uma boa prática ter a chave "líder" definida como vírgula, por exemplo:

let mapleader = ","
let g:mapleader = ","

esses dois trechos tornarão ", d" o seu novo comando de corte.

Se você deseja usar esses mapeamentos em conjunto com uma configuração compartilhada da área de transferência do sistema, consulte mais detalhes em https://github.com/pazams/d-is-for-delete

pazams
fonte
Eu gostaria de poder aprovar esta resposta mais de uma vez - eu estava usando a resposta do kprobst, mas para cortar uma linha, tive que usar o yyddque era um pouco insustentável em meus dedos ;-).
Tahir Hassan
1
idéia intellij agindo tão estranho depois disso. dd não faz nada. , d não faz nada
s1n7ax
Eu gosto muito da solução. Uma coisa que não funcionou para mim - é cortar linhas com ,dd. Depois de adicioná- nnoremap <leader>dd ""ddlo, começou a funcionar #
Alexey
8

Você pode usar "_dpara impedir que coisas sobrescrevam seu texto arrancado. Você pode armazenar texto arrancado ou excluído em qualquer registro que desejar ", e _é o registro do 'buraco negro', para o qual envia coisas que não lhe interessam.

Para mais informações, você pode digitar :help "_ou:help deleting

Alex
fonte
-1
yy
Vx
p

Quando estiver no modo visual, xexcluirá a seleção; portanto, se você deseja excluir uma linha inteira, primeiro pressione Vpara selecionar a linha no modo visual e, em seguida, pressione xpara excluir a seleção.

Atemu
fonte
3
Isso copia a linha excluída para a área de transferência, que é exatamente o que o OP deseja evitar.
aVeryStableGenius 19/03/19
Obrigado! De alguma forma, isso funciona perfeitamente no plug-in do Mal de Emacs
Pedro Penna