検索から最初の一致を返す方法
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 + '"')
いくつかのエスケープの問題が発生する可能性があります。