grep / ack / ag出力モードからquery-replaceを使用する方法はありますか?


31

私は承知しているのfind-grep-diredに対応するファイルをマークしてから押すと、Q実行するようにdired-do-query-replace-regexpマークされたファイルに。残念なことに、grepを再起動し、git-grep、ack、またはagを使用find-grepせず、検索用の構文が異なる使用に切り替える必要があります。

私はまたの承知しているmulti-occuroccur-edit-mode、それが発生し使用して検索を再起動する必要があります。最後ag-diredに、ファイルの内容ではなく、ファイル名で一致するように見えます。

私の現在のアプローチは、grep出力を生成し、grepバッファーで開始するマクロを実行し、各一致にアクセスして変更します。query-replace見つかった一致のセットよりも直接使用したいです。

私は何をしたいのは、私は彼らに適切なファイルとコールクエリ正規表現をマーク、またはのためのバッファのリストにgrepの出力を変換できるように、いずれか早く既存のgrepの出力からのdiredバッファを構築することであるmulti-occur私が使用できるようoccur-edit-modeに所定の場所で編集し、query-replaceそのバッファーで実行します。

この機能は存在しますか、またはこの問題を解決する別のワークフローがありますか?

回答:


28

@Malabarbaは、wgrepgrep / ack / agの結果を編集するためのパッケージの使用に言及しました。

agパッケージを使用してwgrep-ag'ag'ged結果の編集を実現するために、パッケージとパッケージをどのように使用するかの詳細なウォークスルーを書きたいと思いmultiple-cursorsます。

これらのパッケージは、Melpaから入手できます。また、システムにag別名the_silver_searcherをインストールする必要があります。

このウォークスルーは、ag見つかったすべての/選択した場所で単一行の編集を行う方法を探している場合に適用されます。

  • agシステムと上記のemacsパッケージにインストールします。

  • ag指定した正規表現に一致するコンテンツを持つファイルの検索をサポートします。agプロジェクトのルートがどこにあるかを知る最も簡単な方法は、.gitそこに空のフォルダーを置くことです。次に、を使用して検索を行いM-x ag-project-regexpます。

  • ag検索の結果バッファーは、デフォルトでは編集できません。編集可能にM-x wgrep-change-to-wgrep-modeするには、wgrep-default bindingを実行または使用しますC-c C-p

  • すべてのファイルで「abcdef」を「ghijkl」に変更する必要がある場合は、「abcdef」を検索すると、ag結果バッファーにその文字列を含むすべての行が表示されます。次に、そのバッファを編集可能にし、それらの文字列を手動で変更するとM-x wgrep-finish-edit、デフォルトのバインディングを実行または使用するときに、それらの変更が実際のファイルバッファに反映されますC-c C-e。を使用query-replace-regexpして、その検索置換を実行することもできます。

  • multiple-cursors複数の編集が同時に行われている場所のリアルタイムのフィードバックを確認できるように、高速リファクタリングに使用することを好みます。そのag結果バッファーで置換する文字列を強調表示し、呼び出してM-x mc/mark-all-like-this、複数のポイントで同時に編集されているものが表示されるのをa敬の念で編集します。

  • 上で述べたように、編集に満足したらC-c C-e、実際のバッファの変更を「反映」します。バッファはまだ保存されていません。

  • すべてのバッファを保存するには、通常、emacsのデフォルトC-x s !バインディングを使用して一度に行います。

スクリーンショットの使用例の例を次に示します。

これは、my のbind-to-modi-maptoのすべてのインスタンスを置き換えるプロセスを示しています。bind-to-my-map~/.emacs.d/

bind-to-modi-mapemacsセットアップフォルダーを検索すると、以下の「ag」の結果が表示されます。ag結果、変更なし

このバッファは読み取り専用です。

