Можно ли получить соответствующую строку после вызова: search ()

14

В vimscript-функции мне нужно назначить соответствующую строку переменной l:matchedпосле вызова, search()и мне интересно, есть ли более короткий путь, чем то, что я сейчас делаю:

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)

В идеале я бы хотел что-то вроде

let l:matched = search_text(l:pattern)

не прибегая к getline(). Есть ли такая функция vim, которую я не могу найти?

Рене Ниффенеггер
источник
1
К сожалению, ответ - нет.
Сато Кацура
1
protip: локальные переменные по умолчанию внутри функций, так что вы, вероятно, можете отказаться от l:объявления пространства имен.
Питер Ринкер
1
в функции, которую вы, вероятно, можете сделать: :let @/="pattern" | norm! ygnи иметь содержимое в регистре 0 доступным.
Кристиан Брабандт

Ответы:

7

Поскольку курсор находится на 1-й букве совпадения, вы, вероятно, могли бы выполнить :normal! y$поиск после поиска и получить содержимое регистра в локальной переменной.

Другой подход, который, я думаю, будет работать здесь очень хорошо, заключается в использовании :substituteс nфлагом (то есть без фактической замены):

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

... и который вы называете так:

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

Это практически делает ActOnфункцию обратного вызова - она ​​будет оцениваться для каждого совпадения.

VanLaser
источник
1
Примечание: :sс выражением sub-replace и nфлагом доступно только начиная с Vim 7.3.627+. В противном случае вам нужно выполнить подстановку (lame, поскольку это помечает буфер как измененный). Вы, вероятно, также хотите сохранить или восстановить регистр поиска @/или использовать :keeppatterns.
Питер Ринкер
1
Пожалуйста , исправьте опечатку: keeppaterns-> keeppatterns. Это причина, E488: Trailing charactersкоторая довольно сложно проследить до причины. Благодарность!
Артемав