Đây là một chức năng mà bạn có thể thử. Tôi chỉ thử nghiệm nó một chút nhưng có vẻ như nó hoạt động tốt.
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>)
Hàm này gọi hàm tìm kiếm của Vim trong một vòng lặp cho đến khi nó tìm thấy một kết quả khớp 'bình thường' cũng phù hợp 'đủ điều kiện' với một mục cú pháp cụ thể hoặc cho đến khi đến cuối bộ đệm.
Phải mất hai đối số. Đầu tiên là mẫu tìm kiếm và nó được chuyển không thay đổi theo search()
chức năng của Vim . Xem :help search()
cách thức hoạt động của chức năng đó. Đối số thứ hai là tên của mục cú pháp mà bạn muốn lọc các kết quả khớp này. Đây cũng có thể là một mẫu và được so sánh như một biểu thức chính quy không phân biệt chữ hoa chữ thường.
Để tìm mẫu 'alpha' trong các vùng toán học, bạn có thể làm
:JJSyntaxSearch alpha texMathZone.
Các .
ở cuối là các nguyên tử mẫu cho bất cứ ký tự đơn, xem :help /.
. Điều này là do có nhiều mục cú pháp vùng toán học được gọi texMathZoneA
, texMathZoneB
v.v.
Các search()
chức năng di chuyển con trỏ đến trận đấu 'bình thường' bên cạnh. Sau đó, hàm của chúng tôi nhận được tất cả các ID mục cú pháp cho vị trí con trỏ mới đó với synstack()
. Vòng qua chúng, nó lần lượt lấy tên của từng vật phẩm và kiểm tra nó chống lại syntaxitem
đối số. Xem :help synstack()
và :help synIDattr()
. Nếu có kết quả 'đủ điều kiện', nó sẽ trả về số dòng. Nếu nó đạt đến cuối bộ đệm mà không tìm thấy bất kỳ kết quả 'đủ điều kiện' nào, nó sẽ trả về 0
. Điểm quan trọng của chức năng là đưa con trỏ đến trận đấu 'đủ điều kiện' tiếp theo để bạn có thể thực hiện một số thao tác ở đó, nhưng rất hữu ích khi trả về "số dòng hoặc 0" để cho biết liệu có ý nghĩa khi gọi lại hàm không, cho ví dụ nếu bạn muốn gọi hàm liên tục từ hàm khác hoặc macro.
Tôi đã chọn sử dụng W
cờ cho search()
vì nó ngăn 'bao quanh' phần cuối của bộ đệm. Mặt khác, chức năng có thể bị kẹt khi nó tiếp tục tìm các kết quả trùng khớp 'thông thường' nhưng không có kết quả 'đủ điều kiện'.