Vimについての未解決の質問の1つは、現在のプロジェクトで検索/置換を実行する方法があるかどうかです(他のエディターから継承されたこの概念を使用する場合はご容赦ください)。
たとえば、プロジェクトファイルでメソッド名を検索し、そのメソッド呼び出しのすべてのインスタンスの名前を変更したいとします。
これがSublimeの進め方です。

ackまたはなどの他のプログラムに依存せずに、Vim(おそらくMacVim)でこれをどのように行いますかsed?
Vimについての未解決の質問の1つは、現在のプロジェクトで検索/置換を実行する方法があるかどうかです(他のエディターから継承されたこの概念を使用する場合はご容赦ください)。
たとえば、プロジェクトファイルでメソッド名を検索し、そのメソッド呼び出しのすべてのインスタンスの名前を変更したいとします。
これがSublimeの進め方です。

ackまたはなどの他のプログラムに依存せずに、Vim(おそらくMacVim)でこれをどのように行いますかsed?
回答:
これを行うにはいくつかの方法があります。
プロジェクトツリーで検索/置換を実行する場合は、Vimの引数リストを使用できます。
Vimを開き、:argsコマンドを使用して引数リストを作成します。複数のファイル名またはグロブさえ渡すことができます。
たとえば:args **/*.rb、現在のディレクトリで再帰的にrubyファイルを検索します。これは、でVimを開くようなものvim **/*.rbです。シェルのfindコマンドを使用して、現在のディレクトリ内のすべてのファイルのリストを取得することもできます:
:args `find . -type f`
:args単独で実行することにより、現在の引数リストを表示できます。リストからファイルを追加または削除する場合は、:argaddまたは:argdeleteコマンドをそれぞれ使用できます。
リストに満足したら:argdo、引数リスト内のすべてのファイルに対してコマンドを実行するVimの強力なコマンドを使用できます。:argdo %s/search/replace/g
検索のヒントをいくつか紹介します(いくつかのコメントに基づく):
\<and \>構造を使用します。:argdo %s/\<search\>/foobar/g/c検索用語を置換する前にVimに確認を求める場合は、検索フラグを使用します。/e「パターンが見つかりません」エラーをスキップする場合は、検索フラグを使用します。:argdo %s/search/replace/g | update。:update変更された場合にのみファイルを保存するため、ここで使用されます。検索/置換を実行するバッファを既に開いている場合は、を使用:bufdoして、バッファリストのすべてのファイルに対してコマンドを実行できます(:ls)。
コマンドは非常に似てい:argdoます: :bufdo %s/search/replace/g
同様に:argdoして:bufdo、そこにある:windoと:tabdo、それぞれのウィンドウとタブ上の行為。あまり使用されませんが、知っておくと便利です。
\<を使用することをお勧めします。\>search
:cd %:p:h。その他の作業ディレクトリオプションは、vim.wikia.com / wiki / Set_working_directory_to_the_current_fileにリストされています。
次のような単純なプロジェクト構造があるとします。
greeting.txtは次のようになります
info / age.txtは次のようになります
Samのすべての出現をBobに置き換えたいとします。ここに私たちがやることがあります:
作業ディレクトリを設定する
Vimの現在の作業ディレクトリがプロジェクトのルートであることを確認してください(ここでこれを行う方法は説明しません)。
「サム」を含むファイルを検索する
Vimのvimgrepコマンドを使用して、プロジェクト内で発生するすべてのSamを検索します(注:**/*すべてのファイルを再帰的に検索します)
:vimgrep /Sam/gj **/*
これにより、クイックフィックスリストにSamのすべてのインスタンスが入力されます。クイックフィックスリストを表示する場合は、Vimコマンドを使用できます:copen

「Sam」を含むすべてのファイル内で置換
ここで、クイックフィックスリストのすべてのファイル内でVimの代替コマンドを実行します。これ:cfdo {cmd}は、クイックフィックスリストの各ファイルで{cmd}を実行するコマンドを使用して実行できます。私たちが使用する特定の{cmdは}であるsubstituteか、s略し。完全な行は次のようになります。
:cfdo %s/Sam/Bob/g
必要に応じて、cフラグを追加してすべての置換を確認できます。
:cfdo %s/Sam/Bob/gc
すべてのファイルを保存する
:cfdo update
cfdo %s/Sam/Bob/g | update固定している私のために
hiddenオプションを設定することをお勧めします:set hidden。
VIMソリューションではありませんが、VI / VIMを使用している場合は、CLIソリューションを使用する方が簡単な場合があります。現在のディレクトリ内のすべてのファイルを変更perlするには、次のような状況で作成されたとおりに使用します。
$ perl -pi -e 's/foo/bar/g' *
あなたもサブディレクトリでそれを行う必要がある場合、私は通常とペアにperlなりfindます:
$ find . -name '*' -print0 | xargs -0 perl -pi -e 's/foo/bar/g'
これの良い点は、リストを特定のファイルタイプに簡単にさらに絞り込むことができることです。たとえば、Pythonファイルに制限するには:
$ perl -pi -e 's/foo/bar/g' *.py
$ find . -name '*.py' -print0 | xargs -0 perl -pi -e 's/foo/bar/g'
フレーズを別のフレーズに置き換えるには、Vim Exモードを使用できます。
例(exはのエイリアスvim -E):
$ ex -s +'bufdo!%s/foo/bar/g' -cxa *.*
bash / zshで再帰的に(globstarセットなどでshopt -s globstar):
$ ex -s +'bufdo!%s/foo/bar/g' -cxa **/*.*
$ ex -s +'n **/*.*' +'bufdo!%s/foo/bar/g' -cxa
再帰的に(findファイルなどの隠しファイルを使用および無視.git):
$ find . -type f -not -path '*/\.*' -exec ex -s +'bufdo!%s/foo/bar/g' -cxa {} "+"
注::bufdoコマンドはPOSIXではありません。
注:構文-not -path '*/\.*'は、隠しファイル(など.git)を無視するために使用されます。
次に、findand exを使用した:bufdo(を使用しない)シェルコマンドを示します。
find . -name '*.rb' -exec ex +'%s/foo/bar/ge' -V1 -scwq! {} ';'
これ*.rbにより、現在のフォルダー内のすべてのファイルが(再帰的に)その場で編集され、に置き換えfooられbarます。
/cフラグを使用して置換を確認することをお勧めします。