web-dev-qa-db-fra.com

Un moyen de supprimer in vim sans écraser votre dernier virement?

J'aime vim, mais un des pièges communs est:

  • tirer une ligne
  • allez là où vous voudriez le coller
  • supprimer ce qui est là
  • collez votre coup sec, seulement pour découvrir qu'il colle ce que vous venez de supprimer

Évidemment, le flux de travail est effacer en premier, puis en second. Mais ce serait vraiment bien si je n'avais pas à . Quelqu'un a un truc pour ça? Est-ce que vim a un tampon de collage qui fonctionne bien ou y at-il un paramètre .vimrc que je peux changer?

260
tedsuo

Passer au _ enregistrer, le trou noir.

Pour supprimer une ligne sans la coller dans les registres:

"_dd

Voir également :help registers .

Il est probablement plus sûr, si vous voulez coller quelque chose encore et encore, de le glisser dans un registre "nommé".

"aY

Trace une ligne dans le registre a. Collez-le avec "ap.

301
dash-tom-bang

Votre ligne tirée doit toujours être dans le registre 0. Alors

"0p

coller la ligne (et effacer quand vous voulez)

169
mb14

Toutes les opérations yank et delete écrivent dans le registre sans nom par défaut. Cependant, les suppressions les plus récentes et les plus récentes sont toujours stockées (séparément) dans les registres numérotés. Le registre 0 contient le dernier tiret . Les registres 1-9 maintient les 9 suppressions les plus récentes (avec 1 étant le plus récent).

En d'autres termes, une suppression remplace le dernier tirage dans le registre sans nom, mais il est toujours présent dans le 0 register. Le truc du blackhole-register ("_dd) mentionné dans les autres réponses fonctionne car il évite d’écraser le registre non nommé, mais ce n’est pas nécessaire.

Vous faites référence à un registre en utilisant des guillemets, vous pouvez donc coller le texte le plus récemment extrait comme suit:

"0p

C'est une excellente référence:

84
Wayne Burkett

une autre possibilité est:

tirez vos lignes comme vous le feriez normalement

allez à l'endroit où vous voulez les coller, entrez en mode ligne visuelle (V)

sélectionnez les lignes que vous souhaitez remplacer

appuyez sur p pour coller vos lignes.

cela a aussi l'avantage supplémentaire, que le tampon est "échangé" avec le contenu remplacé

39
knittl

J'utilise le mappage suivant pour faciliter la suppression du registre des trous noirs:

nnoremap R "_d

De cette façon, dd devient Rd et d$ devient R$. Notez que R est normalement lié au mode remplacement, mais j’ai constaté que je ne l’avais jamais utilisé. C’était donc la clé la plus facile à retenir pour une fonctionnalité "vraiment supprimer".

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

J'ai écrit ce plugin (yankstack.vim) pour résoudre ce problème. Cela vous donne quelque chose comme le groupe de contrôle d'Emacs pour vim. Vous pouvez extraire ou supprimer plusieurs choses, faire une pâte, puis parcourir l’historique de votre texte. Je trouve qu'il est plus facile que de devoir me souvenir du registre dans lequel j'ai tiré quelque chose.

Dans mon .vimrc, j'ai ces mappages:

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

ce qui me permet d'appuyer sur ALT-p ou ALT-SHIFT-p pour faire un aller-retour dans mon historique de collage.

5
max

Pour votre question spécifique, comme demandé, ne pourriez-vous pas simplement échanger l'ordre des 2 dernières étapes?

  • ligne de tir sec (identique)
  • déplacer vers un nouvel emplacement (identique)
  • coller la ligne tirée (était l'étape 4)
  • supprimer la ligne que vous ne voulez pas (était l'étape)

Certes, j’utilise habituellement un registre nommé pour ce genre de chose, mais la solution est parfois plus simple que ce qui me vient à l’esprit.

4
Dan

Vous pouvez utiliser des registres: "<register><command>

Par exemple.:

Ceci insère une ligne dans le registre a, supprime une ligne différente, puis colle le registre a.

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

Je trouve tous ces combos essentiels fastidieux. Au lieu de cela, j’ai écrit une fonction permettant d’activer et de désactiver le comportement de "l'effet secondaire" de vim consistant à écraser les tampons des opérations de suppression. De cette façon, vous pouvez simplement désactiver, supprimer librement, puis réactiver lorsque vous avez terminé.

Voir ma réponse ici: https://stackoverflow.com/a/12649560/778118

Pour l'utiliser, il suffit de le mettre dans votre .vimrc

1
Magnus

Vous pouvez également essayer le script suivant: ReplaceWithRegister à l'adresse vim.org/scripts/

1
dmedvinsky

Si vous êtes un utilisateur pervers, vous pouvez envisager de remapper X pour faire l'équivalent de "_d. Cependant, perfectionner la mise en œuvre était un peu délicat pour moi. Néanmoins, j'ai constaté 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)
)

s'intègre très bien. Par exemple, taper XX fonctionnera de manière analogue à dd, de même que X $ à d $, X0 à d0, etc.

Si vous êtes curieux de savoir comment cela fonctionne, "95" représente le registre "_", il vous suffit donc de rediriger votre appel pour le supprimer, comme si "_ avait été le registre enfoncé.

0
RussellStewart

Le truc, c'est que vous savez que vous voulez prendre quelque chose et que vous le déplacez, et que vous utilisez le premier registre "paresseux" (qui est remplacé par ce que vous venez de supprimer).

Vous devez apprendre à "couper" dans vim.

Avant de supprimer, spécifiez tout registre différent du " une. Astuce: consultez vos registres avec :reg

maintenant, vous sélectionnez un nouveau registre en appuyant sur " avant toute commande (en mode commande, évidemment)

  1. sélectionnez ce que vous voulez "couper" (ou à l'étape 2, spécifiez une plage)
  2. Changer le registre en quelque chose (1 ici) et supprimer: "1d ou "1x ou même "1c
  3. allez au nouvel endroit, supprimez-en d'autres
  4. maintenant vous êtes prêt à coller ce que vous avez coupé et stocké dans le registre 1: "1p ou "1P

terminé. cela a aussi l’avantage de résoudre le cas d’usage: supprimez 5 choses différentes d’un même endroit, et chaque pièce ira à une destination différente ... il suffit d’en insérer une dans "1 un autre dans "2 et ainsi de suite ... allez à chaque destination et collez-les.

0
gcb