Jak mogę wyświetlić i edytować moje nagranie (tj. Zarejestrowane makro)?

39

Używam skomplikowanych powtórzeń do rejestrowania moich operacji ( qqdo nagrywania, niektórych operacji , qaby zatrzymać) i popełniłem błąd.

Czy mogę zobaczyć, co nagrałem i poprawić błąd, zamiast robić to ponownie?

Wywoływanie zarejestrowanych postaci według @qutworów, ale nie widzę tego w moich mapowaniach ( :map q- No mapping found).

I nie ma wiele informacji na pomoc przez wpisywanie: :help recording.

kenorb
źródło

Odpowiedzi:

42

Uwaga: Zakładam, że używasz arejestru do całej odpowiedzi, ale możesz użyć dowolnego rejestru

Uwaga 2: <1b>jest Esc; możesz to wstawić za pomocą, Ctrl+va następnie Esc. Może się również pojawiać jako ^[(w zależności od displayustawienia).


To nie jest mapowanie; więc ma sens, że :mapto nie działa. Jest rejestrowany w rejestrze i można go wyświetlać i edytować jak każdy rejestr.

Wszystko, co qrobi, to „wyczyść rejestr i dołącz do niego każde naciśnięcie klawisza” , a wszystko, co @zrobi, to „oceń rejestr jako polecenia” .

W makrze nie ma nic „innego”, możesz wywołać dowolny rejestr jako makro.


Aby wyświetlić, użyj:

:echo @a

Tak jak każdy rejestr.

Możesz także użyć :registersdo przeglądania wszystkich rejestrów.


Aby edytować , możesz zrobić kilka rzeczy:

Najprostszym sposobem na przypisanie @atego jest:

:let @a='iasd<1b>'

Spowoduje to uruchomienie trybu wstawiania ( i), wstawiania asdi powrotu do normalnego trybu.

Nie jest to bardzo przydatne w przypadku obszernej edycji; możesz użyć funkcji (np. substitute()), a może dodać coś ( :let @a=@a . 'more'), ale zmiana czegoś w środku nie jest taka łatwa.

Przekonałem się, że najlepszym sposobem na to jest uruchomienie nowego bufora za pomocą :splitlub :tabnewi edycja rejestru poprzez włożenie go, edycję, a następnie skopiowanie z powrotem.

Możesz użyć, "apktóry wstawi tekst do bufora (gdzie ajest twój rejestr):

iThis is A<1b>

Teraz mogę po prostu zmienić linię na:

iThis is an edited macro<1b>

Następnie robię, ^v$"ayaby szarpnąć (skopiować) ten wiersz do arejestru:

  • ^ na początek linii
  • v dla trybu wizualnego
  • $ na koniec linii
  • "ay wybierz opcję rejestracji a

Jeśli chcesz, możesz to zrobić bez użycia trybu wizualnego z ^"ay$.

Możesz teraz używać @a, jakby to było to, co pierwotnie nagrałeś.

Możesz także użyć yy, a następnie @", co jest nieco szybsze. Spowoduje to również skopiowanie końcowego nowego wiersza i może powodować skutki uboczne ... Innym sposobem na przyspieszenie tego jest użycie makra :-)

Martin Tournoij
źródło
2
Chciałbym zauważyć, że szarpnięcie linewise do twojego rejestru spowoduje efekt uboczny włączenia znaku nowej linii, tak jakbyś naciskał Enterna końcu swojego nagrania. W wielu przypadkach może to być łagodne, ale w scenariuszach, w których starannie dobrałeś pozycję kursora na końcu nagrania, może to wpłynąć na powtarzalność.
tommcdo
@tommcdo Right; możesz po prostu użyć vi wybrać całą linię (bez nowej linii).
Martin Tournoij
@Carpetsmoker v^$"ayszarpać (kopiować) tę linię do arejestru”. Czy nie powinno to ^nastąpić przed vi $czy nadal nie kopiujesz nowej linii? Myślę, że powinno to być: 0v$h"ay(tak boleśnie długie!)
joeytwiddle
2
@joeytwiddle nie, $przesuwa się na koniec linii, ale nie zawiera nowej linii. To różnica między 0y$i yy. Umieszczenie hpo tym $oznaczałoby, że przegapiłbyś ostatnią postać.
evilsoup
Jedną z rzeczy, które możesz zrobić, aby edytowanie było łatwiejsze do edycji: pozwól @ a = wpisać polecenia: wpisz: <Ctrl-f>, wybierz i edytuj odpowiednią linię (ostatnią linię, domyślnie, jeśli edytujesz ostatnia wprowadzona linia) przy użyciu vima jak zwykle. Naciśnij return, gdy skończysz, aby wykonać linię, lub <Ctrl-c>, aby wyjść.
9

Aby uzyskać coś do pracy z ...

qajjjq

Rozpocznie rejestrowanie makra w arejestrze.

Możesz wyświetlić wiele swoich bieżących rejestrów (używanych do makr, szarpania, usuwania itp.) Za pomocą :regpolecenia lub możesz określić rejestr do wyświetlenia, podając jego nazwę. Na przykład, aby wyświetlić rejestr a:

:reg a

daje

--- Registers ---
"a   jjj

Możesz dołączyć do istniejącego rejestru nazwanego, używając odpowiedniej dużej litery. Działa to nie tylko do nagrywania makr, ale także do szarpania. Na przykład:

qAkkkq
:reg a

daje

--- Registers ---
"a   jjjkkk

Jeśli chcesz użyć składni let do edycji istniejącego makra, możesz:

let @a='<C-r>a'

która rozwinie się do

let @a='jjjkkk'

i możesz następnie zmieniać poszczególne naciśnięcia klawiszy.

Zauważ, że możesz użyć <C-r>(to znaczy, control + r), aby wkleić z dowolnego rejestru do trybu wiersza poleceń (lub w tym przypadku w trybie wstawiania).

Ponadto, gdy jesteś w trybie wiersza poleceń, jeśli go wpiszesz, <C-f>pojawi się okno wiersza polecenia, w którym możesz zobaczyć / edytować poprzednie wydane polecenia, a także możesz edytować bieżące polecenie przed jego wywołaniem. Naciśnij enter na poleceniu, które chcesz przesłać.

Zaletą tego jest to, że możesz użyć swoich normalnych poleceń ruchu / podstawiania w tym buforze, aby edytować makro. Na przykład:

let @a='<C-r>a'<C-f>

przyniesie:

:118 reg
:119 reg a
:120 let @a='jjjkkk'

Jeśli masz komendę 120, możesz:

s/kkk/}
<return>
:reg a

daje

--- Registers ---
"a   jjj}

Możesz oczywiście wkleić zawartość rejestru do bufora i tam go zmienić. Ale możesz zrobić wszystko, czego potrzebujesz, nie zanieczyszczając bufora roboczego.

Zach Ingbretsen
źródło