wcwidthパッチ

http://www.emaillab.org/mutt/download1510.html
今回のパッチ作成作業の中心はwcwidth()のCJK対応です。ここで、その作業について書いてみます。


Mutt内蔵の国際化対応はEdmundが行ったものです。しかし、内蔵のワイド文字関数がUTF-8以外のワイド文字が扱えないという冗談みたいな代物でした。そこで、ワイド文字関数のI18Nとwcwidth()の日本語対応のL10Nを行ったパッチを作って投稿して、Edmundがそのアイデアを元に修正したものが現在のMutt内蔵のワイド文字関数です。
しかし、L10Nは極力したくないのだけどねと当時言われたのが心に残っていました。そして、そのまま5年間放置しておいたのですが、今年になって、Unicode関連の資料を調べていたときにUnicode Standard Annex #11 "East Asian Width"という文書があるのが気が付きました。もっと早く気づけよと言いたくなりますが、気が付かなかったものは仕方ないでしょう。いつかこの文書を根拠として修正したいなと思っていたのですが、これまた放置しました。
Mutt 1.5.10が出たのと夏期休暇というちょうどよいタイミングだったので、Mutt内蔵のwcwidth()に対して、この文書に基づいたCJK対応の関数を作ってみようと思いました。まずは、文書をよく読んで理解しました。次に、A(Ambiguous)とマークされたものを取り出して整形するスクリプトを作ったり、取り出したものに対してグリフを見ながら確認したりする作業をしました。3時間くらいの作業でCJKに対応したwcwidth()ができました。
一方、Mutt内蔵のwcwidth()はMarkus Kuhnが作ったpublic domainなものを使っているのですが、その最新のものがあるかなと探して、ダウンロードしました。その内容を確認して、一気に疲れが出ました。新しいものにはCJK対応のwcwidth()が入っていました。もう、笑うしかありません。だはぁ。
気を取り直して、この最新のwcwidth()をMuttに組み込み、CJK対応にする作業を行いました。できあがったものが、このエントリの最初のリンクのページにあるwcwidthパッチです。


CJK対応のwcwidth()ができたので、次に行ったのは、UTF-8の環境でAmbiguousな文字のWide/Narrowの切り替えオプションの作成とその対応です。
やったことはオプションの作成と切り替えを行うwcwidth()のラッパー関数の作成およびラッパー関数への置き換えです。
理屈上はこれでうまくいくはずなのですが、どうもうまく機能していません。表示がずれます。デバッグしてみると切り替えとCJK対応wcwidth()の呼び出しはうまくいっています。落ちがある可能性があるので、これから調べるつもりです。
ということで、まだ未解決だったりします。