GNU nano 2.8.1をビルドした

GNU nano 2.8.1がリリースされているが2.8.0から目立った変更は無い。全角文字が行をまたぐ時の表示が改善されたぐらいか。なので変更点が大きかった2.7.5からの動きを簡単に。

GNU nanoが2.7.5-37以降Gnulibの各関数を使うようになっている。これによって、自分が独自にビルドしているAndroid版で上手く動かなくなったので色々と手を加えていく。

そもそもの問題はAndroid NDKがきちんとロケール回りを実装していないことだ。Android NDKではMB_CUR_MAXMB_LEN_MAXがそれぞれ1に定義されている。当然UTF-8では4以上となるべきものだ。最初、ビルドを通し実機で実行したらSegFaultが出て嵌って、gdbで確認してようやく原因判明。自前でビルドしたncursesにもこれらを再定義しているのだが、ncursesとnano、そしてGnulibまでパッチを充てることになるとは思ってもいなかった。

もう一つ解決出来ていない問題はGnulibのregcompがAndroid NDKでは[[:<:]][[:>:]]がクラス未定義になってしまっている。\<\>は認識をしてくれているので、utils.cのfixboundsを修正することで回避。
Gnulibになったことでの利点もある。それはglobがちゃんと実装されて出来ていることだ。Android NDKではglobが無かった(のとmuslからの抜き出しが面倒だった)ので2.2.6相当の読み込みにしていたが、ちゃんとワイルドカードを使ってファイルを読み込むことが出来るようになった。

ひとまず動くようにはなっているものの、muslの実装と被るところもあるのでmuslの実装を外す必要も出てきている。もうちょっと進めば落ち着くだろうから、その時に手を入れていくつもり。

そしてGNU nano 2.8.0では待望のsoftwrap時のカーソル移動処理の改善。vimでいうgj/gkが標準の動きになった。所謂メモ帳とかと同じになったので違和感が無くなったのは大きい。日本語の折り返し処理が例によってうまいこと働いてくれないので(実装されていないから当然ではある)、手を加えてそれっぽく動くようにする。

HTML Generating Time : 0.047 s