J'aime vim, mais un des pièges communs est:
É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?
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
.
Votre ligne tirée doit toujours être dans le registre 0. Alors
"0p
coller la ligne (et effacer quand vous voulez)
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:
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é
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".
" 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
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.
Pour votre question spécifique, comme demandé, ne pourriez-vous pas simplement échanger l'ordre des 2 dernières étapes?
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.
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
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
Vous pouvez également essayer le script suivant: ReplaceWithRegister à l'adresse vim.org/scripts/
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é.
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
ici) et supprimer: "1d
ou "1x
ou même "1c
"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.