検索一致サブセクションと等しい変数を設定します

Aug 25 2020

不必要なコンテキスト:

closetag.vimは複雑に見えるので、開いているHTMLタグを閉じる関数を作成したいと思います。また、Vimで実行するすべてのものを理解したいと思います。
これについての私の計画は、最新の前の<\w+セグメントと一致し、何でも取得して\w+</\1>この関数を実行したときにカーソル位置に出力することです。


質問:

関数内の変数を、?の\w\+後に続く最新の前のインスタンスと等しく設定するにはどうすればよい<ですか?で検索を行うことはできますが?<\(\w\+\)、キャプチャグループの使用法を尊重するものは見つかりませんでした。

私が発見したmatchesgetmatchesして:help(とsearchposとgetlineSO上)が、2つの組み込みコマンドを使用するよりも簡単な方法があるはずのように、それは確かに感じています。検索レジスタについては知っていますが、上記のリテラル正規表現のみが含まれており、一致したものは含まれていません。

以下のように見えます同様の質問が5ヶ月前に頼まれたが、唯一の答えは、同じ行にタグをマッチングについてです、と私はもっとやりたいです。一致全体を視覚的に強調表示する方法を示すこの質問を見つけましたが、キャプチャグループの制限をあきらめた場合に最適な方法のように見えますが、キャプチャグループを処理できません。

TL; DR:キャプチャグループの検索結果の内容を変数に取り込む簡単な方法はありますか?

回答

2 jeremysprofile Aug 25 2020 at 23:20

私はこれらの 3つの 答えを組み合わせて自分の機能を作ることになりました。

いいえ、検索からキャプチャグループだけを取得する方法はありませんが、目標が1つのキャプチャグループだけである場合は、グループの開始点と終了点として、\zsおよび/または\zeハイライトとカーソルの位置を決定するために使用できます。

" Ex: change <\(\w\+\) to to <\zs\w\+\ze (replace capture group with \zs and \ze)
function! GetMatch(pattern)
    let l:cursor_pos = getpos(".")
    let @/ = a:pattern
    " preserve old register content
    let savereg = @f
    " empty "f in case we don't find a match
    " if we skipped this, "f would keep whatever was in there before.
    let @f = ""
    normal "fygN
    let match = @f
    " restore register content
    let @f = l:savereg
    call setpos(".", l:cursor_pos)
    echo l:match
    return l:match
endfunction

初期状態を取得しcursor_pos/検索レジスタを設定します。

そこから、検索結果を一時的に任意のレジスタに取得し(関数の場合はfを使用します)、そのレジスタの内容を保持する変数を設定して、cursor_pos元の位置にリセットします。 。

最終的には検索するパターンをハードコーディングする予定です<\zs\w\+が、これはテスト目的で役立ち、検索するすべての人にこれを行う方法を紹介する必要があります。