В 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, которую я не могу найти?
l:
объявления пространства имен.:let @/="pattern" | norm! ygn
и иметь содержимое в регистре 0 доступным.Ответы:
Поскольку курсор находится на 1-й букве совпадения, вы, вероятно, могли бы выполнить
:normal! y$
поиск после поиска и получить содержимое регистра в локальной переменной.Другой подход, который, я думаю, будет работать здесь очень хорошо, заключается в использовании
:substitute
сn
флагом (то есть без фактической замены):... и который вы называете так:
Это практически делает
ActOn
функцию обратного вызова - она будет оцениваться для каждого совпадения.источник
:s
с выражением sub-replace иn
флагом доступно только начиная с Vim 7.3.627+. В противном случае вам нужно выполнить подстановку (lame, поскольку это помечает буфер как измененный). Вы, вероятно, также хотите сохранить или восстановить регистр поиска@/
или использовать:keeppatterns
.keeppaterns
->keeppatterns
. Это причина,E488: Trailing characters
которая довольно сложно проследить до причины. Благодарность!