ウォンツテック

そでやまのーと

複数ファイルの文字列置換

sodexのprint系の関数名が気に入らないので複数ファイル中に存在するsysPrintXの関数名を一括置換をしようと調べ回っていると、どうやら「moccur-grep-find」をした後に検索出来た物を「M-%」で問い合わせ置換するのが良さそうだという事でいれてみました。

まずは
http://www.bookshelf.jp/soft/meadow_50.html#SEC727
ここから「moccur-color.el」を落としてきてload-pathが通っているディレクトリにコピー。
※私の場合は

;; add load path
(setq load-path
      (append '("/home/xxx/site-lisp/")
              load-path))

というsite-lispディレクトリをload-pathに追加しているのでそこにコピー。
また、

(require 'moccur-color)

を.eamcs.elに追加記述。
また、grepした内容をeditするために「moccur-edit.el」を
http://www.bookshelf.jp/soft/meadow_50.html#SEC743
ここから落としてきてload-pathが通っているディレクトリにコピーし

(require 'moccur-edit)

.emacs.elに追加記述。


これで準備が整ったのでemacsを起動し

M-x moccur-grep-find

ディレクトリを選択

Directory: ~/xxx/src/ 

検索する文字列を入力

Input Regexp and FileMask: sysPrintc 

以下のような検索一覧が現れたら「r」を押して書き込み出来るようにし、「M-%」で1件づつ問い合わせながら置換をする。最後に「C-x C-s」をしてバッファ上の変更を保存してから「C-x s」で各ファイル上の変更を保存。*1すると全てのファイルが書き換わっているだけでなくemacs上で開いているバッファの内容も書き換わっているので非常に便利です。

Lines matching sysPrintc                                                        
Buffer: File (grep): /xxx/yyy/zzz/floppy.c                                                                    
                                                                                
  305     sysPrintc(' ');                                                       
  307   sysPrintc('\n');                                                        
  455     sysPrintc(' ');                                                       
  457   sysPrintc('\n');                                                        
                                                                                
Buffer: File (grep): /xxx/yyy/zzz/idt.c                                                                       
                                                                                
  220     sysPrintc(getKeyCode(a));                                             
  222     sysPrintc('\n');                                                      
                                                                                
Buffer: File (grep): /xxx/yyy/zzz/kernel.c

*1:C-x C-sだけだと検索バッファ上の変更だけで実際には保存されていない