Gibt es eine Möglichkeit, Text von einem Register in ein anderes Register oder einen anderen Registersatz zu leiten? Bewegen Sie sich beispielsweise "q
zu Registern "1
durch "5
.
Ich möchte oft leicht unterschiedliche Versionen desselben Makros erstellen, daher ist es nützlich, ein 'Vorlagen'-Makro in mehrere Register kopieren und dann jedes an Ort und Stelle ändern zu können.
Um ein praktisches Beispiel zu geben, hier ist das Problem, das diese Frage für mich ausgelöst hat.
Ich muss die folgende Zeile aus einer Hardwarebeschreibungssprache in viele wiederholte Blöcke umwandeln:
RAM64(in=in, load=load0, address=address[0..5], out=out1);
zu
RAM64(in=in, load=load1, address=address[0..5], out=out2);
RAM64(in=in, load=load2, address=address[0..5], out=out3);
RAM64(in=in, load=load3, address=address[0..5], out=out4);
RAM64(in=in, load=load4, address=address[0..5], out=out5);
Ich habe ein Makro, das dies mit der Inkrementfunktion ausführt, yypW^At)^A
die ich im Register gespeichert habe "a
.
Manchmal muss das Inkrementierungsmuster etwas anders sein, z
RAM512(in=in, load=load1, address=address[0..8], out=out2);
RAM512(in=in, load=load2, address=address[0..8], out=out4);
RAM512(in=in, load=load3, address=address[0..8], out=out6);
RAM512(in=in, load=load4, address=address[0..8], out=out8);
wo das Makro im Register "b
wäre yypW^At)^A^A
.
Ich möchte, dass ein Register dies tut, aber für jedes Inkrement von 1-5. Das Register "a
könnte (irgendwie) in die Register b bis e kopiert werden. Dann würde ich jedes Register in den Puffer einfügen, die erforderliche Änderung vornehmen (weitere Begriffe hinzufügen, das Zeichen ändern, das der t
Bewegung folgt usw.) und den geänderten Ausdruck zurück in das Register ziehen. Idealerweise könnte dieser letzte Schritt sogar in den Befehlen zum Kopieren der Register enthalten sein
Dies erspart mir das Wiederholen aller Zeichen im Makro, die NICHT geändert werden müssen. Für mein Beispiel mag es trivial sein, aber ich kann Zeiten vorhersehen, in denen es sehr hilfreich sein könnte, das zu tun, was ich verlange.
Antworten:
Makros sind nur Text.
Öffnen Sie einen neuen leeren Puffer und platzieren Sie Ihr Makro dort. Sie können die Zeilen duplizieren, eine Sache hier und etwas anderes an anderer Stelle ändern, dann eine Zeile ziehen und sie sofort mit verwenden
@"
.Sie müssen Ihre Register nicht verschmutzen, insbesondere nicht die Nummernregister, die einem ganz anderen Zweck dienen.
- bearbeiten -
Ihre Frage ist jetzt leichter zu verstehen, da Sie eine Erklärung hinzugefügt haben.
Wie sich herausstellt, müssen Sie nur Ihre ursprüngliche Aufzeichnung ändern, um Ihr Ziel zu erreichen, ohne mit Registern zu spielen, als wären sie Variablen:
So erstellen Sie 5 Kopien der aktuellen Zeile mit der letzten um 2 erhöhten Nummer:
oder 12 Exemplare, wobei die letzte Zahl um 23 erhöht wurde:
quelle
abcde
in ist@q
, dann will ich@x="bcdea"
,@y="abcde"
und@z="eabcd"
. Ich könnte , indem wir beginnen@x
,@y
und@z
alle gleich@q
und ändern sie dann je nach Bedarf. Natürlich habe ich mir das nur ausgedacht, aber es scheint, dass es einige Fälle gibt, in denen etwas Ähnliches nützlich sein könnte.Verwenden von
getreg
undsetreg
So kopieren Sie von
q
in Register1
-5
:So kopieren Sie in eine allgemeinere Liste:
Verwenden von
execute
So kopieren Sie von
q
in Register1
-5
:So kopieren Sie in eine allgemeinere Liste:
Erläuterung. Der Befehl
let
kann als verwendet werdenlet @x=@y
, um Registery
zu Register zu kopierenx
. Im Wesentlichen konstruieren wir diese Befehle nur in einer Schleife (ändern den Wert vonx
in der obigen Form) und gebenexecute
sie ein.quelle
:exe
. Diegetreg()
undsetreg()
Funktionen wären sauberer.Um die Frage direkt zu beantworten, können Sie Folgendes in Ihre .vimrc-Datei einfügen, wenn Sie den Inhalt eines Registers schnell und einfach in ein anderes kopieren möchten. Sie können dann ausführen,
<leader>rcab
um den Inhalt des Registersa
in das Register zu kopierenb
. Als Beispiel habe ich mich<leader>rc
für "Registerkopie" entschieden.quelle
getreg(sourceReg, 1)
.