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