M-x wgrep-change-to-wgrep-modeを強調表示した後、を-modi-map使用M-x mc/mark-all-like-thisしてその選択のすべてのインスタンスを選択し-my-map、それらの選択をに編集した後、次のようになります。 複数のカーソルを使用して変更されたagの結果

青いハイライトは、を押すと変更される行を示しますC-c C-e

を押すとC-c C-e、このスクリーンショットの実際のファイルに反映された変更を確認できます。 編集終了後のag結果

次に、を使用して変更されたすべてのファイルを保存しますC-x s !


これは本当に文字列の置換を行う最良の方法です。ag-exclude、簡単に実行できるバッチを念頭に置いたプロジェクトに含まれ、正しいものを交換していることを確認できます。
PascalVKooten

13

私がやりたいのは、既存のgrep出力からdiredバッファーをすばやく構築するか[...]、複数回出現するバッファーのリストにgrep出力を変換する[...]ことです。

grepの結果バッファーを何かに変換する必要はありません。grep出力の編集専用のモードが既にあります(もちろん、ファイルの変更を反映します)。

  1. Melpaからwgrepパッケージをインストールします。
  2. (require 'wgrep) initファイルで。
  3. grep検索を行った後、ヒットC-c C-pして編集してください!
  4. で編集を保存 C-c C-e

ackやagでも動作します。


2
それが私がすることです(ag.elで)。magnarsのマルチカーソル編集と一緒に、単純なリファクタリングは本当に簡単です。
トムレグナー

4

この機能は発射物projectile-replace)内に存在します。可能な場合は、ag / ack / git grep / grepを(この順序で)使用して、出現箇所を検索し、tags-query-replacequery-replaceを実行します。


これには、find-grep-diredと同じ問題があります。既存のgrep出力を使用していません。発射体の複数発生に関しても同様の問題があります。一致するリストを確認した後、クエリの置換を開始し、基になる検索の方法を変更しないことをお勧めします。ただし、代替のワークフローです。
2014

あなたが説明しているような音は、テキストを置き換えて繰り返し呼び出すM-g n C-x e(つまり、next-error発生をスクロールするために使用する)非常に高速なマクロを作成することで簡単に実現できます。
shosti 14

1

Iciclesを使用した別のアプローチを次に示します。

Emacsの*grep*出力バッファーで、Cc `(Ccバッククォート)を押します。これは、Icicleモードではバッファー内*grep*でcommandにバインドされていますicicle-compilation-search。これによりgrep、選択した検索ヒット(ヒット)を任意の順序ですばやく移動できます。

ミニバッファーに入力した入力は、検索ヒットのセットを動的にフィルター処理(絞り込み)し、複数のパターン(部分文字列、正規表現など)を連続して照合することにより、プログレッシブ補完を使用て絞り込むことができます。

検索ヒット間をナビゲートするとき、ヒット(行)全体または現在のミニバッファ入力に一致する部分のみのいずれかをオンデマンドで置き換えることができます。

つらら検索-コンパイルまたはGrepを参照してください。つらら検索へのイントロはここにあり、つらら検索中にマッチを置き換えることに関する情報はここにあります


0

このユーティリティを使用して、 xah_find.elを作成しました

私が書いたのは:

  • 純粋なエリスプ。Windowsでのgrepや、emacsからオペレーティングシステムへのUnicode転送について心配する必要はありません。emacs grep問題
  • あなたが重いユニコードユーザーなら、unixツールにはいくつかのセミバグがあります。Linux uniqの問題
  • 私は毎週5kファイルを見つけて交換します。何年もdired-do-query-replace-regexpを使用していました。インタラクティブな性質に本当に時間を費やしていると感じていますが、変更の結果を確認する必要があります。だから、私のソリューションはバッチを実行していますが、ファイルに書き込むオプションを使用して、すべての検索/置換結果をスキャンできる素晴らしいレポートがあります。

このelisp utilは、おそらくemacsでunix grepを呼び出すよりも5〜10倍遅いですが、私にとってはうまくいきました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.