Mindestens einmal am Tag habe ich folgende Situation:
A: This line should also replace line X
...
X: This is line should be replaced
Ich glaube, dass ich diese Aufgabe nicht effizient erledige.
Was ich mache:
- Gehen Sie zu Zeile A: AG
- Rucklinie A: yy
- Gehen Sie zu Zeile X: XG
- Zeile A einfügen: P.
- Zur alten Zeile wechseln : j
- Alte Zeile löschen : dd
Dies hat den zusätzlichen Nachteil , dass Linie X jetzt im Standard - Register ist, was ärgerlich ist , wenn ich eine andere Linie finden , die mit A. Yanking zu und Einfügen von einem zusätzlichen Register (ersetzt werden sollten „ayy , “ aP ) macht diese einfache Aufgabe , auch weniger effizient.
Meine Fragen:
- Habe ich einen eingebauten Vim-Befehl verpasst, um eine zuvor gezogene Linie zu ersetzen?
- Wenn nicht, wie kann ich meinen eigenen Befehl binden, der die gezogene Zeile im Standardregister belässt (oder wiederherstellt)?
:move
und das Schwarze Loch Register (_
) (oder in der Tat nur Register)Antworten:
Was ich tun würde :
aG
Y
xG
Vp
Sie müssen nicht normalen Modus verlassen, aber es tut yank die Linie. Sie können jedoch verwenden,
V"0p
wodurch die in Schritt 2 gezogene Linie immer gezogen wird.quelle
Y
ist ein Synonym füryy
Y
ist ein Synonym füryy
, aber ich schlage vor, es neu zuzuordnen, umy$
zuD
und zu passenC
.Vp
: Linie auswählen, einfügen, was gezogen wurdequelle
VP
funktioniert genauso gut, was praktisch ist, da Sie die Umschalttaste für die gesamte Sequenz gedrückt halten können.V"0p
, was aus dem zuletzt gezogenen Register eingefügt wird.V"0p
tut? V wechselt in den visuellen Linienlinienmodus und p dient zum Einfügen. Wofür sind "und 0? DankeUm Text zu löschen, ohne die normalen Register zu beeinflussen, können Sie das Black-Hole-Register verwenden
"_
:quelle
d
unddd
immer zu verwendenx
und dasxx
auszuführen, was die meisten Editoren als "Ausschneiden" bezeichnen würden (Löschen und Speichern im Standardregister):noremap x d
noremap xx dd
noremap d "_d
noremap dd "_dd
Aufbauend auf den Antworten, die die Verwendung
Vp
oderVP
das Einfügen über eine Linie vorschlagen - um zu vermeiden, dass der Inhalt des Ruckregisters geändert wird, finde ich den ergonomischsten Befehl einfach:VPY
quelle
quelle
Ich würde den Kommandozeilenmodus (Ex) verwenden und die folgenden zwei Befehle ausführen
Dadurch wird Zeile X einfach auf knapp unter A verschoben, und durch Löschen von A wird diese Zeile verschoben
Beispielsweise
quelle
Gehen Sie zum Anfang der ersten Zeile.
y, $- Kopieren Sie die Zeile ohne Zeilenumbruch am Ende
Gehen Sie zum Anfang der Ziellinie.
V, p- nur eine Ziellinie ersetzen
c, c, Ctrlr, 0, Esc- die Ziellinie mit dem ursprünglichen Ruck ersetzen
Gehen Sie zum Anfang der nächsten Ziellinie.
. - wiederholt den bei 4.2 ausgegebenen Befehl.
Anmerkungen:
4.1 ist y, $denn wenn Sie das tun y, yoder YSie werden die Zeilenumbrüche kopieren, und Ctrlr, 0tatsächlich den Zeilenumbruch unterhalb Ihrer Ziellinie ergänzt.
4.2 ersetzt V p, was bei Wiederholung nicht funktioniert, da technisch gesehen die letzte Aktion Löschen ist, also .nur eine Zeile löschen würde.
Wenn jemand weiß, wie man im EX-Modus (Befehlszeile) "Aktuelle Zeile durch Register ersetzen" ausgibt, würde ich gerne von Ihnen hören (und wissen, wo Sie die Dokumentation gefunden haben). Möglicherweise gibt es einen wiederholbaren EX-Befehl, der schneller als 4.2 ist und / oder nicht die Einschränkung für Zeilenumbrüche enthält.
quelle
Folgendes würde ich tun
quelle
Sie können dies im visuellen Modus verwenden.
A
GX
Gquelle
Sie können auch tun:
Mit denselben Tasten können Sie mehr als eine Zeile ziehen / einfügen.
quelle
Sie können diese Befehle im normalen Modus verwenden:
Der
m
Befehl ist fürm[ove]
, der die Zeilennummer A nach der Zeilennummer X verschiebt. Wenn Sie kopieren möchten, anstatt die Zeile zu verschieben, verwenden Sieco[py]
. Derd
Befehl ist fürd[elete]
.Sie können
co
eine Reihe von Zeilen mit verschieben (kopieren mit )quelle
Angesichts des jüngsten Kommentars von cicld (danke!) Sehe ich, dass ich das ursprüngliche Problem nicht vollständig verstanden habe. Das Verschieben der Zeile ist nicht angemessen, das Kopieren jedoch (da die Zeile gezogen wird). Daher würde ich sie überarbeiten, um:
Kopieren Sie die erste Zeile (
:t
Befehl ist ein Alias für:copy
) nach Zeile 20 (wird in Zeile 21 platziert)Löschen Sie Zeile 20 und legen Sie die gelöschte Zeile in das 'Blackhole'-Register (
_
) (dh ohne Einfluss auf den aktuellen Ruck-Puffer).Wie im letzten Kommentar erwähnt, hat dies keine Auswirkungen auf die aktuelle Cursorposition.
quelle
quelle
Ich finde es einfacher, den Befehl Ex dafür zu verwenden. Ex. Zeile 9 bis 46 verschieben:
Dadurch wird der Cursor auf Zeile 46 bewegt, Zeile 9 unter die aktuelle Zeile verschoben und dann die vorherige Zeile gelöscht (da die verschobene Zeile die aktuelle Zeile ist).
Oder mit Markierung (en), mit Markierung 'a':
quelle
:1m20|.+1d
(Zeile 1 in Zeile 20 verschieben und die nächste Zeile löschen, dh Text, der zuvor in Zeile 20 stand). Gleiche Idee!Ich muss oft eine Zeile Y und sie an mehreren Stellen ersetzen, von denen jede einen anderen Wert hat (was bedeutet, dass ich keinen regulären Ausdruck machen kann).
Y die gewünschte ursprüngliche Linie ziehen
und dann in jeder Zeile, die Sie ersetzen möchten, VpzeroY
quelle
Ich würde einfach das "Black Hole" -Register verwenden:
gegeben:
nnoremap <Cd> "_dd
Die Lösung wäre:
<Cd> yy
quelle