2016年11月30日水曜日

[emacs] emacs上のgrep関連機能、複数ファイルの一括置換手順のまとめ

emacs上でgrep関連の機能を利用する際のTIPSをまとめておきます(よく忘れて調べ直すので…)。

grepコマンドのオプション

  • 指定ディレクトリ以下のファイルを再帰的に検索
    • -R DIR    シンボリックリンクを辿る
    • -r  DIR    シンボリックリンクは辿らない
  • 検索対象をファイル名でフィルタする
    • --include=GLOB    GLOBにファイル名を指定する。"*.cpp"のようにワイルドカード(*,?,[...])を指定可能
  • 検索対象から指定ファイル・ディレクトリを除外する
    • --exclude=GLOB   GLOBに除外するファイルのファイル名を指定する(ワイルドカード指定可能)。
    • --exclude-dir=DIR DIRに指定されたディレクトリをスキップ

  • 使用例:
    • docディレクトリ以下の.txtを拡張子に持つ全てのファイルを対象に"Test"という文字列を検索
    • % grep Test -R doc --include="*.txt"
    • includeディレクトリとsrcディレクトリ以下で拡張子が.hもしくは.cppのファイルを対象に"typedef"という文字列を検索(同じオプションを複数回指定することができる)
    • % grep typedef -R src -R include --include="*.h" --include="*.cpp"

*grep*バッファのキーバインディング

  • M-n / TAB
    • (compilation-next-error)次のマッチ箇所へ移動する。
  • n
    • (next-error-no-select)次のマッチ箇所へ移動する。かつ、別バッファに該当ファイルのマッチ箇所が表示される
  • } / M-}
    • (compilation-next-file)同じファイルのマッチ箇所を飛ばして、次のファイルのマッチ箇所へ移動する。
  • M-p / S-TAB
    • (compilation-previous-error)手前のマッチ箇所へ移動する。
  • p
    • (previous-error-no-select)手前のマッチ箇所へ移動する。かつ、別バッファに該当ファイルのマッチ箇所が表示される
  • { / M-{
    • (compilation-previous-file)同じファイルのマッチ箇所を飛ばして、手前のファイルのマッチ箇所へ移動する。
  • g
    • (recompile)再検索
  • q
    • (quit-window)*grep*バッファを閉じる
  • <
    • (beginning-of-buffer)先頭へ移動
  • >
    • (end-of-buffer)末尾へ移動
  • h / ?
    • (describe-mode)ヘルプ。キーバインド一覧が表示される。

wgrepによる一括置換の手順

  1. 置換元文字列を含むファイルをM-x grepで検索
  2. *grep*バッファでC-c C-p(wgrep-change-to-wgrep-mode)を実行
  3. *grep*バッファ内で必要な編集を加える(replace-stringを実行するなど)
  4. C-x C-s(wgrep-finish-edit)で編集を終了
    • この操作を行っても編集した内容はファイルには書き込まれていない(emacs上で開かれた各ファイルのバッファに未保存の状態で変更が反映されるだけ)。
    • ※編集をキャンセルする場合はC-c C-k (wgrep-abort-changes)
  5. M-x wgrep-save-all-buffersを実行し、更新したファイルバッファをディスク上に保存

参考

0 件のコメント:

コメントを投稿