Comment supprimer (pas couper) dans Vim?

145

Comment puis-je supprimer une ligne sans la mettre dans ma mémoire tampon par défaut?

Exemple:

line that will be copied.

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

Ce que j'essaye de faire:

yy
dd
p

Mais Vim remplace la chaîne copiée récemment par la chaîne supprimée (coupée). Je sais que je peux utiliser des tampons comme, "1yy, ddpuis "1p, mais j'oublie toujours de mettre la chaîne copiée dans un tampon puis je dois coller mes contenus première (ligne qui sera copiée) puis supprimer ce que je veux (ligne que je veux à remplacer par le précédent.)

Comment puis-je vraiment supprimer un texte dans Vi (m) sans le copier?

Une autre question connexe est de savoir comment puis-je supprimer un mot en mode insertion? Je veux quelque chose de similaire à Ctrl+ w.

MaikoID
la source

Réponses:

130

Utilisez le « registre de trou noir », "_à quelque chose de vraiment delete: "_d.
Utilisez "_dPpour coller quelque chose et le garder disponible pour un collage ultérieur.

Pour la deuxième question, vous pouvez utiliser <C-o>dw. <C-o>est utilisé pour exécuter une commande normale sans quitter le mode insertion .

Vous pouvez bien sûr configurer vos propres mappages pour enregistrer la saisie. J'ai ceux-ci:

nnoremap <leader>d "_d
xnoremap <leader>d "_d
xnoremap <leader>p "_dP
romainl
la source
thx, vous répondez à mes deux questions. Mais je n'ai pas compris comment ces commandes noremap m'aideraient. Suis-je en train de perdre la fonction de coupe, non?
MaikoID
3
Non, dtoujours "coupe" et p"colle" encore, tandis que <leader>dsupprime pour de vrai et <leader>pjette le texte sélectionné et colle le contenu du registre par défaut. <leader>pme permet de coller le même texte plusieurs fois sans avoir à utiliser des registres nommés.
romainl
119

Le registre des trous noirs "_ fera l'affaire, mais il existe une meilleure solution:

Lorsque vous entrez la ligne avec la pcommande, vous collez le contenu du registre par défaut (volatil) "", qui a été écrasé par dd. Mais vous pouvez toujours coller à partir du registre Yank (non volatile) "0, qui ne sera pas écrasé par la commande de suppression dd.

Voici donc les commandes que vous souhaitez utiliser selon votre exemple:

yy
dd
"0p
cutemachine
la source
1
Super, cela devrait être la réponse acceptée. Il est beaucoup plus facile de spécifier manuellement un registre chaque fois que je veux coller que de continuer à spécifier un registre chaque fois que je supprime quelque chose.
JShorthouse
44

C'est l'une des choses que je n'aimais pas à propos de vim ... J'ai fini par cartographier ddle registre des trous noirs dans mon .vimrc et la vie a été belle depuis:

nnoremap d "_d
vnoremap d "_d
kprobst
la source
6
alors comment coupez-vous?
VitalyB
11
v/Vavec xest également coupé. Et couper avec xest également cohérent avec Ctrl + xn'importe quel système d'exploitation.
WesternGun
22

les mappages suivants produiront:

  • d => "supprimer"
  • leader d => "couper"
nnoremap x "_x
nnoremap d "_d
nnoremap D "_D
vnoremap d "_d

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

De plus, c'est une bonne pratique de définir la clé "leader" sur une virgule, par exemple:

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

ces 2 extraits feront de ", d" votre nouvelle commande de coupe.

Si vous souhaitez utiliser ces mappages ensemble avec une configuration de presse-papiers système partagé, voir plus de détails sur https://github.com/pazams/d-is-for-delete

pazams
la source
J'aurais aimé pouvoir voter pour cette réponse plus d'une fois - j'utilisais la réponse de kprobst, mais ensuite pour couper une ligne, j'ai dû utiliser yyddce qui était un peu insoutenable sur mes doigts ;-).
Tahir Hassan
1
idée intellij agissant si bizarre après cela. dd ne fait rien. , d ne fait rien
s1n7ax
J'aime beaucoup la solution. Une chose qui n'a pas fonctionné pour moi - c'est de couper des lignes avec ,dd. Après avoir ajouté, nnoremap <leader>dd ""ddil a commencé à fonctionner
Alexey
8

Vous pouvez utiliser "_dpour empêcher les choses d'écraser votre texte copié. Vous pouvez stocker du texte retiré ou supprimé dans n'importe quel registre avec lequel vous voulez ", et _c'est le registre «trou noir», où vous envoyez des choses dont vous ne vous souciez pas.

Pour plus d'informations, vous pouvez taper :help "_ou:help deleting

Alex
la source
-1
yy
Vx
p

En mode visuel, xsupprimera la sélection, donc si vous souhaitez supprimer une ligne entière, appuyez d'abord sur Vpour sélectionner la ligne en mode visuel, puis appuyez sur xpour supprimer la sélection.

Atemu
la source
3
Cela copie la ligne supprimée dans le presse-papiers, ce que OP veut éviter.
aVeryStableGenius
Merci! D'une manière ou d'une autre, cela fonctionne parfaitement sur le plugin Evil d'Emacs
Pedro Penna