Có thể lấy chuỗi phù hợp sau khi gọi: search ()


14

Trong hàm vimscript, tôi cần gán một chuỗi khớp với một biến l:matchedsau khi gọi search()và tôi tự hỏi liệu có cách nào ngắn hơn những gì tôi hiện đang làm không:

let l:pattern   = '\v^Foo: \zs.*'
let l:line      = search(l:pattern)
let l:line_text = getline(l:line)
let l:matched   = matchstr(l:line, l:pattern)

Lý tưởng nhất, tôi muốn một cái gì đó như

let l:matched = search_text(l:pattern)

withouth phải dùng đến getline(). Có một chức năng vim như vậy mà tôi dường như không thể tìm thấy?


1
Đáng buồn thay, câu trả lời là không.
Sato Katsura

1
protip: các biến cục bộ là mặc định bên trong các hàm để bạn có thể từ bỏ l:khai báo không gian tên.
Peter Rincker

1
trong một chức năng bạn có thể có thể làm: :let @/="pattern" | norm! ygnvà có sẵn nội dung trong đăng ký 0.
Christian Brabandt

Câu trả lời:


7

Vì con trỏ được đặt trên chữ cái đầu tiên của trận đấu, nên bạn có thể thực hiện :normal! y$sau khi tìm kiếm và nhận nội dung đăng ký trong biến cục bộ của bạn.

Một cách tiếp cận khác, mà tôi nghĩ sẽ làm việc ở đây rất tốt, sẽ là sử dụng :substitutevới ncờ (tức là không có sự thay thế thực tế ):

function! ActOn(match)
    " do something with the match
    echo a:match
    " [...]
endfunction

function! FindAndCall(regex, func_name)
    execute ':keeppatterns %s/' . a:regex . '/\=' . a:func_name. '(submatch(0))/gn'
endfunction

... và cái mà bạn gọi như thế này:

:call FindAndCall('^Foo: \zs.*', 'ActOn')

Điều này thực tế tạo ra ActOnmột chức năng gọi lại - nó sẽ được đánh giá cho mỗi trận đấu.


1
Lưu ý: :svới biểu thức thay thế phụ và ncờ chỉ khả dụng kể từ Vim 7.3.627+. Nếu không, bạn cần phải thực hiện một sự thay thế thực sự (khập khiễng vì điều này sẽ đánh dấu bộ đệm là sửa đổi). Bạn cũng có thể muốn lưu và khôi phục đăng ký tìm kiếm @/hoặc sử dụng :keeppatterns.
Peter Rincker

1
Vui lòng sửa lỗi đánh máy: keeppaterns-> keeppatterns. Đó là E488: Trailing charactersnguyên nhân khá khó khăn để truy tìm nguyên nhân. Cảm ơn!
artemave
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.