考え中

営業なのに営業力が皆無のためゲーム作って癒やされたい。

MacのLocal環境でTerminal作業するときに,東アジア文字幅問題の沼から抜け出す

Mac(Mavericks)を使い始めました.WindowsLinux出身者なので,慣れません.
それでも,Macで快適にTerminalで作業したいと思って,iTermとか入れて,Localでの作業環境を整えようとしました.
すると,UTF-8の東アジア文字幅でambiguous widthなものの表示がズレておかしくなるので,それを修正する話です.

修正すると言っても,場当たり的な修正です.
ロケールのファイルも上書きしてしまうので,アプリとかとの連携が取れない場合もあるかもしれません.
自己責任でお願いします.


Macを使ってターミナルで作業していると ambiguous width の文字がたまにあって表示がおかしくなります.
ambiguous width の問題についてググっても,「iTermでオプション有効にしたら解決した」って記事ばかり出て来て,「そんな馬鹿な」「このMacは本物のMacか?」という状態になってました.
結局,研究室の先輩に助けてもらいました.

まず問題について,sshでつないだ先(ロケールいじってambiguous widthは2で統一してある環境)だと表示ズレが起きないのに,Localで作業すると,表示ズレが起きました.
これはiTermでのオプションのambiguous widthを2で扱うっていうオプションをオンにしても改善されませんでした.
そのため,Macで文字幅を指定してしていそうなファイルをいじることにしましたが,一体どれが該当ファイルなのか分かりませんでした.
研究室の先輩によると,MacBSD系らしいので,Linuxの構成はあまり参考にならない模様.結果的に,FreeBSDでの文字幅の問題について調べてもらい,解決案を頂きました(本当にありがとうございます).

### FreeBSD用で,ambiguous widthを2に変更したロケールのソースファイルを落とす
$ wget http://sourceforge.jp/projects/mutt-j/scm/svn/blobs/146/mutt-ja-doc/trunk/samples/UTF-9.src?export=raw -O UTF-9.src
#### localeのバイナリのファイルを作成
$ mklocale -o ~/LC_CTYPE UTF-9.src
$ cd /usr/share/locale/
$ su
### UTF-8のlocaleファイルに上書き
# cp /usr/share/locale/UTF-8/LC_CTYPE /usr/share/locale/UTF-8/LC_TYPE.bak
# cp ~{LC_CTYPEを置いたUser}/LC_CTYPE /usr/share/locale/UTF-8/


短いですが,これで完了です.
iTermとかも再起動すれば,多分反映される気がします.

最初は,UTF-9(コンパイルし直したLC_CTYPEを置く)やja_JP.UTF-9(LC_CTYPE以外はja_JP.UTF-8の構成をコピー)というディレクトリを作って,LANGやLC_ALLをja_JP.UTF-9に変更して,使おうとしましたが,他のアプリとの連携がとれないらしいので,結局UTF-8に上書き安定になりました.自分は忘れましたが,戻せるようにバックアップは取って置いた方がいいです^^;
(ちなみに,ja_JP.UTF-9にja_JP.UTF-8と同じ構成にしないと,LANGとLC_ALLの変更は出来ませんでした.)

あとは,私事ですが,screenをGitから落として,コンパイルしたのを使ってます.
その場合,UTF-8-MAC問題に出くわします.
この問題に対処した先駆者がいたので,URLを張って置きます.
https://sites.google.com/site/togino77/home/screen-410

なんというか,上の作業は意味ない感じになった気がします^^;
結構この記事もリファレンスされているっぽくて,有名な問題だったみたいですね….

自分が修正したときは,こんな感じになりました(ansi.cの箇所が1行ズレただけでした).

 --- ansi.c
 +++ ansi.c
@@ -726,6 +726,10 @@
                      LPutChar(&curr->w_layer, &omc, ox, oy);
                      LGotoPos(&curr->w_layer, curr->w_x, curr->w_y);
                    }
 +               if( curr->w_mbcs)
 +                         {
 +                                       curr->w_rend.mbcs = curr->_mbcs = 0;
 +                         }
                  break;
                }
              font = curr->w_rend.font;
 --- display.c
 +++ display.c
@@ -603,7 +603,7 @@
            D_x += D_AM ? 1 : -1;
          D_mbcs = 0;
        }
 -      else if (utf8_isdouble(c))
 +      else if (utf8_isdouble(c) || (0xdf00 <= c && c < 0xe000))
        {
          D_mbcs = c;
          D_x++;


ansi.c とdisplay.c を修正しないとダメっぽいです.
変更箇所の位置はそんなに変わってませんでしたが,git から clone してきた段階で自分でソースを見て,判断するしかない気がします.
上記のサイトにならって,patch を書こうかとも思いましたが,すぐに意味なくなるかもしれないので,やめました.

デタッチしたときの utmp のエラーを出さないようにすることも出来るようで,下の diff みたいに,acconfig.h を修正する必要があるみたいです.
https://gist.githubusercontent.com/yujinakayama/4608863/raw/75669072f227b82777df25f99ffd9657bd113847/gistfile1.diff


とりあえず,これで文字幅の深い沼から少し抜け出した気がします.

[References]
http://www.csie.ntu.edu.tw/~r92030/project/big5width/
https://github.com/jj1bdx/mutt-ja-freebsd-private-port/blob/master/mutt/mutt-1.5.21-ja.1/UTF-8.txt
http://en.sourceforge.jp/projects/mutt-j/wiki/FreeBSD%E3%81%AEwcwidth
https://sites.google.com/site/togino77/home/screen-410
https://gist.githubusercontent.com/yujinakayama/4608863/raw/75669072f227b82777df25f99ffd9657bd113847/gistfile1.diff