Jestem w trakcie upiększania kodu źródłowego za pomocą vima. {1}
Stworzyłem kilka makr vim, które wykonują poszczególne kroki: usuwanie końcowej spacji, usuwanie pustych linii po {
, usuwanie pustych linii przed {
, tego rodzaju rzeczy.
Teraz chcę utworzyć makro, które wykonuje kolejno wszystkie poszczególne makra. Jednak gdy zakończy się pierwsze makro rekurencyjne (ponieważ nie może już znaleźć żadnych dopasowań -> błąd dopasowania), moje makro „otoki” również się kończy.
Czy istnieje sposób na kontynuowanie makra vim po wygenerowaniu błędu przez submacro?
{1} Ja wiem o automatycznych reformatters. Mogę nawet użyć ich do mojego obecnego problemu. Dla przykładu podałem tylko formatowanie źródła. Nie publikuj żadnych odpowiedzi na temat tego źródłowego upiększacza lub tego. To nie jest pytanie o kod formatowania per se , ale o vim makra.
Przykład:
- Makro 1 - przycinanie końcowych białych znaków -
qw/\s\+$d$@wq
- Makro 2 - usuwanie pustych linii przed} -
qe/\n\n *}dd@eq
- Wrapper Macro - Retabbing, Macro 1, Macro 2 -
qr:retab@w@eq
Kiedy wykonam opakowanie - @r
- przebije, a następnie uruchom Makro 1, dopóki nie zostaną znalezione końcowe białe znaki, a następnie zakończ ( bez wykonywania Makra 2).
Wyjaśnienie:
To, czego szukam, to jak wywołać submacro, aby po zakończeniu tego submacro makro wywołujące było kontynuowane?
Jeśli nieudane polecenie jest podstawieniem, które nie znajduje swojego wzorca, np.
gdy
foo
nie istnieje w buforze, możesz dodaće
flagę, aby zignorować ten błąd, np.Widzieć
Możesz powiedzieć Vimowi, aby ignorował błędy niektórych poleceń ex, poprzedzając je znakiem
:silent!
. WidziećEdytuj po dodaniu przykładu do pytania
Makro 1 i Makro 2 są rekurencyjne i żadne z nich nie ma wyraźnego mechanizmu kończącego rekurencję. Domyślam się, że uruchamiany jest jeden z wewnętrznych testów Vima pod kątem nieograniczonej rekurencji, który generuje błąd. Jeśli makro 1 generuje taki błąd, błąd ten zakończy wykonywanie makra opakowania natychmiast po tym
@w
.Moją sugestią byłoby ograniczenie liczby uruchomień makr poprzez przepisanie ich jako poleceń ex i ograniczenie zakresu wierszy, w których są wykonywane. Na przykład:
gdzie
^M
oznacza wpisanie klawisza Enter lub Return. Nie testowałem ich razem w twoim Wrapper Macro, ale myślę, że będziesz w stanie naprawić wszelkie błędy, które popełniłem.źródło
/foo
.). Chociaż:silent!
rzeczywiście sztuczka rekursywnego submacro nie przerywała makra opakowania, teraz submakro w ogóle się nie kończy ... i podejrzewam, że ponowne uruchomienie go w jakiś sposób spowoduje zakończenie makra opakowania. Wygląda na to, że utknąłem. : - \Dla mnie zadziałało połączenie odpowiedzi @Peter Rincker i @garyjohn. Osobno po prostu dostawałem dziwne problemy.
Myślę, że
silent!
w<leader>rt
, i znaki rur pomiędzyendtry
iw
były klucze - po prostu o przerwę wiersz poendtry
powiodło się. Dotry
s pracował kiedy ja po prostu wpisać je, ale kiedy uruchomić jako makro błąd o tekście wyszukiwania nie stwierdzono by zachować podnoszone.źródło
Rutynowo tworzę makra „w locie”, gdy muszę wykonać powtarzalne zadanie wśród wielu plików. W moim przypadku mam NERDtree ( http://www.vim.org/scripts/script.php?script_id=1658 ) zainstalowany w VIM, które tworzą
vsplit
okno, a po lewej stronie mam listę wszystkich plików w bieżący katalog. W jednym przykładzie muszę znaleźć pierwszą instancję ciąguMY_TEST
w pliku, a następnie usunąć, jeśli jest obecny, prefiks oznaczony jakoCUSTOM_PREFIX-
z tej linii, zapisać plik, a następnie przejść do następnego.Oto, jak mam to makro działać na około 2000 plików w bieżącym katalogu. Mógłbym napisać skrypt bash, aby to zrobić, ale w moim przypadku jest to szybsze w VIM. W
+
oznacza klawiszy zostanie naciśnięty Simulq,a
CTRL+ W,←
↓
ENTER
q
1000 @,a
Mam nadzieję że to pomoże!
źródło