Ось функція, яку ви можете спробувати. Я лише трохи його протестував, але, здається, працює добре.
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()що він перешкоджає «обгортанню» кінця буфера. Інакше функція може застрягнути, оскільки вона продовжує знаходити ті самі «звичайні» збіги, але немає «кваліфікованих» збігів.