Używam vima do edycji dokumentów lateksowych. Często będę chciał zmienić nazwę zmiennej na coś innego. Jednak szukanie nazwy zmiennej jest trochę denerwujące. Chciałbym wyszukiwać tylko w „strefach matematycznych” zdefiniowanych w pliku składniowym tex. Czy istnieje prosty sposób na ograniczenie wyszukiwania do określonego regionu składni?
10
synIDattr()
do uzyskania grup składni dla znaku pod kursorem. Możesz napisać funkcję, która wykonuje wyszukiwanie (lub wykonujenormal n
), a następnie używa,synIDattr()
aby zdecydować, czy pozostać w tej lokalizacji, czy kontynuować wyszukiwanie do przodu.Odpowiedzi:
Oto funkcja, którą możesz wypróbować. Testowałem to tylko trochę, ale wydaje się, że działa dobrze.
Funkcja wywołuje funkcję wyszukiwania Vima w pętli, dopóki nie znajdzie „zwykłego” dopasowania, które jest również „kwalifikowanym” dopasowaniem do określonego elementu składni lub dopóki nie osiągnie końca bufora.
Wymaga dwóch argumentów. Pierwszy to wzorzec wyszukiwania i jest on przekazywany bez zmian do
search()
funkcji Vima . Zobacz,:help search()
jak działa ta funkcja. Drugi argument to nazwa elementu składni, na którym chcesz filtrować te dopasowania. Może to być również wzorzec i jest porównywany jako wyrażenie regularne bez rozróżniania wielkości liter.Aby znaleźć wzór „alfa” w strefach matematycznych, możesz to zrobić
Na
.
końcu znajduje się atom wzoru dla każdego pojedynczego znaku, patrz:help /.
. To dlatego, że wiele elementów składniowych strefa matematyki nazywatexMathZoneA
,texMathZoneB
etc.search()
Funkcja przesuwa kursor do następnego „zwykłym” meczu. Następnie nasza funkcja pobiera wszystkie identyfikatory pozycji składni dla tej nowej pozycji kursora za pomocąsynstack()
. Pętląc je, pobiera po kolei nazwę każdego elementu i testuje go podsyntaxitem
kątem argumentu. Zobacz:help synstack()
i:help synIDattr()
. Jeśli istnieje dopasowanie „kwalifikowane”, zwraca numer linii. Jeśli osiągnie koniec bufora bez znalezienia „dopasowanego” dopasowania, zwraca0
. Celem funkcji jest przesunięcie kursora do następnego dopasowania „kwalifikowanego”, aby można było tam wykonać jakąś operację, ale warto zwrócić „numer linii lub 0”, aby wskazać, czy sensowne jest ponowne wywołanie funkcji, ponieważ wystąpienie, jeśli chcesz wywoływać funkcję wielokrotnie z innej funkcji lub makra.Zdecydowałem się użyć
W
flagi do,search()
ponieważ zapobiega to owijaniu się końca bufora. W przeciwnym razie funkcja może utknąć, ponieważ ciągle znajduje te same „zwykłe” dopasowania, ale nie ma „kwalifikowanych” dopasowań.źródło
W przypadku, gdy twoje „strefy matematyczne” są zaklasyfikowane według jakiegoś wzorca składniowego, powiedzmy, ciągu „matematycznego”, możesz przynajmniej użyć sekwencji wzorców, aby znaleźć linię z pasującym wzorcem, jak w:
(Uwaga: dwa wzory mogą znajdować się na różnych liniach!)
To może nie ograniczać twoich dopasowań do stref - w tym celu musisz określić koniec strefy - ale wyświetli tylko te dopasowania po początkowym wzorcu / matematyce /. Możesz powtórzyć wyszukiwanie następnego wystąpienia, używając historii trybu ex (
:
up-arrow
enter
).Uwaga: ISTR, że we wcześniejszych wersjach vim / vi mogłem również używać tej metody bezpośrednio jako polecenia wyszukiwania (w przeciwieństwie do polecenia trybu ex)
/math//your pattern/
z zaletą mniejszego wpisywania i używania poleceńn
iN
, ale nie mogę potwierdzić to dla mojej obecnej wersji vima.źródło
Jeśli szukasz ciągu
foo
wewnątrz$...$
lub$$...$$
, powinno to działać:To zakotwicza dopasowanie do
$
znaku, ale wybiera tylko ciągfoo
.To nie jest naprawdę łatwe rozwiązanie, ale można użyć
:global
+,:substitute
aby znaleźć „strefy matematyczne” i przeszukać w nich:Udając, że
:substitute
jest to polecenie wyszukiwania, możesz przejść do następnego wystąpienia za pomocąn
i wyjść zq
. Jeśli przez pomyłkę potwierdzisz zamianę, nie powinno być problemu.Będziesz musiał ustawić listę wewnątrz
%(
...)
na nazwy środowisk matematycznych, z których korzystasz (pełna lista jest nieco mocna:)align|alignat|displaymath|eqnarray|equation|flalign|gather|math|multline|subequations|xalignat|xxalignat
. Zauważ, że używam tutaj bardzo magicznego (\v
) wzoru.Wyjaśnienie:
:global
wykonać polecenie Ex (:s
) na każdej linii, gdzie mecze wzór (:help :global
)/\v
rozpocząć bardzo magicznego wzoru (:h /
,:h pattern
,:h magic
)\\begin\{
pasuje dosłownym\begin{
%(align|alignat|displaymath)
pasuje do żadnego z tych słów (:h /\%(
,:h /bar
)\}/
pasuje dosłownym}
i zakończyć wzór.+1,/\\end/-1
zakres składający się z następnego wiersza (licząc od znalezionego przez:global
) do wiersza poprzedzającego znaleziony przez wzorzec wyszukiwania/\\end
. W tym zakresies/foo/&/gc
wyszukaj i zamień każde wystąpienie literału nafoo
siebie, po potwierdzeniu (:h :substitute
)źródło
\mathit
nazw zmiennych, znalezienie ich jest znacznie łatwiejsze.Jeśli szukasz ciągu „rano” w pliku,
/morning
a następnie enternaciśnij przycisk, naby przejść do przoduźródło
I would like to search only in "math zones"
twoja metoda wyszukuje cały plik, który nie ogranicza strefy badawczej.Nie ma innej opcji niż napisanie dedykowanej do tego funkcji. Napisałem funkcję, która wyszukuje żądany ciąg i zatrzymuje się tylko, jeśli:
Po prostu wywołujesz go ciągiem, który chcesz wyszukać.
Zamierzam napisać podobną funkcję dla GrammerousCheck, która zatrzymuje się tylko na błędach gramatycznych poza matematyką.
źródło