vimscript có điều kiện dựa trên grep trên bộ đệm hiện tại


7

Tôi đang tìm cách để thực thi một số mã trong một hàm một cách có điều kiện tùy thuộc vào sự hiện diện của một số văn bản trong tệp được chỉnh sửa. Tôi đã tìm thấy một cách để làm nó hoạt động nhưng không cảm thấy rất "sạch".

Đây là những gì tôi có:

function! foo()
    (...)
    let v:errmsg = 'ok'
    execute "silent! normal! :/" . l:pattern . "\r"
    if v:errmsg == 'ok'
        (... do stuff ...)
    else
        (... do other stuff ...)
    endif
 endfunction

Câu hỏi đặt ra là: liệu kết quả tương tự có thể đạt được bằng cách nào đó mà không cần sử dụng v: errmsg không?

Những gì tôi có trong tâm trí là một cái gì đó của hình thức

function! foo()
   (...)
   if GrepInCurrentBuffer(l:pattern)
      (... do stuff ...)
   (...etc...)

6
Sử dụng search()- Xem:h search()
VanLaser 7/11/2015

1
@VanLaser: điều này hoạt động hoàn hảo và chính xác là những gì tôi đang tìm kiếm. Cảm ơn rất nhiều!
Dalker

2
Không có gì! Nói chung, bắt đầu từ điều này để khám phá những gì có sẵn::h function-list
VanLaser

Câu trả lời:


6

Các chức năng bạn đang tìm kiếm là search(). Hàm này sẽ tìm kiếm bắt đầu từ vị trí con trỏ và khi tìm thấy kết quả khớp, số dòng của nó sẽ được trả về. Nếu không tìm thấy kết quả khớp, 0 được trả về. Các 'ignorecase', 'smartcase''magic'tùy chọn được sử dụng trên các mẫu tìm kiếm. Lưu ý rằng nếu bạn muốn chọn nơi bắt đầu tìm kiếm, bạn có thể sử dụng cursor()hoặc setpos()chức năng để đặt vị trí con trỏ và getcurpos()chức năng lưu vị trí con trỏ.

Đây là một ví dụ về nó trong hành động:

function! SearchInRange(pattern, start_line, end_line)
    " Save cursor position.
    let save_cursor = getcurpos()

    " Set cursor position to beginning of file.
    call cursor(a:start_line, 0)

    " Search for the string 'hello' with a flag c.  The c flag means that a
    " match at the cursor position will be accepted.
    let search_result = search(pattern, "c", a:end_line)

    " Set the cursor back at the saved position.  The setpos function was
    " used here because the return value of getcurpos can be used directly
    " with it, unlike the cursor function.
    call setpos('.', save_cursor)

    " If the search function didn't find the pattern, it will have
    " returned 0, thus it wasn't found.  Any other number means that an instance
    " has been found.
    return search_result ? 1 : 0
endfunction

Để biết thêm về những điều được đề cập trong câu trả lời này, hãy xem các chủ đề trợ giúp sau:

  • :help search()
  • :help 'ignorecase'
  • :help 'smartcase'
  • :help 'magic'
  • :help cursor()
  • :help setpos()
  • :help getcurpos()

1
Làm thế nào về chỉ :echo search('pattern', 'nw') ? 1 : 0thay thế? :)
VanLaser

Bởi vì nếu sự xuất hiện của lời chào là trước con trỏ, thì nó sẽ không được phát hiện.
EvergreenTree

Cờ 'w' sẽ bao bọc tìm kiếm quanh phần cuối của tệp. Vì vậy, bất kỳ sự xuất hiện sẽ được phát hiện.
VanLaser

1
Đó là một giải pháp rất hay! Tôi đã cố gắng chứng minh cài đặt của vị trí con trỏ để tìm kiếm trong phạm vi, nhưng tôi đoán tôi đã không chọn ví dụ tốt nhất. Tôi đã cập nhật ví dụ.
EvergreenTree

1
Nó có hỗ trợ tìm kiếm regex không?
Sergio Abreu

3

Để tham khảo cho bất kỳ ai nhìn vào câu hỏi này trong tương lai, đây là một giải pháp hoạt động theo mô hình tương tự như mã giả trong câu hỏi. Nó hoàn toàn dựa trên ý kiến ​​của VanLaser cho cả câu hỏi ban đầu và câu trả lời của EvergreenTree.

function! foo()
    (... do stuff that defines l:pattern ...)
    if search(l:pattern,'nw')
        (... do stuff ...)
    else
        (... do other stuff ...)
    endif
endfunction

Trong trường hợp cụ thể của hàm thực tế bắt nguồn câu hỏi này, giải pháp không thực sự yêu cầu cờ 'nw'. Tuy nhiên, những cờ này sẽ làm cho giải pháp nói chung an toàn hơn, dựa trên mô tả của chúng trong trợ giúp của vim:

'n'     do Not move the cursor
'w'     wrap around the end of the file

(từ :help searchVim 7.4)


Để đơn giản kiểm tra nếu một cái gì đó tồn tại trong bộ đệm, đây là cách tốt nhất để làm điều đó.
EvergreenTree
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.