日記書いたりメモ書いたり
text-adjust.el
最近は全角文字と半角文字の間には半角スペースを入れるようにしている (例外もある) が、この作業はかなり面倒くさい。例えば、1にちと入力して変換すると 1日となるが、変換確定後にわざわざ戻ってから入力モードを直接入力にして、半角スペースを打ち込まなければならない。他にも、小括弧とかの非全角文字を打つときも同様だ。こんな作業は自動でできないものかと思っていたら、それを実現してくれる拡張 ELisp があった。text-adjust.el というものだ。主な機能を引用してみる。
- 半角カナ, 規格外文字を「〓」に置き換える
- 全角英数を半角にする
- 句読点を置き換える
- 全角文字と半角文字の間に空白を入れる
この拡張 ELisp、特に問題はなさそうだが、実は結構重大な問題があった。それは、句読点と小括弧などが隣接しているときにも半角スペースを挿入してしまうというものと、全角文字と半角文字が HTML タグに挟まれている場合に空白がうまく入らないというものだ。というわけで、いろいろいじくり回して実現してみた。いやあ、Emacs の正規表現は見にくくてたいへんだった。とりあえず、設定ファイルに書いた内容を書いておく。
;; text-adjust
(load "text-adjust")
(setq adaptive-fill-regexp "[ \t]*")
(setq adaptive-fill-mode t)
(setq text-adjust-rule-kutouten text-adjust-rule-kutouten-zkuten)
(setq text-adjust-rule-space
'(
(("[])}\"'!?0-9a-zA-Z+]" " ?" "[、。,.!?」』】》’”]}〉)〕]") "")
(("[、。,.「『【《‘“[{〈(〔]" " ?" "[[({\"'0-9a-zA-Z+]") "")
(("\cj\|)\|\]\\|}" "" "[[{(\"'/!?0-9a-zA-Z+]") " ")
(("[]})\"'/!?0-9a-zA-Z+]" "" "(\\|{\\|\\[\\|\\cj") " ")
))
(defvar text-adjust-mode-html-rule
'(
(("</[^>]*>" " ?" "[、。,.!?」』】》’”]}〉)〕]") "")
(("[、。,.!?「『【《‘“[{〈(〔]" " ?" "<[^/>]*>") "")
(("\\cj\\|)\\|\\]\\|}" "<[^/>]*>" "[[{(\"'0-9a-zA-Z+]") " {2}")
(("\\cj\\|)\\|\\]\\|}" "</[^>]*>" "[[{(\"'!?0-9a-zA-Z+]") "{2} ")
(("[]})/!?0-9a-zA-Z+]" "<[^/>]*>" "(\\|{\\|\\[\\|\\cj") " {2}")
(("[]})\"'/0-9a-zA-Z+]" "</[^>]*>" "(\\|{\\|\\[\\|\\cj") "{2} ")
))
(setq text-adjust-mode-skip-rule
(list
(append '(sgml-mode) text-adjust-mode-html-rule)
(append '(html-mode) text-adjust-mode-html-rule)
(append '(xml-mode) text-adjust-mode-html-rule)
(append '(nxml-mode) text-adjust-mode-html-rule)
(append '(nxhtml-mode) text-adjust-mode-html-rule)
(append '(mapae-mode) text-adjust-mode-html-rule)
))
実は、この設定をする際、text-adjust-mode-skip-rule
内で HTML や XML を編集するモードでの設定を変数にして、いっぺんに設定しようとしたんだが、はまってしまった。それもたった一文字のミス。 text-adjust-mode-skip-rule
にリストを与える際に、quote
してしまっていたおかげで、append
とかの関数が実行されないでいた。アポストロフィを消したら想像通りの動作になったorz このミスのせいでたぶん何時間もむだになった。まあ、こうやって調べてるときが楽しいのだが。こんなことも調べまくっていたから、Lisp についてそこそこ理解できた。いつもよくわからないでコードを見ていたけど、今は少しは理解できる。
前々から気づいていた点を反映したコードに直しておいた。
自分で使っていてミスに気づいて修正した。完璧にはできないな、こりゃ。個々人の中での規則が違うわけだから当然といえば当然なんだが。