: search () 호출 후 일치하는 문자열을 얻을 수 있습니까?


14

vimscript-function에서 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
슬프게도 대답은 '아니요'입니다.
Sato Katsura

1
protip : 지역 변수는 함수 내부의 기본값이므로 l:네임 스페이스 선언을 잊을 수 있습니다 .
Peter Rincker

1
함수에서 당신은 아마 할 수 있습니다 : :let @/="pattern" | norm! ygn레지스터 0의 내용을 사용할 수 있습니다.
Christian Brabandt

답변:


7

커서는 일치하는 첫 번째 문자에 위치 :normal! y$하므로 검색 후 수행하고 로컬 변수에서 레지스터 내용을 가져올 수 있습니다.

내가 여기서 잘 작동한다고 생각되는 또 다른 접근법 :substituten플래그 와 함께 사용 하는 것 입니다 (즉, 실제 대체 없이 ).

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
참고 : :ssub-replace-expression과 n플래그를 사용하면 Vim 7.3.627+부터 만 사용할 수 있습니다. 그렇지 않으면 실제로 대체를 수행해야합니다 (버퍼가 수정 된 것으로 표시되므로 불충분합니다). 검색 레지스터를 저장 및 복원하거나을 사용하려고 할 수도 @/있습니다 :keeppatterns.
Peter Rincker

1
오타를 수정하십시오 : keeppaterns-> keeppatterns. 원인 E488: Trailing characters을 추적하는 것이 다소 까다로운 원인입니다. 감사!
artemave
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.