検索から最初の一致を返す方法

Aug 21 2020

vimの検索パターンについての質問に続いて、カーソル位置を含み、複数行である検索パターンの最初の一致(存在する場合)に対応するテキストを取得したいと思います

これがテキストの例です(マークダウンPythonセル):

```python
x = 10
```

```python
[p]rint(x)
```

[]カーソル位置決幅を示しています。

私の検索パターン:

\(```python\n\)\@<=\%(\%(```\)\@!\_.\)*\%#\_.\{-}\(```\)\@= 

Wichはテキストに対応しますprint(x)

したがって、基本的には、このテキストを抽出して、vimscriptの変数に保存したいと思います。

ありがとうございました。

回答

4 NickSkywalker Aug 22 2020 at 14:26

だから私はそれgnが私が必要としているものだとわかりました。から:help gn

nのように、最後に使用した検索パターンを前方に検索し、ビジュアルモードを開始して一致するものを選択します。カーソルが一致する場合は、視覚的に選択します。オペレーターが保留中の場合、試合を操作します。

つまり、それをyankと組み合わせて、レジスタから変数にテキストを取得できるということです。

そこで、パターンに一致するテキストを取得する関数を作成しました。

function! GetMatch(pattern)
    get matched = search(a:pattern)
    if l:matched
        " save register content
        let savereg = @9
        normal "9ygn
        let match = @9
        " restore register content
        let @9 = l:savereg
    else
        let match = ""
    endif
    return l:match
endfunction

更新:テストなしの別のバージョン:

function! GetMatch(pattern)
    let found = search(a:pattern)
    " save register content
    let savereg = @9
    normal "9ygn
    let match = @9
    " restore register content
    let @9 = l:savereg
    return l:match
endfunction
1 eyalkarni Aug 22 2020 at 05:05

少しやり過ぎですが、パターンの一致したグループに基づいてpythonコマンドを実行する方法を参照してください。

パターン(最初の一致グループ)に基づいて、Pythonコマンドを実行できます。ここではvim変数を設定します。

:%GL/PATTERN/py vim.command("let var='" + match + '"')

いくつかのエスケープの問題が発生する可能性があります。