Dans vim
, j'utilise yy
et p
tout le temps sur les lignes de jaune et de coller. Cependant, si je veux remplacer une ligne plusieurs endroits dans le fichier, je ne peux pas utiliser yy
p
dd
p
parce que le dd
Supprime la ligne dans le presse-papiers/registre. Bien que je devrais probablement savoir comment utiliser des registres mieux, je me sens probablement un moyen de p
qui remplace la ligne actuelle.
Par défaut, les commandes de pâte utilisent le "
("Sans nom") Inscrivez-vous . Effectivement, toute commande qui écrit à un registre écrit également sur le registre Sans nom, alors les arnanes, la suppression et les changements qui les affectent. C'est pourquoi votre séquence de pâte à yank-supprimée colle le texte supprimé au lieu du texte tiré.
Les 0
registre peut aider ici. Toutes les commandes qui ne spécifient pas un registre mettent le texte tiré dans le registre 0
(en plus de "
). Il n'est pas affecté par la suppression ou la modification des opérations. Vous pouvez donc l'utiliser pour coller une ligne timie plusieurs fois, même si vous faites des suppresses ou des modifications intermédiaires.
yy
: registres 0
et "
Les deux ont maintenant la ligne timide.dd
: registre "
a maintenant la ligne supprimée, mais inscrivez-vous 0
a toujours la ligne timie."0P
: Collez la ligne initialement tirée du registre 0
.dd"0P
(comme ci-dessus)(En raison de la façon dont le positionnement du curseur fonctionne lors du remplacement de la dernière ligne d'un tampon, vous voudrez utiliser "0p
à la place de "0P
.)
Ceci est très proche de la réponse de Bruce Ediger , sauf que vous n'avez pas à spécifier un registre lorsqu'il est initialement tiré. L'utilisation d'un ou de plusieurs registres nommées peut être très pratique si vous en avez besoin (par exemple), remplacez certaines lignes avec AAA
, mais d'autres lignes avec BBB
(Met AAA
in Register a
, et BBB
dans le registre b
(ou laissez-les dans le registre 0
), puis les coller en conséquence).
Vous pouvez également coller de 0
En mode Visual sage en ligne (V
) pour enregistrer une frappe: V"0p
.
Si vous n'aimez pas avoir à taper "0
, vous pourriez trouver une cartographie plus pratique:
noremap <Leader>p "0p
noremap <Leader>P "0P
vnoremap <Leader>p "0p
Une autre approche consiste à supprimer à la _
("Blackhole") Inscrivez-vous . Lorsque vous le supprimez, le "
Register n'est pas affecté, votre séquence de pâte à yank-Supprimer peut toujours coller le texte tiré du texte non nommé.
yy
: registre 0
et "
Les deux ont maintenant la ligne timide."_dd
: Aucun changement aux registres.P
: coller le texte initialement tiré du registre "
.Encore une fois, vous pourriez trouver une cartographie plus pratique:
noremap <Leader>d "_d
On dirait que Kevin a une très bonne réponse, mais si vous souhaitez poser des yeux sur chaque ligne que vous supprimez, remplacez-la, une solution légèrement différente existe.
1. Find line to copy in some select number of places.
2. Put cursor on it.
3. "ayy copies that line into register 'a'.
4. Find line to replace. Put cursor on it.
5. dd deletes that line. "aP inserts the copied line above where the cursor now lies.
6. Repeat steps 4 and 5.
Ce type de recette vous permet d'utiliser la correspondance des motifs pour trouver des lignes pour supprimer et remplacer, et vous pouvez revenir au début du fichier (1g) et sur la recherche vers l'avenir aussi souvent que vous le souhaitez. Si j'ai 2 lignes ou plus pour rassembler et placer à plusieurs reprises, j'utilise "ayy
Pour la première ligne, "byy
Pour le second, "cyy
Pour la troisième, et ainsi de suite. J'ai pris une habitude (qui réduit la généralité de la recette) pour diminuer la charge mentale sur moi.
Il y a quelques façons de le faire avec :s
, en fonction de la quantité de taper que vous voulez faire. Le moyen le plus simple est une recherche simple et remplacer:
:%s/find this line/replace with this/
Les %
recherchera l'ensemble du fichier et remplacera toutes les occurrences.
Si c'est trop taper pour vous, vous pouvez youler la chaîne de destination (yy
) et utiliser le "
(par défaut) Inscrivez-vous, insérez-le avec Ctrl+r":
:%s/<ctrl+r><">/replacement/
Ou, si vous avez une copie de la chaîne de remplacement, vous pouvez y remuer les deux dans des registres distincts avec "ayy
et "byy
Pour y remuer dans les registres a
et b
registres (vous pouvez utiliser n'importe quelle lettre pour vos registres). Puis utiliser Ctrl+ra et Ctrl+rb les coller dans la recherche et remplacer les champs.
Pas à une bruce d'un montant, mais si vous voulez vérifier les lignes avant de les remplacer, il suffit d'ajouter l'option c
:
:%s/find this line/replace with this/c
Vous pouvez utiliser V
pour mettre en surbrillance la ligne que vous souhaitez remplacer en mode visuel puis appuyez sur pp
pour coller sur cette ligne.
Cela ajoute seulement une frappe de frappe, il semble donc une assez bonne solution.
J'utilise le c
, "changement", commande assez fréquemment pour ce genre de chose, combinée à une recherche régulière. Vous pouvez rechercher le fichier pour chaque ligne/pièce de texte qui vous intéresse, puis utilisez consécutif n.
commandes (n
pour ensuite, puis .
Pour répéter le dernier changement.)
/^hello
- trouver la ligne commençant par bonjour;
[.____] c$goodbye
- changer de ligne au revoir;
[.____] n.
- Répéter la recherche, répéter le changement
Si vous souhaitez modifier la ligne en une fois dans le fichier, vous pouvez simplement le copier dans votre mémoire tampon d'entrée (en supposant que votre graphique le permet) puis de coller pour obtenir le contenu de la première commande de changement.
Comme pour tout ce que VI, c'est une bonne idée d'avoir beaucoup d'options dans votre poche, en fonction du type de modification que vous voulez faire.