web-dev-qa-db-ja.com

すべてのプロジェクトファイルでVimを検索および置換

Vimのすべてのプロジェクトファイルで検索と置換(確認付き)を行う最適な方法を探しています。 「プロジェクトファイル」とは、現在のディレクトリにあるファイルを意味し、その一部は開いている必要はありません。

これを行う1つの方法は、現在のディレクトリ内のすべてのファイルを単に開くことです。

:args ./**

次に、開いているすべてのファイルで検索と置換を実行します。

:argdo %s/Search/Replace/gce

ただし、これを行うと、Vimのメモリ使用量が数十MBから2 GBを超えて跳ね上がり、うまくいきません。

EasyGrep プラグインもインストールされていますが、ほとんど機能しません。すべてのオカレンスが見つからないか、押すまでハングします。 CtrlC。これまでのところ、このタスクを検索用語に対して ack-grep に達成するための私の好ましい方法は、クイックフィックスウィンドウを使用して、用語を含み、以前に開かれなかったファイルを開き、最後に:bufdo %s/Search/Replace/gce

私は、これに使用できる優れた機能するプラグイン、または現在使用しているものよりも簡単なコマンド/コマンドシーケンスを探しています。

109
psyho

Greplace 私にとってはうまくいきます。

Githubには pathogen ready version もあります。

26
tuxcanfly

ここでの他の大きなオプションは、単にvimを使用しないことです。

sed -i 's/pattern/replacement/' <files>

または、ファイルのリストを生成する何らかの方法がある場合、おそらく次のようになります。

find . -name *.cpp | xargs sed -i 's/pattern/replacement/'
grep -rl 'pattern1' | xargs sed -i 's/pattern2/replacement/'

等々!

94
Cascabel

最近追加された cdo command のおかげで、インストールしたgrepツールを使用して2つの簡単なコマンドでこれを実行できるようになりました。追加のプラグインは必要ありません!:

1. :grep <search term>
2. :cdo %s/<search term>/<replace term>/gc
3. (If you want to save the changes in all files) :cdo update

cdoは、grepコマンドが入力するクイックフィックスリストの各用語に対して、指定されたコマンドを実行します。)

(毎回確認せずに各検索語を置き換える場合は、2番目のコマンドの最後にあるcを削除します)

54
Sid

GNUサブセットではなく、より強力な完全なPerl正規表現を利用するために、ackとPerlを使用してこの問題を解決することにしました。

ack -l 'pattern' | xargs Perl -pi -E 's/pattern/replacement/g'

説明

ack

ack は、grepfind、および完全なPerl正規表現(GNUサブセットだけでなく)を組み合わせた素晴らしいコマンドラインツールです。 )。純粋なPerlで書かれており、高速で、構文の強調表示があり、Windowsで動作し、従来のコマンドラインツールよりもプログラマーにとって使いやすいです。 Sudo apt-get install ack-grepを使用してUbuntuにインストールします。

xargs

Xargs は、古いUNIXコマンドラインツールです。標準入力から項目を読み取り、指定されたコマンドの後に標準入力用に読み取られた項目を実行します。したがって、基本的にackによって生成されたファイルのリストは、Perl -pi -E 's/pattern/replacemnt/g'コマンドの最後に追加されています。

Perl -pi

Perlはプログラミング言語です。 -pオプションを指定すると、Perlはプログラムの周りにループを作成し、ファイル名の引数を繰り返し処理します。 -iオプションを使用すると、Perlはファイルをその場で編集します。これを変更して、バックアップを作成できます。 -Eオプションにより、Perlはプログラムとして指定された1行のコードを実行します。私たちの場合、プログラムは単なるPerl正規表現の置換です。 Perlコマンドラインオプションの詳細については、 perldoc perlrun を参照してください。 Perlの詳細については、 http://www.Perl.org/ を参照してください。

34
Eric Johnson

多分これを行う:

:noautocmd vim /Search/ **/*
:set hidden
:cfirst
qa
:%s//Replace/gce
:cnf
q
1000@a
:wa

