Unicode まわり

vim は各種 encoding を使い分けられるようになってるんだけどそこらへんの違いだとか変換だとか考えるのもめんどくさいのでとりあえず set encoding=utf-8 しておくと楽というハナシ。というか vimUnicode 対応が進んでるようでというかほぼ問題ない level なのでもう Unicode を使うと割り切ってしまった方が ( Win32 や Linux に限っていえば ) いろいろ楽だと思う。で、その際にとりあえず以下のことを覚えておくといい感じ。

  • 'statusline' に "%B" を仕込む
    • cursor の下の文字を 16 進数で表示する設定。これだけだと ASCII characters と日本語で表示に幅が出てしまうので "%04B" って感じに幅固定してやるといい感じ。ひとによっては 6 桁 ( "%06B" ) ないとダメかもしれないけど日本人だと多分 4 桁で十分。あとは 10 進数と間違えるときもたまにあるので "0x%04B" とかして 16 進表示だよと明示するといいかもしれないけどまぁこれは好みだね。
    • で、これがあると何がうれしいかというとこの値はそのまま Unicode code point なので Unicode consortium で定められている名前がすぐにわかるというのがひとつ ( http://d.hatena.ne.jp/janus_wel/20091122/1258885254 ) 。で、もうひとつが search pattern を ASCII characters だけで書く ( :help /\%u ) 際にこの値を書くだけで良くなるというのがある。余談だけど search pattern に non-ASCII characters を使わないのは地味に効くというかいちいち scriptencoding を指定する必要がないので書くのも楽 ( 手を動かさなくていい的な意味で ) だし実行するのも楽 ( encoding の変換をしなくていい ) という利点が。
    • あとは副次的なんだけどたとえばどこかの site で見かけた文字を入力したいんだけど使ってる Input Method が support してない、とかいう場合にとりあえず vim にその文字をコピペすることで code point がわかるので <C-v>u のあとにその数値を打ち込むだけで入力できるようになる ( :help i_CTRL-V_digit ) というのもある。まぁコピペできるんならいいじゃんとは思うんだけど。最後に、 screen に表示されてる文字の見分けがつきづらい場合 ( "[" と "{" とか ) に statusline を見れば判別可能というのもあるけどこれは別に Unicode に限ったわけではないし font 変えろよというハナシだな。
  • ga と g8
    • 他にも normal command の ga と g8 で表示される内容がそれぞれ Unicode code point と UTF-8 byte sequence にあたるのでわざわざ statusline に表示したくないという場合でも Unicode の恩恵にあずかれる。まぁ正直 UTF-8 へ符号化する関数とか作ったりしない限り g8 のありがたみはあんまりないんだけど ga は 10, 16, 8 進でそれぞれ値を出してくれたりする無駄に豪華仕様なので使いではあると思う。

最後に encoding が他の場合でも Unicode まわりの情報を知る方法が http://d.hatena.ne.jp/krogue/20080616/1213590577 に書かれているんだけどこれは iconv を使って utf-8 に変換をかけてそこからさらに手動で Unicode code point へ逆変換をかけているわけだね ( iconv 使えるなら UCS-4 に変換すればいいじゃないと思ったんだけどキモである char2nr() が 'encoding' の値を使うようなので無理だった ) 。で、これ見てあー byte sequence の check あまいなと思ったので http://homepage1.nifty.com/nomenclator/unicode/ucs_utf.htm を参考に書き直してみた。

元ネタとはけっこう変わってるところもあるんだけど基本的に GetUnicodeCodePoint() に printf() をかませば望みのものが得られる形になってるはず。