1. メモ帳日記 >
  2. PC >
  3. text-adjust.el

メモ帳日記

日記書いたりメモ書いたり

2007年 4月 4日(赤口

text-adjust.el

最近は全角文字と半角文字の間には半角スペースを入れるようにしている (例外もある) が、この作業はかなり面倒くさい。例えば、1にちと入力して変換すると 1日となるが、変換確定後にわざわざ戻ってから入力モードを直接入力にして、半角スペースを打ち込まなければならない。他にも、小括弧とかの非全角文字を打つときも同様だ。こんな作業は自動でできないものかと思っていたら、それを実現してくれる拡張 ELisp があった。text-adjust.el というものだ。主な機能を引用してみる。

text-adjust.el
  • 半角カナ, 規格外文字を「〓」に置き換える
  • 全角英数を半角にする
  • 句読点を置き換える
  • 全角文字と半角文字の間に空白を入れる

この拡張 ELisp、特に問題はなさそうだが、実は結構重大な問題があった。それは、句読点と小括弧などが隣接しているときにも半角スペースを挿入してしまうというものと、全角文字と半角文字が HTML タグに挟まれている場合に空白がうまく入らないというものだ。というわけで、いろいろいじくり回して実現してみた。いやあ、Emacs の正規表現は見にくくてたいへんだった。とりあえず、設定ファイルに書いた内容を書いておく。

  1. ;; text-adjust
  2. (load "text-adjust")
  3. (setq adaptive-fill-regexp "[ \t]*")
  4. (setq adaptive-fill-mode t)
  5. (setq text-adjust-rule-kutouten text-adjust-rule-kutouten-zkuten)
  6. (setq text-adjust-rule-space
  7. '(
  8. (("[])}\"'!?0-9a-zA-Z+]" " ?" "[、。,.!?」』】》’”]}〉)〕]") "")
  9. (("[、。,.「『【《‘“[{〈(〔]" " ?" "[[({\"'0-9a-zA-Z+]") "")
  10. (("\cj\|)\|\]\\|}" "" "[[{(\"'/!?0-9a-zA-Z+]") " ")
  11. (("[]})\"'/!?0-9a-zA-Z+]" "" "(\\|{\\|\\[\\|\\cj") " ")
  12. ))
  13. (defvar text-adjust-mode-html-rule
  14. '(
  15. (("</[^>]*>" " ?" "[、。,.!?」』】》’”]}〉)〕]") "")
  16. (("[、。,.!?「『【《‘“[{〈(〔]" " ?" "<[^/>]*>") "")
  17. (("\\cj\\|)\\|\\]\\|}" "<[^/>]*>" "[[{(\"'0-9a-zA-Z+]") " {2}")
  18. (("\\cj\\|)\\|\\]\\|}" "</[^>]*>" "[[{(\"'!?0-9a-zA-Z+]") "{2} ")
  19. (("[]})/!?0-9a-zA-Z+]" "<[^/>]*>" "(\\|{\\|\\[\\|\\cj") " {2}")
  20. (("[]})\"'/0-9a-zA-Z+]" "</[^>]*>" "(\\|{\\|\\[\\|\\cj") "{2} ")
  21. ))
  22. (setq text-adjust-mode-skip-rule
  23. (list
  24. (append '(sgml-mode) text-adjust-mode-html-rule)
  25. (append '(html-mode) text-adjust-mode-html-rule)
  26. (append '(xml-mode) text-adjust-mode-html-rule)
  27. (append '(nxml-mode) text-adjust-mode-html-rule)
  28. (append '(nxhtml-mode) text-adjust-mode-html-rule)
  29. (append '(mapae-mode) text-adjust-mode-html-rule)
  30. ))

実は、この設定をする際、text-adjust-mode-skip-rule 内で HTML や XML を編集するモードでの設定を変数にして、いっぺんに設定しようとしたんだが、はまってしまった。それもたった一文字のミス。 text-adjust-mode-skip-rule にリストを与える際に、quote してしまっていたおかげで、append とかの関数が実行されないでいた。アポストロフィを消したら想像通りの動作になったorz このミスのせいでたぶん何時間もむだになった。まあ、こうやって調べてるときが楽しいのだが。こんなことも調べまくっていたから、Lisp についてそこそこ理解できた。いつもよくわからないでコードを見ていたけど、今は少しは理解できる。

前々から気づいていた点を反映したコードに直しておいた。

自分で使っていてミスに気づいて修正した。完璧にはできないな、こりゃ。個々人の中での規則が違うわけだから当然といえば当然なんだが。