説明:

  • :noautocmd vim /Search/ **/*⇒ルックアップ(vimvimgrepの略語です)cwdのすべてのサブディレクトリにあるすべてのファイルのパターンで、autocmd(:noautocmd)、速度のために。
  • :set hidden⇒ウィンドウに表示されない変更されたバッファを持つことを許可します(vimrcにあります)
  • :cfirst⇒最初の検索結果にジャンプ
  • qa⇒レジスタへのマクロの記録を開始a
  • :%s//Replace/gce⇒最後の検索パターンのすべてのオカレンスを置き換えます(まだ/Search/そのとき)Replace
    • 同じ行で数回(gフラグ)
    • ユーザー確認付き(cフラグ)
    • パターンが見つからない場合はエラーなし(eフラグ)
  • :cnfvimコマンドで作成されたリスト内の次のファイルにジャンプ
  • q⇒マクロの記録を停止
  • 1000@a⇒レジスタに保存されたマクロを1000回再生
  • :wa⇒変更されたすべてのバッファを保存

* EDIT * Vim 8 way:

Vim 8以降では、:cfdoは、quickfixリスト内のすべてのファイルを反復処理します。

:noautocmd vim /Search/ **/*
:set hidden
:cfdo %s//Replace/gce
:wa
22
Benoit

シェルコマンドから:argsを生成します

可能です(一部のオペレーティングシステムで1))シェルコマンドを介して:argsのファイルを提供します。

たとえば、ackがある場合2 インストール済み、

:args `ack -l pattern`

ackに 'pattern'を含むファイルのリストを返すように要求し、これらを引数リストに入れます。

または、単純なol 'grepを使用すると、次のようになります。

:args `grep -lr pattern .`  


その後、OPの説明に従って:argdoを使用できます。

:argdo %s/pattern/replacement/gce


クイックフィックスリストから:argsを入力します

nelstrom's answer もチェックしてください。現在のクイックフィックスリストからarglistを生成する単純なユーザー定義コマンドを説明する関連する質問に。これは、出力がクイックフィックスリスト(:vimgrep:Ack3:Ggrep4)。

プロジェクト全体の検索を実行するシーケンスは、次のようにして実行できます。

:vimgrep /pattern/ **/*
:Qargs 
:argdo %s/findme/replacement/gc

ここで、:Qargsは、クイックフィックスリストからarglistを取り込むユーザー定義コマンドの呼び出しです。

次のディスカッション には、このワークフローを2つまたは3つのコマンドに変換する簡単なプラグインへのリンクもあります。

リンク集

  1. :h {arglist}-vimdoc.sourceforge.net/htmldoc/editing.html#{arglist}
  2. ack- betterthangrep.com/
  3. ack.vim- github.com/mileszs/ack.vim
  4. fugitive- github.com/tpope/vim-fugitive
21
exbinary

2016年のもう1つのオプション far.vim plugin:

far.vom

7
Oleg Khalidov

外部依存関係を導入することを気にしない場合、プラグインを作成しました ctrlsf.vim (依存する ack または ag )ジョブ。

Ack/agからの検索結果をフォーマットして表示し、結果バッファーの変更をディスク上の実際のファイルと同期できます。

たぶん、次のデモで詳細を説明します

ctrlsf_edit_demo

5
dyng

基本的に、私は単一のコマンドで、より重要なことにはvim内で置換を望んでいました

@ Jefromiによる回答 に基づいて、キーボードショートカットを作成しました。このショートカットを.vimrcファイルに設定しました

nmap <leader>r :!grep -r -l  * \| xargs sed -i -e 's///g'

今vimから、リーダー+ rのストロークで、vimにコマンドをロードします。これは以下のように編集します、

:!grep -r -l <find> <file pattern> | xargs sed -i -e 's/<find>/<replace>/g'

したがって、私は単一のコマンドで置き換えを行い、より重要なことにはvim自体の中で置き換えます

0
deepak