Вот функция, которую вы можете попробовать. Я только немного проверил это, но, кажется, работает нормально.
function! JJSyntaxSearch(pattern, syntaxitem)
while search(a:pattern, 'W') > 0
for id in synstack(line("."),col("."))
if synIDattr(id,"name") =~? a:syntaxitem
return line(".")
endif
endfor
endwhile
return 0
endfunc
command! -nargs=* JJSyntaxSearch call JJSyntaxSearch(<f-args>)
Функция вызывает функцию поиска Vim в цикле, пока не найдет «обычное» совпадение, которое также является «квалифицированным» совпадением с конкретным элементом синтаксиса, или пока оно не достигнет конца буфера.
Требуется два аргумента. Первый - это шаблон поиска, и он передается без изменений в search()
функцию Vim . Посмотрите, :help search()
как работает эта функция. Второй аргумент - это имя элемента синтаксиса, по которому вы хотите фильтровать эти совпадения. Это также может быть шаблон и сравнивается как регистрозависимое регулярное выражение.
Чтобы найти шаблон «альфа» в математических зонах вы можете сделать
:JJSyntaxSearch alpha texMathZone.
В .
конце - атом образца для любого отдельного символа, см :help /.
. Это происходит потому , что многие элементы синтаксиса математики зоны называется texMathZoneA
, и texMathZoneB
т.д.
search()
Функция перемещает курсор к следующему «обычному» матчу. Затем наша функция получает все идентификаторы синтаксического элемента для этой новой позиции курсора synstack()
. Перебирая их, он по очереди извлекает имя каждого элемента и проверяет его на соответствие syntaxitem
аргументу. Смотрите :help synstack()
и :help synIDattr()
. Если есть «квалифицированное» совпадение, возвращается номер строки. Если он достигает конца буфера, не найдя «подходящего» соответствия, он возвращается 0
. Смысл функции заключается в том, чтобы перевести курсор к следующему «квалифицированному» совпадению, чтобы вы могли выполнить там некоторую операцию, но полезно возвращать «номер строки или 0», чтобы указать, имеет ли смысл повторно вызывать функцию, для Например, если вы хотите повторно вызвать функцию из другой функции или макроса.
Я решил использовать W
флаг для, search()
потому что он предотвращает «обтекание» конца буфера. В противном случае функция может застрять, поскольку она продолжает находить одинаковые «обычные» совпадения, но не «квалифицированные» совпадения.