Vim: Remplacer une ligne par une autre tirée avant

Au moins une fois par jour, j’ai la situation suivante:

A: This line should also replace line X ... X: This is line should be replaced 

Je crois que je n’effectue pas cette tâche efficacement.

Ce que je fais:

  • Allez à la ligne A: AG
  • Yank line A: yy
  • Allez à la ligne X: XG
  • Ligne de pâte A: P
  • Passer à l’ancienne ligne: j
  • Supprimer l’ancienne ligne: dd

Cela a l’inconvénient supplémentaire que la ligne X est maintenant dans le registre par défaut, ce qui est ennuyeux si je trouve une autre ligne qui devrait être remplacée par A. Yanking to et coller depuis un registre supplémentaire ( “ayy “, aP ) rend cette tâche simple même moins efficace.

Mes questions:

  • Ai-je manqué une commande Vim intégrée pour remplacer une ligne déjà tirée?
  • Sinon, comment puis-je lier ma propre commande qui laisse (ou restaure) la ligne bloquée dans le registre par défaut?

Ce que je ferais:

  1. aG
  2. Y
  3. xG
  4. Vp

Vous n’êtes pas obligé de quitter le mode normal, mais vous ne faites que tirer la ligne. Vous pouvez cependant utiliser V"0p qui mettra toujours la ligne tirée à l’étape 2.

Vp : sélectionnez la ligne, collez ce qui a été tiré

Cela a l’inconvénient supplémentaire que la ligne X est maintenant dans le registre par défaut, ce qui est agaçant si je trouve une autre ligne qui devrait être remplacée par A.

Pour supprimer du texte sans affecter les registres normaux, vous pouvez utiliser le registre de trous noirs "_ :

 "_dd 

Je voudrais utiliser le mode ligne de commande (Ex) et faire les deux commandes suivantes

 :XmA :Ad 

Cela déplace simplement la ligne X juste en dessous de A, puis supprime les mouvements A qui s’alignent

Par exemple

 :7m3 :3d 
  1. yy
  2. j (déplacez-vous vers la ligne que vous souhaitez remplacer), puis
  3. Vp (v majuscule puis p, remplacera par le contenu bloqué)
  1. Aller au début de la première ligne.

  2. y , $ – copie la ligne sans le saut de ligne à la fin

  3. Aller au début de la ligne cible.

    1. V , p – remplace une seule ligne cible

    2. c , c , Ctrl r , 0 , Echap – remplace la ligne cible par la valeur originale

  4. Aller au début de la ligne cible suivante.

  5. . – répète la commande émise en 4.2.

Remarques:

  • 4.1 est y , $ car si vous faites y , y ou Y, vous copiez le saut de ligne, et Ctrl r , 0 ajoute réellement le saut de ligne sous votre ligne cible.

  • 4.2 remplace V p , qui ne fonctionne pas avec repeat car techniquement la dernière action est delete, donc . supprimerait simplement une ligne.

  • Si quelqu’un sait comment “remplacer la ligne actuelle avec le registre” du mode EX (ligne de commande), j’aimerais avoir de vos nouvelles (et savoir où vous avez trouvé la documentation). Il peut y avoir une commande EX reproductible qui est plus rapide que 4.2 et / ou ne comporte pas l’avertissement de retour à la ligne.

Vous pouvez l’utiliser avec le mode visuel.

  • Allez à la ligne A: A G
  • Sélectionnez la ligne avec le mode visuel: V ESC
  • aller à la ligne X: X G
  • Entrez le mode de substitution pour la ligne: S
  • Collez la ligne que vous avez copiée: shift + insert (ou tout autre object que vous avez mappé pour le coller dans le presse-papiers).

Voici ce que je ferais

  • Déplacez le début de la ligne A, A G (où A est un numéro de ligne évidemment)
  • Ligne Yank à un certain registre, par exemple a (sans nouvelle ligne). Tapez " a y $
  • Déplacer pour insérer une ligne, X G
  • Ligne de remplacement, S
  • Insérer du registre a, Ctrl-R a

En me basant sur les réponses suggérant d’utiliser Vp ou VP pour coller une ligne – pour éviter de changer le contenu du registre yank, je trouve que la commande la plus ergonomique est simplement:

VPY

Vous pouvez utiliser ces commandes en mode normal:

 :AmX | Xd 

la commande m est pour m[ove] , ce qui déplace le numéro de ligne A après le numéro de ligne X, si vous voulez copier au lieu de déplacer la ligne, utilisez co[py] . la commande d est pour d[elete] .

Vous pouvez déplacer (copier en utilisant co ) une gamme de lignes en utilisant

 :start,end m X 
  1. : ay (où a est le numéro de ligne. Exemple: 20y). Cela tire une ligne (jeu de mots).
  2. Vp

Je trouve plus facile d’utiliser la commande Ex pour cela; ex. déplacer les lignes 9 à 46:

  :46|9m.|-1d 

Cela déplace le curseur sur la ligne 46, déplace la ligne 9 sous le courant, puis supprime la ligne précédente (puisque la ligne déplacée est la ligne courante).

Ou en utilisant des marques, en utilisant la marque «a»:

 :46ma a|9m'a|'ad 

Je dois souvent y append une ligne et la remplacer à plusieurs endroits, chacun ayant une valeur différente (ce qui signifie que je ne peux pas faire une expression régulière).

Y pour tirer la ligne originale désirée

puis sur chaque ligne que vous souhaitez remplacer, V p zéro Y

À la lumière du récent commentaire de cicld (merci!), Je constate que je n’ai pas bien saisi le problème original. Déplacer la ligne n’est pas approprié, mais la copie est (puisque la ligne est tirée).

 :1t20:20d_ 
  1. Copiez la 1ère ligne ( :t commande :t est un alias pour :copy ) après la ligne 20 (le placera sur la ligne 21)

  2. Supprimer la ligne 20 en plaçant la ligne supprimée dans le registre “blackhole” ( _ )

Comme mentionné dans le commentaire récent, cela n’affectera pas la position actuelle du curseur.

Vous pouvez aussi faire:

 Vy (in normal mode at the line you want to copy) Vp (in normal mode at the line you want to replace) 
  • Ne crée pas d’espaces ou d’extrémités de ligne.
  • Le curseur est placé au début du texte copié.

Les mêmes clés peuvent être utilisées pour retirer / coller plusieurs lignes.

 V (in normal mode at what you want to yank) (use jk to move the selection) y (to yank the selection) V (in normal mode at where you want to paste) (use jk to move the selection) p (to replace the selection with the yanked lines) 

Je voudrais simplement utiliser le registre “trou noir”:

donné:

nnoremap “_dd

la solution serait:

yy