En utilisant Vim, je veux souvent remplacer un bloc de code par un bloc que je viens de tirer.
Mais quand je supprime le bloc de code à remplacer, ce bloc lui-même va dans le registre qui efface le bloc que je viens de tirer. J'ai donc l'habitude de tirer, puis d'insérer, puis de supprimer ce que je ne voulais pas, mais avec de gros blocs de code, cela devient compliqué d'essayer de garder le bloc inséré et le bloc à supprimer séparément.
Quelle est donc la manière la plus simple et la plus rapide de remplacer du texte dans Vim?
- existe-t-il un moyen de supprimer du texte sans le mettre dans le registre?
- existe-t-il un moyen de dire, par exemple, "remplacer le mot suivant" ou "remplacer jusqu'au paragraphe suivant"
- ou est-ce la meilleure façon d'utiliser la fonction multi-registres?
vim
replace
vim-registers
Edward Tanguay
la source
la source
viwp
(pourw
ord).Réponses:
Pour supprimer quelque chose sans l'enregistrer dans un registre, vous pouvez utiliser le "registre des trous noirs":
Bien sûr, vous pouvez également utiliser n'importe quel autre registre qui ne contient rien de ce qui vous intéresse.
la source
"<space>_d
. L'espace est nécessaire pour taper réellement le ".dd
sur une ligne vide, il va dans le trou noir, sinon c'estdd
comme normal)."_x
yy
ou '3yy' (ou autre), ce qui le place dans le registre sans nom, mais aussi dans 0. Vous pouvez ensuite continuer à le coller avec"0p
, bien que vous l'ayez utiliséd
après cela.Oui. C'est un peu plus compliqué que de supprimer d'abord le "vieux" texte, mais:
Je commence par ..
I shift+ vsélectionnez la ligne 1, la ligne 2, 3 et 4, et supprimez-les avec la dcommande
Ensuite, je supprime les anciennes lignes 1-4 de la même manière.
Alors fais
Cela collera l'avant-dernière ligne tirée (ligne 1-4).
"3p
fera l'avant-dernier, et ainsi de suite ..Je me retrouve donc avec
Référence: documentation Vim sur registre numéroté
la source
Documents VIM: le registre numéroté 0 contient le texte de la commande yank la plus récente, sauf si la commande a spécifié un autre registre avec ["x].
Par exemple, nous tirons "foo" et supprimons "bar" - le registre 0 contient toujours "foo"! Par conséquent, "foo" peut être collé en utilisant
"0p
la source
Il est pratique d'avoir un mappage facile qui vous permet de remplacer la sélection actuelle par un tampon.
Par exemple, lorsque vous mettez cela dans votre .vimrc
puis, après avoir copié quelque chose dans le registre (c'est-à-dire avec 'y'), vous pouvez simplement sélectionner le texte que vous souhaitez remplacer, et appuyez simplement sur 'r' sur votre clavier. La sélection sera remplacée par votre registre actuel.
Explication:
la source
vmap <C-P> "_dP
Vp
remplace votre ligne actuelle par celle immédiatement tirée.d
qui est souvent utilisé pour la suppression.J'ai mis ce qui suit dans mon vimrc:
Maintenant, je tire et insère dans le registre du presse-papiers, et je n'ai plus à me soucier de ce qui se passe avec le registre par défaut. Un avantage supplémentaire est que je peux coller à partir d'autres applications avec un minimum de tracas. Je suis en train de perdre certaines fonctionnalités, je sais, mais je ne peux tout simplement pas garder trace de plus d'un registre / presse-papiers de toute façon.
la source
set clipboard=unnamed
ouset clipboard=unnamedplus
, ce qui change le presse-papiers par défaut en*
ou+
, respectivement.Pour l'exemple spécifique que vous avez donné, si je comprends bien la question, cela pourrait fonctionner:
la source
Toutes les opérations de retrait et de suppression écrivent par défaut dans le registre sans nom. Cependant, le retrait le plus récent et la suppression la plus récente sont toujours stockés (séparément) dans les registres numérotés. Le registre
0
contient le dernier coup sec. Les registres1-9
contiennent les 9 suppressions les plus récentes (1
la plus récente étant).En d'autres termes, une suppression écrase le dernier tirage dans le registre sans nom, mais il est toujours là dans le
0
registre.L'astuce du registre des trous noirs ("_dd
) mentionnée dans les autres réponses fonctionne car elle empêche d'écraser le registre sans nom, mais ce n'est pas nécessaire.Vous référencez un registre en utilisant des guillemets doubles, donc coller le texte le plus récemment tiré peut être fait comme ceci:
Ceci est une excellente référence:
la source
Pour souligner ce qu'EBGreen a dit :
Si vous collez pendant la sélection de texte, le texte sélectionné est remplacé par le texte collé.
Si vous souhaitez copier du texte, puis le coller à plusieurs emplacements, utilisez
"0p
pour coller. Le registre numéroté 0 contient le texte de la commande yank la plus récente.Vous pouvez également répertorier le contenu de tous vos registres:
Cette commande permet de déterminer plus facilement le registre que vous voulez lorsque vous faites quelque chose comme la réponse de dbr . Vous verrez également les registres /,%, #. (Voir aussi
:help registers
)Et enfin, vérifiez
cW
etcW
pour changer un mot incluant ou non un espace de fin. (L'utilisation du capitalW
inclut la ponctuation.)la source
Si vous utilisez Vim, vous aurez le mode visuel, qui est comme la sélection, mais avec la chose des modes de séparation qui est la base de vi / vim.
Ce que vous voulez faire, c'est utiliser le mode visuel pour sélectionner la source, puis tirer, puis utiliser à nouveau le mode visuel pour sélectionner la portée de la destination, puis coller dans le texte à partir du tampon par défaut.
Exemple:
Dans un fichier texte avec:
avec la séquence suivante:
ggVjyGVkp
vous terminerez par:Expliqué:
gg
: aller à la première ligneV
: démarrer le mode visuel avec des lignes entièresj
: descendre d'une ligne (avec la sélection commencée sur les lignes précédentes, la sélection augmente d'une ligne vers le bas)y
: tirez sur le tampon par défaut (les deux lignes sélectionnées, et il vous sort automatiquement du mode visuel)G
: aller à la dernière ligneV
: démarrer le mode visuel (comme précédemment)k
: remonter d'une ligne (comme précédemment, avec le mode visuel activé, cela augmente la sélection d'une ligne)p
: coller (avec la sélection sur les deux dernières lignes, il remplacera ces lignes par ce qu'il y a dans le tampon - les 2 premières lignes dans ce cas)Cela a le petit inconvénient qui place le dernier bloc sur le tampon, donc ce n'est pas souhaitable pour les collages répétés de la même chose, donc vous voudrez enregistrer la source dans un tampon nommé avec quelque chose comme
"ay
(dans un tampon appelé "a ") et collez avec quelque chose comme"ap
(mais alors si vous programmez, vous ne voudrez probablement pas coller plusieurs fois mais créer une fonction et l'appeler, non? DROIT ?).Si vous n'utilisez que vi, vous devrez utiliser des marques invisibles à la place du mode visuel,
:he mark
pour en savoir plus, je suis désolé mais je ne suis pas très bon avec cette chose des marques invisibles, je suis assez contaminé par le mode visuel.la source
Pour «remplacer le mot», essayez
cw
en mode normal.Pour «remplacer le paragraphe», essayez
cap
en mode normal.la source
c}
en mode normal.Une solution invasive minimale pour les paresseux:
Le registre
0
contient toujours le dernier coup sec (comme Rafael , alex2k8 et idbrii l' ont déjà mentionné). Malheureusement, la sélection du registre0
tout le temps peut être assez ennuyeuse, donc ce serait bien si elle étaitp
utilisée"0
par défaut. Ceci peut être réalisé en mettant les lignes suivantes dans votre.vimrc
:La première ligne associe chaque
p
trait à"0p
. Cependant, cela empêchep
d'accéder à d'autres registres. Par conséquent, tous lesp
traits avec un registre explicitement sélectionné sont mappés à l'expression de ligne de commande équivalente dans la boucle for. La même chose est faite pourP
.De cette façon, le comportement standard est préservé, à l'exception de l'implicite
p
et desP
traits, qui utilisent désormais le registre0
par défaut.Astuce 1: La commande cut est maintenant
"0d
au lieu de justed
. Mais comme je suis paresseux, c'est beaucoup trop long pour moi;) Par conséquent, j'utilise le mappage suivant:La touche de repère est
\
par défaut, vous pouvez donc facilement couper du texte en tapant\d
ou\D
.Astuce 2: le délai d'expiration par défaut pour les mappages multi-touches est assez court. Vous voudrez peut-être l'augmenter pour avoir plus de temps lors de la sélection d'un registre. Voir
:help timeoutlen
pour plus de détails, j'utilise:la source
Eh bien, commencez par cette commande:
Ensuite, vous vous rendrez compte que vous pouvez supprimer dans un registre spécifique. De cette façon, vous ne modifierez pas ce qui se trouve dans votre registre par défaut.
la source
["x]d{motion} Delete text that {motion} moves over [into register x]
- Vim:h d
Ma situation: en
Normal
mode, lorsque je supprime des caractères à l'aide de lax
touche, ces suppressions écrasent mon dernier registre - compliquant les modifications où je veux supprimer des caractères en utilisantx
et collant quelque chose que j'ai dans mon registre le plus récent (par exemple, coller le même texte à deux ou plus d'endroits).J'ai essayé la suggestion dans la réponse acceptée (
"_d
), mais cela n'a pas fonctionné.Cependant, à partir de la réponse / des commentaires acceptés sur /vi/122/performing-certain-operations-without-clearing-register , je l'ai ajouté à mon
~/.vimrc
, qui fonctionne (vous devrez peut-être redémarrer Vim ):Autrement dit, je peux maintenant exécuter mes commandes normales yank (
y
), delete (d
) et paste (p
) - et les caractères que je supprime en utilisantx
ne remplissent plus les registres les plus récents.la source
Le texte supprimé, en mode insertion, ne va pas dans le registre par défaut.
la source
Les deux solutions que j'utilise dans les bons contextes sont;
VISUAL
mode Vims puis collez le registre.Je l'utilise principalement par habitude car je n'ai trouvé la deuxième solution que beaucoup plus tard, par exemple
<ctrl>+<p>
pour remplacer le registre numéroté précédent par celui que vous venez de coller.Fondamentalement, vous allez coller comme vous le feriez, mais lorsque vous réalisez que vous avez depuis écrasé le registre par défaut, perdant ainsi ce que vous vouliez réellement coller, vous pouvez
<C-P>
le trouver et le remplacer dans l'historique YankRing!L'un d'eux doit avoir des plugins ...
la source
J'ai trouvé une cartographie très utile pour votre objectif:
Le texte supprimé est placé dans le "registre des trous noirs" et le texte retiré demeure.
Source: http://vim.wikia.com/wiki/Replace_a_word_with_yanked_text
la source
Dans la version Windows (probablement sous Linux également), vous pouvez utiliser le tampon copier / coller du système en utilisant
"*y
(c'est-à-dire précédant votre commande yank avec des guillemets doubles et un astérisque).Vous pouvez ensuite supprimer les lignes remplaçables normalement et coller le texte copié à l'aide de
"*p
.la source
Je fais souvent une erreur en suivant les commandes pour 'y'ank puis' "_d'elete dans un trou noir puis 'p'aste. Je préfère' y'ank, puis supprimer comme je veux, puis '" 0p' de le registre 0, où le dernier texte copié est poussé.
la source
Pour les utilisateurs emacs-evil, la fonction
(evil-paste-pop)
peut être déclenchée après le collage et passe en revue les entrées précédentes dans le kill-ring. En supposant que vous l'ayez lié à<C-p>
(par défaut dans Spacemacs), vous frapperiezp
suivi par autant<C-p>
que nécessaire.la source
Pour les utilisateurs de Dvorak, une méthode très pratique consiste à supprimer simplement le texte inutile dans le registre "1 au lieu du" _ registre de trou noir, ne serait-ce que parce que vous pouvez appuyer sur "+ 1 avec la même pression de décalage et un mouvement de petit doigt rapide puisque 1 est la clé juste au-dessus "dans Dvorak (PLUS d est d'autre part, ce qui rend toute la commande rapide comme l'enfer).
Alors bien sûr, le "1 registre pourrait être utilisé pour d'autres choses à cause de sa commodité, mais à moins que vous ayez un objectif plus courant que de remplacer du texte, je dirais que c'est une assez bonne utilisation du registre.
la source
Pour ceux d'entre vous qui sont principalement intéressés à ne pas écraser le registre sans nom lorsque vous remplacez un texte via la sélection virtuelle et le coller.
Vous pouvez utiliser la solution suivante qui est facile et qui fonctionne le mieux pour moi:
xnoremap <expr> p 'pgv"'.v:register.'y'
C'est à partir des réponses (et commentaires) ici: Comment coller sans écraser le registre
Il a d'abord dépassé la sélection, puis la sélection avec le nouveau texte est à nouveau sélectionnée (gv). Maintenant, le dernier registre utilisé en mode visuel (normalement le registre sans nom mais fonctionne également sans effet secondaire si vous utilisez un autre registre pour le coller). Et puis tirez à nouveau la nouvelle valeur dans le registre.
PS: Si vous avez besoin d'une variante plus simple qui fonctionne également avec le plugin intellj idea vim-simulation, vous pouvez prendre celle-ci (inconvénient: écraser le registre sans nom même si un autre registre a été donné pour le collage):
vnoremap p pgvy
la source
Pour ceux qui utilisent JetBrans IDE (PhpStorm, WebStorm, IntelliJ IDEA) avec IdeaVim. Vous pouvez rencontrer des problèmes lors du remappage
nnoremap d "_d
et de son utilisation pour supprimer une lignedd
. Solution possible pour vous:nnoremap dd "_dd
Il y a des problèmes sur youtrack, veuillez voter pour eux: https://youtrack.jetbrains.com/issue/VIM-1189 https://youtrack.jetbrains.com/issue/VIM-1363
la source
La préférence occasionnelle de Vim pour la complexité par rapport à l'aspect pratique contraint l'utilisateur à appliquer des registres pour copier / supprimer des actions - quand le plus souvent, on veut juste coller ce qui a été copié et "oublier" ce qui a été supprimé.
Cependant, au lieu de combattre les registres compliqués de vim, rendez-les plus pratiques: choisissez un registre "par défaut" pour stocker votre dernière suppression. Par exemple, envoyez des suppressions au registre d (en laissant ac ouvert pour une utilisation ad-hoc; d est un joli mnémonique):
Cette approche empêche les suppressions de secouer les MAIS, mais ne perd pas l'enregistrement de la suppression - on peut coller (revenir) ce qui a été supprimé au lieu de le perdre dans un trou noir (comme dans la réponse acceptée). Dans l'exemple ci-dessus, ce rappel est effectué avec deux mappages p de leader. Un avantage de cette approche est qu'elle vous donne la possibilité de choisir quoi coller: (a) ce qui vient d'être retiré, ou (b) ce qui vient d'être supprimé.
la source
les registres 0 à 9 sont les dernières choses que vous tirez ou coupez, etc., et N'INCLUREZ PAS les choses supprimées, etc. Si vous tirez / coupez quelque chose, c'est également dans le registre 0, même si vous dites des choses supprimées toute la journée après cela, enregistrez 0 est toujours le dernier truc que vous avez tiré / coupé.
yiw # va au registre par défaut et au registre 0
il tire le mot dans lequel se trouve le curseur
les éléments supprimés, etc. iront au registre par défaut, mais PAS au registre 0
en mode standard:
"0p #put le contenu du registre 0
en mode insertion:
ctrl-r 0 #put le contenu du registre 0
J'avais aussi un ami qui tirait / coupait toujours pour enregistrer x lol.
la source