web-dev-qa-db-fra.com

Comment puis-je coller (écraser) avec Vim?

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 yypddp 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.

33
cwd

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.

  1. yy: registres 0 et " Les deux ont maintenant la ligne timide.
  2. Passer à une ligne à remplacer.
  3. 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.
  4. Passer à la ligne suivante pour remplacer.
  5. 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é.

  1. yy: registre 0 et " Les deux ont maintenant la ligne timide.
  2. "_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
31
Chris Johnsen

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.

11
Bruce Ediger

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
5
Kevin

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.

2
mouche

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.

2
rghome