どせいたんさき。

ナスダヨー

emacs で保存時にテキストを置換して整形する (before-save-hook)

目的

emacs をある特定のモードで起動しているときに,テキストの一部を自動的に置換することを考える.具体的には句読点「.,」を半角に変換して保存したい.置換する機能そのものは while を用いて以下のように書ける.

(while (re-search-forward "." nil t) (replace-match ". "))

これを「テキストを保存する前の下処理として」「バッファ全体に適応」させたい.また,意図しないところでこの機能が働いてしまうのも怖いのでとりあえず「latex-modehtml-helper-mode でのみ機能する」ようにしたい.

解決策

まず「テキストを保存する前の下処理として」機能させるためには関数を before-save-hook に登録すればよい.

(add-hook 'before-save-hook 'hogehoge-function)

次に「バッファ全体に適応」させるためには (1) 現在地点を記憶, (2) バッファの先頭に移動, (3) 置換を実行, (4) 記憶していた位置に移動というステップを踏めばいいとわかる. lisp っぽくないが以下のように記述すると実現できた.

(push-mark (point))
(beginning-of-buffer)
(while (re-search-forward "." nil t) (replace-match ". "))
(pop-mark)
(goto-char (mark))

最後に「latex-modehtml-helper-mode でのみ機能する」ようにするためには derived-mode-p を用いればいいことがわかった

(while (derived-mode-p 'latex-mode 'html-helper-mode)
  fugafuga-function
  homuhomu-function)

最終的に全部まとめると以下のようになる.応用すれば行末の空白を削除するとかタブ文字を半角スペースに変換することもできそうである.