通常の日本語の文章を書くときの句読点は「、」や「。」を使うけれど、数式を含む文章を書くときの句読点は「,」と「.」を使いたい派です。
10年くらいほど前にこの機能を実現するpunch.elというEmacsのパッケージを配布されている方がいて、便利に使わせて頂いてました。
このpunch.elはMacやWindowsのOSのIMEを利用した場合には上手く動くものの、mozc.elを利用した入力には対応していませんでした。
mozc.elで同じ機能を実現するelispをGrokにお願いして出力してもらったところ、ほぼそのまま利用できるコードを生成してくれました。
mozc-handle-event関数の実行前後の文字列入力位置を記録しておき、その範囲内の句読点をmozc-handle-event実行後に書き換えるという操作をするコードになっています。以下の内容をpunct-mozc.elという名前でEmacs Lispのライブラリに保存します。
(defgroup punct-mozc nil
"Punctuation switcher in mozc"
:group 'punct-mozc
:prefix "punct-mozc-")
(defun punct-mozc-lighter ()
" Punct")
(defun punct-mozc-replace-punctuation (beg end)
"挿入された範囲内の句読点を変換する関数。
BEG と END は挿入された文字列の開始点と終了点を表す。"
(interactive)
(when punct-mozc-mode
(save-excursion
(goto-char (1- beg))
(while (< (point) end)
(let ((char (char-after)))
; (message "Position: %d, Char: %c" (point) char)
(cond
((= char ?、)
(delete-char 1)
(insert ?,))
((= char ?。)
(delete-char 1)
(insert ?.))
(t
(forward-char 1))))))
(goto-char end)))
; (message "Range: %d to %d" beg end))
(defvar punct-mozc-insert-start nil
"挿入開始位置を記録する変数。")
(defun punct-mozc-before-mozc-handle-event (&rest _)
"mozc-handle-event の前に挿入開始位置を記録する。"
(when punct-mozc-mode
(setq punct-mozc-insert-start (point))))
(defun punct-mozc-after-mozc-handle-event (&rest _)
"mozc-handle-event の後に挿入された範囲の句読点を変換する。"
(when (and punct-mozc-mode punct-mozc-insert-start)
(let ((insert-end (point)))
(punct-mozc-replace-punctuation punct-mozc-insert-start insert-end))
(setq punct-mozc-insert-start nil)))
(advice-add 'mozc-handle-event :before #'punct-mozc-before-mozc-handle-event)
(advice-add 'mozc-handle-event :after #'punct-mozc-after-mozc-handle-event)
(define-minor-mode punct-mozc-mode
"Punct mozc mode."
:global nil
:lighter (:eval (punct-mozc-lighter)))
(provide 'punct-mozc)
init.elには次のように設定しています。yatex-modeで読み込む設定です。
;;句読点を全角カンマ、全角ピリオドに統一
(require 'punct-mozc)
(add-hook 'yatex-mode-hook 'punct-mozc-mode)