2014-12-26 13 views
5

Tôi đang cố gắng học vimscript. Tôi đã đọc khá một chút trong 'học vimscript một cách khó khăn', nhưng không tìm thấy câu trả lời cho câu hỏi của tôi:Làm cách nào để biết liệu tìm kiếm có thành công trong vimscript không?

Làm cách nào để biết tìm kiếm đã thành công trong vimscript? Tôi có hai trường hợp:

: nếu có một (trên dòng hiện tại làm foo : endif

: nếu/searchtarget thành công làm thanh :.. endif

Trả lời

6

Có nhiều cách tiếp cận khác nhau, tùy thuộc vào ngữ cảnh.

: nếu có một (trên dòng hiện tại làm foo: endif

Bạn có thể sử dụng search(), theo @ câu trả lời Kent Nó hỗ trợ {stopline} lập luận, để tránh điều đó nó vượt xa những dòng hiện tại. (mà bạn có thể vượt qua thông qua line('.')). Nhưng nó chỉ tìm kiếm theo một hướng (hoặc là tiến hoặc lùi), vì vậy bạn phải đặt con trỏ ở vị trí con trỏ

Vì vậy, âm thanh như if getline('.') =~ '(' là một thử nghiệm tốt hơn. so sánh cụm từ thông dụng của dòng hiện tại với (. Bạn cũng có thể sử dụng match() thay thế (tra cứu bất kỳ hàm nào qua :help để có tài liệu API đầy đủ và ví dụ BTW) hoặc không regexp stridx() (có thể nhanh hơn, nhưng cũng ít rõ ràng hơn để đọc).

: nếu/searchtarget thành công làm thanh: endif

Một lần nữa, điều này nghe có vẻ giống như một sử dụng cho search(), mà lại vị trí của con trỏ trên một trận đấu như /search. Nhưng bạn cũng có thể sử dụng sau (với :normal), và kiểm tra nhảy bằng cách so sánh vị trí con trỏ (thu được qua getpos('.')) trước và sau lệnh.

+0

Một lưu ý khi kiểm tra xem vị trí con trỏ có thay đổi sau khi tìm kiếm bằng ': normal/': Nếu chỉ có một đối sánh trong tệp và nó sẽ xảy ra ở vị trí con trỏ ở đầu tìm kiếm, sau đó tìm kiếm sẽ quấn qua phần cuối của tệp (giả sử tùy chọn đó đang bật) và hạ cánh tại vị trí con trỏ hiện tại. Trong trường hợp này, tìm kiếm sẽ thực sự thành công, nhưng việc kiểm tra vị trí con trỏ đã thay đổi sẽ cho biết (sai) mà nó không có. –

2

Vim có search() chức năng :h search( để đọc các mô tả chức năng

Nếu tìm thấy kết quả phù hợp, hàm func sẽ trả lại số dòng, nếu không trả về 0. Bạn có thể làm logic của bạn dựa trên giá trị trả về của hàm.

Để kiểm tra xem một số mẫu trong dòng hiện tại, bạn cũng có thể sử dụng chức năng search(), bạn cũng có thể split() văn bản dòng hiện tại để xem danh sách kết quả có nhiều hơn 2 thành phần hay không.

Các vấn đề liên quan