web-dev-qa-db-fra.com

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 ne remplis pas cette tâche efficacement.

Ce que je fais:

  • Aller à la ligne A:AG
  • Yank ligne A: yy
  • Aller à la ligne X:XG
  • Coller la ligne A:P
  • Passer à l'ancienne ligne: j
  • Supprimer l'ancienne ligne: dd

Cela a l’inconvénient supplémentaire que la ligne X soit maintenant dans le registre par défaut, ce qui est gênant si je trouve une autre ligne qui devrait être remplacée par A. Coller/coller depuis un registre supplémentaire ( "ayy ," aP ) rend cette tâche simple encore moins efficace.

Mes questions:

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

Ce que je ferais:

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

Vous n'êtes pas obligé de quitter le mode normal, mais il fait tire la ligne. Vous pouvez cependant utiliser V"0p qui mettra toujours la ligne tirée à l'étape 2.

80
icecrime

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

83
Dorian

Cela a l'inconvénient supplémentaire cette ligne X est maintenant dans la valeur par défaut inscrivez-vous, ce qui est gênant si je trouve une autre ligne qui devrait être remplacée avec un.

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

"_dd
41
Eugene Yarmash

Je voudrais utiliser le mode Commandline (Ex) et faire les deux commandes suivantes

:XmA
:Ad

Cela déplace simplement la ligne X juste en dessous de A, puis supprimer A déplace cette ligne vers le haut.

Par exemple

:7m3
:3d
9
ericgamliel
  1. yy
  2. j (déplacez vers la ligne que vous souhaitez remplacer), puis
  3. Vp (v majuscule puis p, sera remplacé par le contenu tiré)
8
Mariano Anaya
  1. Se déplacer au début de la première ligne.

  2. y$ - copier la ligne sans le saut de ligne à la fin

  3. Déplacer au début de la ligne cible.

    1. Vp - remplacer une seule ligne cible

    2. ccCtrlrEsc - remplace la ligne cible par le tir d'origine

  4. Se déplacer au début de la ligne cible suivante.

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

Remarques:

  • 4.1 est y$ parce que si tu le fais yy ou Y vous allez copier le saut de ligne, et Ctrlr, ajoute réellement le saut de ligne en dessous de votre ligne cible.

  • 4.2 remplace Vp, qui ne fonctionne pas avec répéter car, techniquement, la dernière action est la suppression; . serait simplement supprimer une ligne.

  • Si quelqu'un sait comment émettre ‘remplacer la ligne en cours par l’enregistrement’ à partir 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 répétable EX qui est plus rapide que 4.2 et/ou qui n’a pas l’avertissement de saut de ligne.

6
Jordan Morris

Vous pouvez l'utiliser avec le mode visuel.

  • Aller à la ligne A: AG
  • Sélectionnez la ligne en mode visuel: VESC
  • aller à la ligne X: XG
  • Entrez le mode de substitution pour la ligne: S
  • Collez la ligne que vous avez copiée: shift+insert (ou quel que soit le mappage que vous ayez pour le coller dans le presse-papiers).
4
Nathan Fellman

En me basant sur les réponses suggérant d'utiliser Vp ou VP pour coller sur une ligne - pour éviter de modifier le contenu du registre yank, la commande la plus ergonomique est simplement la suivante:

VPY

3
RichardW

Voici ce que je ferais

  • Déplacer le début de la ligne A, AG (où A est évidemment un numéro de ligne)
  • Yank ligne à un certain registre, par exemple a (sans nouvelle ligne). Type "ay$
  • Déplacer pour insérer une ligne, XG
  • Ligne de remplacement, S
  • Insérer du registre a, Ctrl-Ra
3
Brian Rasmussen

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 ni de fins de lignes.
  • Le curseur est placé au début du texte copié.

Les mêmes clés peuvent être utilisées pour tirer/coller plus d'une ligne.

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)
2
Kozmonaut

À la lumière du récent commentaire de cicld (merci!), Je constate que je n’ai pas bien compris le problème initial. Déplacer la ligne n'est pas approprié, mais la copie l'est (puisque la ligne est tirée). Je la réviserais donc comme suit:

:1t20:20d_
  1. Copiez la 1ère ligne (la 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 'trou noir' (_) (c'est-à-dire sans affecter le tampon de yank actuel) 

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

2
nkalvi

Vous pouvez utiliser ces commandes en mode normal:

:AmX | Xd

la commande m concerne m[ove], qui déplace le numéro de ligne A après le numéro de ligne X; si vous souhaitez 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 plage de lignes en utilisant 

:start,end m X
2
Nafaa Boutefer

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

 :46|9m.|-1d

Cela déplace le curseur sur la ligne 46, déplace la ligne 9 en dessous de la ligne en cours, puis supprime la ligne précédente (la ligne déplacée étant la ligne en cours).

Ou en utilisant une ou plusieurs marques, en utilisant la marque 'a':

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

Il me faut souvent une ligne et la remplacer à plusieurs endroits, chacun ayant une valeur différente (ce qui signifie que je ne peux pas faire de regex).

Y tirer la ligne d'origine désirée

et ensuite sur chaque ligne que vous souhaitez remplacer, VpzeroY

1
Ron
  1. : ay (où a est le numéro de ligne. Exemple: 20y). Cela tire une ligne (jeu de mots).
  2. Vp 
1
Bharad

je voudrais simplement utiliser le registre "trou noir":

donné:

nnoremap <C-d> "_dd

la solution serait:

<C-d> yy

0
j5shi