web-dev-qa-db-ja.com

Vimで一致するテキストをすべて選択しますか?

たくさんのデータがあり、次の正規表現に一致するすべてのものをレジスターにヤンクしたいと思います。

/'user': '[a-Z]*'

すべての一致をVanillavimのレジスタにコピーする方法はありますか? この質問 を見てきましたが、1つの結果に対してのみ機能し、「n」を押して次の結果に移動した後、「// e」を再度使用して、最後に移動します。最初ではなく、次の結果。

this SO question 。これは私が探しているものとほぼ同じですが、動作するように変更する方法がわかりません。それらが存在する行の代わりに特定の一致。

6
Marcus Buffett

これは、nフラグを設定して:sコマンドを実行することで簡単に実現できます(基本的には何も置き換えないようにします(ただし、置換部分で\=を使用すると、まだ一致をキャプチャできます(:h sub-replace-specialを参照)。最初にレジスタAをクリアしましょう。

qaq

次に、以下を使用して、マッチをキャプチャしてレジスタに登録できます。

:%s/'user': '[a-Z]*'/\=setreg('A', submatch(0), 'V')/gn

そして、あなたのマッチを貼り付けます:

:put A

これには少なくともVim7.4が必要です(実際のパッチ番号を忘れました)。

9

"'a'レジスタをクリアします

qaq

"グローバル検索を行い、すべての行( 'A')を 'a'レジスタにヤンクします。

:g/'user': '[a-Z]*'/y A

必要に応じて、:g/ and /y Aの間の部分を変更します。

"別のファイルに貼り付けます

"aP

3
broomdodger

私の ExtractMatchesプラグイン から:YankMatchesコマンドを使用できます。

:%YankMatches /'user': '[a-Z]*'/

デフォルトでは、各一致は新しい行に配置されます。別のセパレーターを使用するには、別の形式があります。

0
Ingo Karkat

おそらくもっと良い方法があります(非常に多くのエントリについて話している場合、これらは非効率的です-何千、何千も話していなければ問題ありません)が、最初に頭に浮かぶのは再帰マクロ。まず、wrapscanオプションをオンにして、ファイルの最後に到達する検索が再び最初にループしないようにします(そうしないと、無限ループになります)。

:set nowrapscan

次に、2つの明確なレジスタがあることを確認します。

qqq
qaq

さて、魔法:

qq/'user': '[a-Z]*'
"Ay//e
@qq

qqはすべてのキーストロークの記録をレジスターqに開始します。大文字を使用すると、vimは上書きされるのではなく、そのレジスタに追加されます。 y//e検索の最後までヤンキーします。 @q(現在空の)qレジスタをマクロとして呼び出し、最後のqは記録を停止します。次に、単純に:

@q
0
evilsoup