Czy istnieje sposób na przeniesienie tekstu z rejestru do innego rejestru lub zestawu rejestrów? Na przykład przejdź "q
do rejestrów "1
przez "5
.
Często chcę tworzyć nieco inne wersje tego samego makra, więc warto skopiować makro „szablonu” do kilku rejestrów, a następnie zmodyfikować każde z nich na miejscu.
Aby dać praktyczny przykład, oto problem, który skłonił mnie do tego pytania.
Muszę przekształcić następujący wiersz z języka opisu sprzętu w wiele powtarzających się bloków,
RAM64(in=in, load=load0, address=address[0..5], out=out1);
do
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);
Mam makro, które wykonuje to, używając funkcji przyrostowej, yypW^At)^A
którą zapisałem w rejestrze "a
.
Czasami potrzebuję, aby wzorzec przyrostu był nieco inny, np
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);
gdzie "b
byłoby makro w rejestrze yypW^At)^A^A
.
Chcę, aby rejestr to zrobił, ale dla każdego przyrostu od 1-5. Rejestr "a
można (w jakiś sposób) skopiować do rejestrów od b do e. Następnie wkleiłem każdy rejestr do bufora, dokonałem wymaganej modyfikacji (dodałem więcej terminów, zmieniłem znak następujący po t
ruchu itp.) I wcisnąłem zmodyfikowane wyrażenie z powrotem do rejestru. Idealnie ten ostatni krok mógłby nawet zostać zawarty w poleceniu (-ach), aby skopiować rejestry
To oszczędza mi powtarzania wszystkich znaków w makrze, które NIE wymagają zmiany. W moim przykładzie może to być trywialne, ale mogę przewidzieć czasy, w których zrobienie tego, o co proszę, może być bardzo pomocne.
źródło
Odpowiedzi:
Makra to tylko tekst.
Otwórz nowy pusty bufor i umieść tam swoje makro. Możesz powielić linie, zmienić jedną rzecz tutaj i coś innego w innym miejscu, a następnie zerwać linię i użyć jej od razu
@"
.Nie ma potrzeby zanieczyszczania rejestrów, zwłaszcza rejestrów numerów, które służą zupełnie innym celom.
-- edytować --
Twoje pytanie jest łatwiejsze do zrozumienia, gdy dodałeś jakieś wyjaśnienie.
Jak się okazuje, wystarczy zmienić początkowe nagranie, aby osiągnąć cel, bez grania rejestrami tak, jakby były zmiennymi:
Aby utworzyć 5 kopii bieżącego wiersza z ostatnim numerem zwiększonym o 2:
lub 12 kopii, z ostatnią liczbą powiększoną o 23:
źródło
abcde
jest@q
, to chcę@x="bcdea"
,@y="abcde"
i@z="eabcd"
. Mógłbym zacząć od pozwalania@x
,@y
i@z
wszystko równe,@q
a następnie modyfikowanie ich w razie potrzeby. Oczywiście, właśnie to, ale wydaje się, że mogą istnieć pewne sytuacje, w których coś podobnego może być przydatne.Korzystanie
getreg
isetreg
Aby skopiować z
q
do rejestrów1
-5
:Aby skopiować na bardziej ogólną listę:
Za pomocą
execute
Aby skopiować z
q
do rejestrów1
-5
:Aby skopiować na bardziej ogólną listę:
Wyjaśnienie. Polecenia
let
można użyć jakolet @x=@y
, które kopie rejestrują sięy
do zarejestrowaniax
. Zasadniczo konstruujemy te polecenia w pętli (zmieniając wartośćx
w powyższej formie) iexecute
je przetwarzamy.źródło
:exe
. Funkcjegetreg()
isetreg()
byłyby czystsze.Aby bezpośrednio odpowiedzieć na pytanie, jeśli chcesz szybko i łatwo skopiować zawartość jednego rejestru do drugiego, możesz umieścić w .vimrc następujące elementy. Następnie można wykonać,
<leader>rcab
aby skopiować zawartość rejestrua
do rejestracjib
. Jako przykład wybrałem opcję<leader>rc
„zarejestruj kopiꔟródło
getreg(sourceReg, 1)
.