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:
- 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 présente l'inconvénient supplémentaire que la ligne X est maintenant dans le registre par défaut, ce qui est gênant si je trouve une autre ligne qui devrait être remplacé par A. Emmener à coller à partir d' 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 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?
:move
et le trou noir registre (_
) (ou en fait, seulement registres)Réponses:
Ce que je ferais:
aG
Y
xG
Vp
Vous ne devez pas quitter le mode normal, mais il ne Yank la ligne. Vous pouvez cependant utiliser
V"0p
qui mettra toujours la ligne tirée à l'étape 2.la source
Y
est synonyme deyy
Y
est un synonyme deyy
, mais je suggère de le remappery$
pour correspondre àD
etC
.Vp
: sélectionnez la ligne, collez ce qui a été retiréla source
VP
fonctionne tout aussi bien, ce qui est pratique car vous pouvez maintenir Shift enfoncé pendant toute la séquence.V"0p
, ce qui colle à partir du dernier registre copié.V"0p
fait? V passe en mode ligne de ligne visuelle et p est pour coller. Quels sont "et 0 pour Merci?Pour supprimer du texte sans affecter les registres normaux, vous pouvez utiliser le registre du trou noir
"_
:la source
d
etdd
toujours utiliser le trou noir etx
etxx
faire ce que la plupart des éditeurs appellent un « cut » (suppression et enregistrez -le registre par défaut):noremap x d
noremap xx dd
noremap d "_d
noremap dd "_dd
En m'appuyant sur les réponses qui suggèrent d'utiliser
Vp
ouVP
de coller sur une ligne - pour éviter de changer le contenu du registre yank, je trouve que la commande la plus ergonomique est simplement:VPY
la source
la source
J'utiliserais le mode ligne de commande (Ex) et ferais les deux commandes suivantes
Cela déplace simplement la ligne X juste sous A, puis la suppression de A déplace cette ligne vers le haut
Par exemple
la source
Déplacez-vous au début de la première ligne.
y, $- copier la ligne sans le saut de ligne à la fin
Déplacez-vous au début de la ligne cible.
V, p- remplacer une seule ligne cible
c, c, Ctrlr, 0, Esc- remplacer la ligne de cible avec le coup sec d' origine
Passez au début de la ligne cible suivante.
. - répète la commande émise en 4.2.
Remarques:
4.1 est y, $parce que si vous le faites y, you Yvous copierez le linebreak et Ctrlr, 0ajoute en fait le saut de ligne en dessous de votre ligne cible.
4.2 remplace V p, ce qui ne fonctionne pas avec la répétition car techniquement la dernière action est la suppression, donc .supprimerait simplement une ligne.
Si quelqu'un sait comment lancer «remplacer la ligne actuelle par le registre» à 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 EX répétable qui est plus rapide que 4.2 et / ou qui n'a pas la mise en garde de saut de ligne.
la source
Voici ce que je ferais
la source
Vous pouvez l'utiliser avec le mode visuel.
A
GX
Gla source
Vous pouvez également faire:
Les mêmes touches peuvent être utilisées pour copier / coller plus d'une ligne.
la source
Vous pouvez utiliser ces commandes en mode normal:
la
m
commande est pourm[ove]
, 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, utilisezco[py]
. lad
commande est pourd[elete]
.Vous pouvez déplacer (copier en utilisant
co
) une plage de lignes en utilisantla source
À la lumière du récent commentaire de cicld (merci!), Je vois que je n'ai pas bien saisi le problème d'origine. Le déplacement de la ligne n'est pas approprié, mais la copie l'est (puisque la ligne est tirée). Je la réviserais donc pour:
Copiez la 1ère ligne (la
:t
commande est un alias pour:copy
) après la ligne 20 (la placera sur la ligne 21)Supprimer la ligne 20, mettre la ligne supprimée dans le registre 'blackhole' (
_
) (c'est-à-dire n'affectant pas le tampon de yank actuel)Comme mentionné dans le commentaire récent, cela n'affectera pas la position actuelle du curseur.
la source
la source
Je trouve qu'il est plus facile d'utiliser la commande Ex pour cela; ex. pour déplacer la ligne 9 à 46:
Cela déplacera le curseur sur la ligne 46, déplacera la ligne 9 sous le courant, puis supprimera la ligne précédente (puisque la ligne déplacée est la ligne actuelle).
Ou en utilisant la (les) marque (s), en utilisant la marque 'a':
la source
:1m20|.+1d
(déplacer la ligne 1 à la ligne 20 et supprimer la ligne suivante, c'est-à-dire le texte qui était à la ligne 20 précédemment). Même idée cependant!Je dois souvent y une ligne et la remplacer à plusieurs endroits, chacun ayant une valeur différente (ce qui signifie que je ne peux pas faire une regex).
Y pour extraire la ligne d'origine souhaitée
et ensuite sur chaque ligne que vous souhaitez remplacer, VpzeroY
la source
j'utiliserais simplement le registre "Trou noir":
donné:
nnoremap <Cd> "_dd
la solution serait:
<Cd> yy
la source