2007年01月25日(Thu) 会議づけでござるよ [長年日記]
● ruby-entity-reference-0.1.1
UTF-8のページを日本語を表示するPalmのBlazerでちゃんと表示したいので、まずはUTF-8のページから可能なかぎりヨーロッパ言語の文字を実体参照に変換するライブラリをつくりました。ご利用ください。
これをblazer-ja-proxyにつっこめば 第二tDiary.Net のヨーロッパ言語を含むページもそこそこ見られるはず。わくわく。
● [pda] Palmの液晶保護シールを貼り替える
穴があいてしまった保護シールの代替品が届いたのではりかえました。
シールはだいたいきれいに剥れたのだけれど穴のまわりは接着剤が残ってしまいました。メガネを拭く布で清掃しました。
埃をできるだけはらって、端から順に新しいシールを貼りました。しばらくは縞々が見えているのですが、半日くらいでなじんでくるのがおもしろい。
1枚目の保護シールはたぶんPalmが来た時に貼ったと思われるので、11ヶ月弱もったことになります。穴があくまえに交換するとすれば10ヶ月に1回の交換、ということになるのかな。
● vim(7.0.39-1m)で日本語のUTF-8のファイルを編集していると、gqで行が折り返せない(どの文字も単語の途中と認識される)ことがあるみたい。何だろう?formatoptionsはtmvM。
Vim で折り返されない行って、きっと日本語だけじゃなくて ASCII も含んでますよね。<br>edit.c を見ると、formatoptions の m を処理する部分で<br><br>else if (cc >= 0x100 && fo_multibyte && curwin->w_cursor.col <= (colnr_T)wantcol)<br><br>と書いてあります。<br><br>cc >= 0x100 は文字が char 以上だから multibyte ってことで、<br>fo_multibyte は formatoptions に m があるってことで、<br>curwin->w_cursor.col <= (colnr_T)wantcol は、その文字が<br>textwidth より左ってことです。ちなみに curwin->w_cursor.col は<br>行の末尾から一つずつ下がっていきます。<br><br>ということは、textwidth より左がすべて singlebyte 文字だと<br>wrap されないということですね。<br><br>どう直せばいいかというと、<br><br>else if (cc >= 0x100 && fo_multibyte)<br> { last_mb_col = curwin->w_cursor.col;<br> if (curwin->w_cursor.col <= (colnr_T)wantcol)<br> ...<br> }<br><br>などと、最後に multibyte cc が出た col を記憶しておいて、<br>その後の if (foundcol == 0) /* 切れ目がなかった */ な部分で<br><br>if (last_mb_col)<br>{ foundcol = last_mb_col;<br> end_foundcol = last_mb_col;<br> ...切れ目があったように処理...<br>}<br><br>すればいいんだと思います。きっと。
なるほど、と思って改めて vim -u NONE -c "set enc=utf8 fenc=utf8 tenc=eucjp tw=10 fo=tmvM" test.txt で試してみたら期待通りに改行されちゃいました。mozexからの起動の場合が問題なのかな…いや、違うか。<br>textwidth以降にiやaやAで文字を追加した行は折り返されなくなるようです。textwidthより左に挿入しなおせば再び折り返されるようになる。euc-jpで編集していても同じ現象がみられました。Ascii文字だけの行でも似た(だけど僕には予想できない場所で折り返される)現象が見られるみたいです。
ああ、それは仕方ないかも。>「textwidth以降にiやaやAで文字を追加した行は折り返されなくなる」<br><br>edit.c にコメント付きでこう書いてあるので、<br>v オプションがあると、行頭じゃなくて<br>Insstart.col までしか行かないんですね。<br><br>/*<br> * Find position to break at.<br> * Stop at first entered white when 'formatoptions' has 'v'<br> */<br>while ((!fo_ins_blank && !has_format_option(FO_INS_VI))<br> || curwin->w_cursor.lnum != Insstart.lnum<br> || curwin->w_cursor.col >= Insstart.col)<br><br>ここに (flags & INSCHAR_FORMAT) || /* gq のときはフリーパス */<br>とでも追加すれば期待どおりになるのかなーと思いますが、<br>仕様としてはどうなのか、ちょっと確信が持てません。
あー。<br><br>fo=vの時の仕様なんですね。なんでvを付けたんだろう…
最近のツッコまれどころ