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
)を無視するために使用されます。
次に、find
and ex
を使用した:bufdo
(を使用しない)シェルコマンドを示します。
find . -name '*.rb' -exec ex +'%s/foo/bar/ge' -V1 -scwq! {} ';'
これ*.rb
により、現在のフォルダー内のすべてのファイルが(再帰的に)その場で編集され、に置き換えfoo
られbar
ます。
/c
フラグを使用して置換を確認することをお勧めします。