Чи можна отримати відповідний рядок після виклику: search ()


15

У функції 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
На жаль, відповідь - ні.
Сато Кацура

2
protip: локальні змінні є типовою функцією всередині функцій, тому ви, ймовірно, можете відмовитись від l:декларації простору імен.
Пітер Рінкер

2
у функції, яку ви, ймовірно, можете виконувати: :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функцію зворотного дзвінка - вона буде оцінюватися для кожного матчу.


1
Примітка: :sіз виразом nсубзаміни та прапор доступний лише з Vim 7.3.627+. Інакше вам потрібно зробити фактично заміну (кульга, оскільки це позначить буфер як змінений). Можливо, ви також хочете зберегти та відновити реєстр пошуку @/, або використовувати :keeppatterns.
Пітер Рінкер

2
Виправте помилку помилки: keeppaterns-> keeppatterns. Це викликає, E488: Trailing charactersщо досить складно простежити за причиною. Спасибі!
артемав
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.