Emacs における矢印や記号文字の取扱い

Emacs 22.3.1 を使って日本語の “→”(漢字の矢印文字)や “※”(こめ印)などを含む文書やプログラムコードを編集しようとすると、表示やカーソル移動の挙動がおかしくなる。これらの文字はいわゆる機種依存文字ではないはずだし、Meadow や日本語対応を明示している版だと問題なかったはずなので、素の Emacs 特有の問題だろうと推測したものの、対策することなくそのままにしていた。しかし、最近またコメント中に “→” を書いてあるコードを触ることになり、この不具合に出くわしたので調べてみたところ、次のところで回答を見つけることができた。

http://www.pqrs.org/tekezo/emacs/doc/wide-character/index.html

このサイトの情報によれば「UTF-8 において文字幅が文脈依存(ambiguous)となる文字」に対して、emacs はデフォルトで narrow character として判定するのに、表示される文字は wide character なので不具合が起こるようだ。確かにこの説明を読むとカーソル移動の挙動が納得できる。同様の現象は emacs だけでなく vi などでも発生するということだったので、vi で確認したところ確かに同じ状況となっていた。

前述のサイトに該当文字群を wide character として認識させるための emacs 用スクリプトが掲載されていたので、これを .emacs に追加することで一応は不具合を解消することができた。しかし、この設定だといわゆるローマ数字など、不具合の出る文字がまだあることに気付いた。また、機種依存文字と思っていた丸囲み数字なども unicode では定義されているので、これらの文字のコード範囲と思われるものをスクリプトに追加してみたが、なぜかうまくいくところとそうでないところがあった。結局ローマ数字の範囲だけを追加するにとどまった。通常の作業にはこれでおおよそ対応できるはずだ。

(utf-translate-cjk-set-unicode-range
  ‘((#x00a2 . #x00a3) ; ¢, £
    (#x00a7 . #x00a8) ; §, ¨
    (#x00ac . #x00ac) ; ¬
    (#x00b0 . #x00b1) ; °, ±
    (#x00b4 . #x00b4) ; ´
    (#x00b6 . #x00b6) ; ¶
    (#x00d7 . #x00d7) ; ×
    (#X00f7 . #x00f7) ; ÷
    (#x0370 . #x03ff) ; Greek and Coptic
    (#x0400 . #x04FF) ; Cyrillic
    (#x2000 . #x206F) ; General Punctuation
    (#x2100 . #x214F) ; Letterlike Symbols
    (#x2190 . #x21FF) ; Arrows
    (#x2200 . #x22FF) ; Mathematical Operators
    (#x2300 . #x23FF) ; Miscellaneous Technical
    (#x2500 . #x257F) ; Box Drawing
    (#x25A0 . #x25FF) ; Geometric Shapes
    (#x2600 . #x26FF) ; Miscellaneous Symbols
    (#x2e80 . #xd7a3)
    (#xff00 . #xffef)

    (#x2160 . #217f)))

補足(2009-07-31 追記):
Emacs のバージョン 23.1.1 からは前記の設定をしなくても、問題は発生しなくなっている。逆にこの設定のままだと 23.1.1 では起動時にワーニングが出るので、utr-translate-cjk-set-unicolde-range の設定は解除したほうが良い。→「Emacs における矢印や記号文字の取扱い ? その後」