Hatena::ブログ(Diary)

FromAtoMemo

2013-01-12

YaTeXモードで句読点と全角英数字を変換して保存するEmacsLisp

 いろいろググったけど丁度良いEmacs Lispが落ちてなかったので自分で作った。実はちゃんとした方法があるんじゃないかと思ってる。

主な機能

 このEmacsLispがやりたい事は

  • "、"と"。" を ","と"." に変換
  • 全角英数字を半角英数字に変換
  • YaTeXが起動しているバッファでのみ有効化
  • 保存と同時に自動で変換

の4つです。TeX論文やレポートを書いている時に、うっかり『、。』や全角英数字を残したままコンパイルしちゃって、「んぐー!めんどくさい!」ってなる現象を根絶する事ができます。

ソースコード

※このコードを参考・使用して発生したいかなる損害にも、筆者は一切の責任を持ちません。自己責任でご使用ください。まぁ、「論文データぶっとんだぞ!!卒業できん!!」とか言われても、知ったこっちゃないので自己責任で使ってね。

gistはこちらhttps://gist.github.com/4518441

;;バッファ全体の句読点と読点をコンマとピリオドに変換
(defun replace-commaperiod-buffer ()
  (interactive "r")
  (save-excursion
    (replace-string "、" "," nil (point-min) (point-max))
    (replace-string "。" "." nil (point-min) (point-max))))

;;選択範囲内の全角英数字を半角英数字に変換
(defun hankaku-eisuu-region (start end)
  (interactive "r")
  (while (string-match
          "[0-9A-Za-z]+"
          (buffer-substring start end))
    (save-excursion
      (japanese-hankaku-region
       (+ start (match-beginning 0))
       (+ start (match-end 0))
       ))))

;;バッファ全体の全角英数字を半角英数字に変換
(defun hankaku-eisuu-buffer ()
  (interactive)
  (hankaku-eisuu-region (point-min) (point-max)))

;;YaTeXモードの時にのみ動作させる用に条件分岐
(defun replace-commaperiod-before-save-if-needed ()
  (when (memq major-mode
              '(yatex-mode))
    (replace-commaperiod-buffer)(hankaku-eisuu-buffer)))

;;保存前フックに追加
(add-hook 'before-save-hook 'replace-commaperiod-before-save-if-needed)

コードを読むとわかりますが、YaTeXモードを使ってTeXを書いてること前提です。ほかのモードを使っている方は、

;;YaTeXモードの時にのみ動作させる用に条件分岐
(defun replace-commaperiod-before-save-if-needed ()
  (when (memq major-mode
              '(yatex-mode))
    (replace-commaperiod-buffer)(hankaku-eisuu-buffer)))

この部分に対応するモードを追加して下さい。

参考にさせて頂いたもの

句読点変換:https://gist.github.com/3100452

全角英数字変換:https://github.com/tomoyamachi/dotfiles/blob/master/.emacs#L876


まとめ

 これを使えばわざわざIMEの設定を変えたり、コンパイル前に置換作業しなくてもOK。TeXコンパイル前に置換するのは、結構忘れがちなのでこれで一安心です。「IMEの設定変更しておけば良いじゃん。」って意見もあるけど、個人的に普通の文章では『、。』を使って、論文やレポートでは『,.』を使いたいので、わざわざ書いてみた。

 バグ報告やリファクタリングも、お待ちしておりますのでお気軽にGistにコメント下さい。

トラックバック - http://d.hatena.ne.jp/FromAtom/20130112/1358009997