Vimのすべてのプロジェクトファイルで検索と置換(確認付き)を行う最適な方法を探しています。 「プロジェクトファイル」とは、現在のディレクトリにあるファイルを意味し、その一部は開いている必要はありません。
これを行う1つの方法は、現在のディレクトリ内のすべてのファイルを単に開くことです。
:args ./**
次に、開いているすべてのファイルで検索と置換を実行します。
:argdo %s/Search/Replace/gce
ただし、これを行うと、Vimのメモリ使用量が数十MBから2 GBを超えて跳ね上がり、うまくいきません。
EasyGrep プラグインもインストールされていますが、ほとんど機能しません。すべてのオカレンスが見つからないか、押すまでハングします。 CtrlC。これまでのところ、このタスクを検索用語に対して ack-grep に達成するための私の好ましい方法は、クイックフィックスウィンドウを使用して、用語を含み、以前に開かれなかったファイルを開き、最後に:bufdo %s/Search/Replace/gce
。
私は、これに使用できる優れた機能するプラグイン、または現在使用しているものよりも簡単なコマンド/コマンドシーケンスを探しています。
Greplace 私にとってはうまくいきます。
Githubには pathogen ready version もあります。
ここでの他の大きなオプションは、単に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/'
等々!
最近追加された 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
を削除します)
GNUサブセットではなく、より強力な完全なPerl正規表現を利用するために、ackとPerlを使用してこの問題を解決することにしました。
ack -l 'pattern' | xargs Perl -pi -E 's/pattern/replacement/g'
ack は、grep
、find
、および完全なPerl正規表現(GNUサブセットだけでなく)を組み合わせた素晴らしいコマンドラインツールです。 )。純粋なPerlで書かれており、高速で、構文の強調表示があり、Windowsで動作し、従来のコマンドラインツールよりもプログラマーにとって使いやすいです。 Sudo apt-get install ack-grep
を使用してUbuntuにインストールします。
Xargs は、古いUNIXコマンドラインツールです。標準入力から項目を読み取り、指定されたコマンドの後に標準入力用に読み取られた項目を実行します。したがって、基本的にackによって生成されたファイルのリストは、Perl -pi -E 's/pattern/replacemnt/g'
コマンドの最後に追加されています。
Perlはプログラミング言語です。 -pオプションを指定すると、Perlはプログラムの周りにループを作成し、ファイル名の引数を繰り返し処理します。 -iオプションを使用すると、Perlはファイルをその場で編集します。これを変更して、バックアップを作成できます。 -Eオプションにより、Perlはプログラムとして指定された1行のコードを実行します。私たちの場合、プログラムは単なるPerl正規表現の置換です。 Perlコマンドラインオプションの詳細については、 perldoc perlrun
を参照してください。 Perlの詳細については、 http://www.Perl.org/ を参照してください。
多分これを行う:
:noautocmd vim /Search/ **/*
:set hidden
:cfirst
qa
:%s//Replace/gce
:cnf
q
1000@a
:wa
説明:
:noautocmd vim /Search/ **/*
⇒ルックアップ(vim
はvimgrep
の略語です)cwdのすべてのサブディレクトリにあるすべてのファイルのパターンで、autocmd(:noautocmd
)、速度のために。:set hidden
⇒ウィンドウに表示されない変更されたバッファを持つことを許可します(vimrcにあります):cfirst
⇒最初の検索結果にジャンプqa
⇒レジスタへのマクロの記録を開始a:%s//Replace/gce
⇒最後の検索パターンのすべてのオカレンスを置き換えます(まだ/Search/
そのとき)Replace
:g
フラグ)c
フラグ)e
フラグ):cnf
⇒vim
コマンドで作成されたリスト内の次のファイルにジャンプq
⇒マクロの記録を停止1000@a
⇒レジスタに保存されたマクロを1000回再生:wa
⇒変更されたすべてのバッファを保存* EDIT * Vim 8 way:
Vim 8以降では、:cfdo
は、quickfixリスト内のすべてのファイルを反復処理します。
:noautocmd vim /Search/ **/*
:set hidden
:cfdo %s//Replace/gce
:wa
: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
、:Ack
3、:Ggrep
4)。
プロジェクト全体の検索を実行するシーケンスは、次のようにして実行できます。
:vimgrep /pattern/ **/*
:Qargs
:argdo %s/findme/replacement/gc
ここで、:Qargs
は、クイックフィックスリストからarglistを取り込むユーザー定義コマンドの呼び出しです。
次のディスカッション には、このワークフローを2つまたは3つのコマンドに変換する簡単なプラグインへのリンクもあります。
2016年のもう1つのオプション far.vim plugin:
外部依存関係を導入することを気にしない場合、プラグインを作成しました ctrlsf.vim (依存する ack または ag )ジョブ。
Ack/agからの検索結果をフォーマットして表示し、結果バッファーの変更をディスク上の実際のファイルと同期できます。
たぶん、次のデモで詳細を説明します
基本的に、私は単一のコマンドで、より重要なことには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自体の中で置き換えます