Emacs で wdired と moccur-edit を使っていない人は(ry

Emacs で wdired と moccur-edit を使っていない人は(ry と思ったので紹介します。

wdired

wdired ではファイルのリネームが超簡単になります。
mv やエクスプローラで F2 を押してリネームをしている人は wdired を使うべし。


dired で ~/tmp を表示すると以下の様になっているとします。

  /home/taro/tmp:
  合計 273
  drwxr-xr-x  6 taro taro   928 2006-12-26 10:41 .
  drwxr-xr-x 66 taro taro  3632 2006-12-26 10:25 ..
  -rw-r--r--  1 taro taro  2232 2006-11-24 21:36 EndsWithTest.cpp
  -rw-r--r--  1 taro taro   670 2006-11-24 21:24 EndsWithTest.h
  -rw-r--r--  1 taro taro   738 2006-11-24 21:49 JoinTest.cpp
  -rw-r--r--  1 taro taro   421 2006-11-24 21:45 JoinTest.h


この状態で、"r" キーを押すと、 dired のバッファが編集可能になります。(普段はRead onlyですよね。)
例えば、ファイル名、JoinTest.cpp を StrJoinTest.cpp に変えたければ、直接ファイル名を編集してしまえば良いです。
また、例えば、拡張子 cpp を cxx に変更したいとすれば M - % で確認置換を起動し、cpp -> cxx と置換すればOKです。


ファイル名の変更が確定したら C-x C-s (バッファの保存と同じキー操作)とやれば変更が実際に反映されます。
更にうれしいのは、例えば test.cpp をバッファとして開いていたとして、それを test.cxx にリネームした場合にバッファを test.cxx として開き直してくれる点です。

詳細は http://www.bookshelf.jp/soft/meadow_25.html#SEC292 を参照してください。

moccur-edit

M-x moccur-grep などを利用して grep している人は多いと思いますが、この検索結果を直接変更できるのが moccur-edit です。


例えば、*.cpp なファイルの中で printf を デバッグ用の安全な _printf に置き換えたいとします。
その場合 M-x moccur-grep-find して、まずディレクトリを指定します。

Direcotory: ~/contrib/

次に printf を検索に指定します。FileMask を指定していない人を良く見かけますがしぼった方が検索が速い場合が多いです。
今回は拡張子 .cpp で終わるファイルが対象です。

Input Regexp and FileMask: printf .cpp$


検索したら、いっぱい引っかかりました。

Lines matching printf
Buffer: File (grep): /home/taro/contrib/Emulators/infones/InfoNES_System_Mona.cpp

  154 		printf("InfoNES for Mona v0.96J\n");
  155 		printf("copyright (c) 2005, bayside.\n");
  156 		printf("\n");
  157 		printf("usage: infones.ex5 [*.nes]\n");
  158 		printf("keyconfigration:\n");
  159 		printf("    START  : 's'\n");
  160 		printf("    SELECT : 'a'\n");
  161 		printf("    ButtonA: 'x'\n");
  162 		printf("    ButtonB: 'z'\n");
  163 		printf("    SLOWER : 'k'\n");
  164 		printf("    FASTER : 'l'\n");
  165 		printf("    EXIT   : 'ESC'\n");
  451 	printf( "InfoNES:%s\n", pszMsg );
  461 	printf( "InfoNES:%s\n", pszMsg );

Buffer: File (grep): /home/taro/contrib/Emulators/monamona/BfMain.cpp

   93   printf("%c", *mainptr);

たくさん続く


この printf を _printf に置換するんですが、全てのファイルを開き編集するのは件数的に現実的ではなさそうです。
そのような場合には、wdired のときの操作と同じで、 "r" キーで編集モードに入ります。


すると、検索結果のバッファが編集可能になるので、M - % (置換) で、printf -> _printf と置換してやります。
そして置換が終わったら C-x C-s で保存すれば編集が反映されます。


moccur-edit の優しいところは

  • 変更点が色づけされて目立つ
  • 検索結果の編集を間違えた場合は C-x k で編集をキャンセルできる


など細かいとところで使い勝手が良い点です。

詳細は、http://www.bookshelf.jp/soft/meadow_50.html#SEC743 を参照してください。

まとめ

wdired / moccur-edit を使うと、ファイルのリネーム/ファイルの一括置換 がとても簡単に行えます。
結構カルチャショックだと思うので是非使ってみてください。

入門GNU Emacs 入門Meadow/Emacs