: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

カーソルは一致の最初の文字に置かれるため、おそらく:normal! y$検索後にa を実行し、ローカル変数のレジスタの内容を取得できます。

ここで非常にうまく機能すると思う別のアプローチは: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
ピーターリンカー

1
タイプミスを修正してください:keeppaterns-> keeppatterns。原因E488: Trailing charactersにたどり着くのはどちらかというと難しいのです。ありがとう!
artemave
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.