2014/03/11

unicode の east asian ambiguous 文字

最近、 Agda を使ったりしているので agda-mode な emacs にちょっと手を出していたりします。

Agda は π やら ∀ やらの記号を容赦なく使うので、iTerm2 では agda-mode 時に emacs の表示がおかしくなることがありました。
iTerm2 の問題かと思って Terminal に戻ってきたは良いものの、今度は ∀ とかが一文字幅になってしまって表示がおかしい。

Terminal の
Preferences -> Advanced -> Unicode East Asian Ambiguous character are wide
のチェックを入れると解決はするんだけれど、iTerm2と同じ状況になる。

どうやら Unicode East Asian Ambiguous とやらが問題らしい。

調べてみると、∀ とかが全角なのは国によるっぽい。
特に日本は全角だけれど、アメリカだと半角らしい。
国によるので幅が曖昧な文字がUnicodeにあるとか。 
それが Unicode East Asian Ambiguous みたい。

なので、Inconsolata とかの英字フォントにすると問題の記号が全部半角になって表示が正しくなる。
が、そうすると日本語がヤバそう。
私が使っているフォントは Ricty なので、日本語や記号は Migu に依存してる。
Migu は日本語フォントなので、とりあえず全てを全角に統一することにしました。

環境

  • Mac OSX Mountain Lion
  • Terminal : Version 2.3 (309)
  • iTerm2 : Build 1.0.0.20140112
  • Vim 7.4.192
  • Emacs 22.1.1 / 24.3
  • Font : Ricty

対策


iTerm2 / Terminal

East Asian Ambiguous を wide にする。

Terminal だと
Preferences -> Advanced -> Unicode East Asian Ambiguous character are wide
をチェック。

iTerm2 だと
Preferences -> Profiles -> Text -> Double-width Characters -> Treat ambiguous-width character as double width
にチェック。

Vim

set ambiwidth=double
する。というか既にしてた。

Emacs

なんか22と23で違うらしい。
emacs 22 では utf-translate-cjk-set-unicode-range を使う と良いっぽい。
23 以降では cjk が消えたらしく、別の方法があるっぽい。

んで、問題はこれら2つは完全に互換が無いこと。
22 の設定方法を 23 以降に適用すると cjk が消えちゃってる。
23 以降の設定を 22 に適用すると、 char-width-table が無いとか言われる。

加えて Mountain Lion とか Marvericks とかの emacs が 22 なのと、brew で入れられる emacs が 24 だったりでちょっとアレしたので両方に対応できる設定にしてみるなど。

設定はこんな感じ。単に emacs-major-version で場合分けしているだけだけれど。
下にコピペで使える状態な gist を置いておきます。
とりあえず 22.1.1 と 24.3 で表示の問題が無いことは確認できた。
elisp 書いたこと無いのでどこか変かもしれない。

とりあえずはこれで良いかなー、とか。
英語フォントにするなら width を single に統一すればたぶん問題無いはず。
 
ただ、iTerm2 に乗り換えた後に勘違いで Terminal に返ってきて、ちゃんと設定した結果どっちでも良いことが確認できたんだけれど、これどっち使おうかなー、ってなってたりもする。どーするかな。

んで設定コピペ用 gist は以下。

0 件のコメント:

コメントを投稿