正規表現で指定したファイルの文字コードを一括変換
emacsでファイルの文字コードを一括変換する方法は「http://www.bookshelf.jp/soft/meadow_25.html#SEC277」に先例があるが、いちいちdired で操作するのも面倒くさいので、正規表現でファイルを指定するものを用意した。
需要は低いだろな。
利用法
注意
Emacs Lispコード
.emacs に書く。
;======================================================================= ; 特定のファイルの文字コードを一括して変更する ; ;======================================================================= (defun my-interactive-directory-query () ;; moccur-grep-find を参考にした (let ((dir default-directory)) (setq dir (if (and (boundp 'running-xemacs) running-xemacs) (read-directory-name "target directory: " dir) (read-file-name "target directory: " nil nil t))) (if (and (file-exists-p dir) (file-directory-p dir)) (setq dir (file-name-as-directory dir)) (setq dir (file-name-as-directory (file-name-directory dir))) (if (and (file-exists-p dir) (file-directory-p dir)) () (error (format "No such directory %s" dir)) (sleep-for 1) (setq dir nil))) dir)) (defun change-regexp-spcified-file-coding-system (dir regexp coding-system do-bkup) "指定したディレクトリ内の、正規表現に該当するファイルの文字コードを変換する。 ただし文字コードを指定しなくても変換前のファイルが正しい文字コードで開ける場合のみを想定しており、これ以外の場合の動作は保証しない。" (interactive (list (my-interactive-directory-query) (read-string "Filename Regexp: ") (read-coding-system "New Coding System: ") (y-or-n-p "Backup original?: "))) (let* (target-files (bkup-dir nil)) (setq target-files (directory-files dir nil regexp nil)) (if do-bkup (progn (setq bkup-dir (concat dir "bkup")) (if (not ; in case the directory doesnt exist. (and (file-exists-p bkup-dir) (file-directory-p bkup-dir))) (make-directory bkup-dir)) )) (let ((work-list target-files) work-buffer (counter 0) target-file-path) (while work-list (setq target-file-path (concat (expand-file-name dir) (car work-list))) (setq work-buffer (find-file-noselect target-file-path)) (if do-bkup (copy-file target-file-path (concat bkup-dir "/" (car work-list)) t t)) (set-buffer work-buffer) (set-buffer-file-coding-system coding-system) (save-buffer) (kill-buffer work-buffer) (setq counter (1+ counter)) (setq file-name-history (cdr file-name-history)) ;; ファイル名履歴をクリーンに保つ (setq work-list (cdr work-list)) ) (message (concat (int-to-string counter) " files converted.")) ) ))