まだまだ Ubuntu の nano の翻訳

main コンポーネントかつデフォルトのエディタなのに誰も手をつけてないところから、ひょっとして翻訳しちゃいけなかったのか? と不安になったりもしましたが。だって Debian でも日本語になってないのですよ? いやまて、デフォルトで使うコンソール用のエディタだから、日本語にしちゃうと化けて困ったりするのかな? なんてこったガッデム。

まあ、やってしまったものは仕方ありません。大体目立つ部分は翻訳できたので動作確認をしようとしたところ、ヘルプ画面を呼び出すと応答がなくなってしまう現象が発生しました。po ファイルを見直してもどこが悪いか解らなかったので Ubuntu 日本語フォーラムへ質問してみると、どうやらアプリ側のバグのようです。ひょっとしたらパッチ書けるかも? などと無謀な妄想をしながらソースを追ってみることにします。

$ apt-get source nano
$ cd nano-2.0.6
$./configure --enable-debug
$ make
$ gdb src/nano

parse_mbchar 関数にブレークを張って監視してみると、一文字ずつ切り出す処理の途中でポインタが巻き戻っているのが解ります。なので次は break_line 関数にブレークを張って、一文字ずつ切り出す際のポインタの動きを監視します。
一行に表示出来る文字数 goal をカーソル位置が越えてしまった際に、直前のスペースまでポインタを戻して改行する処理が入っているみたいですね。英単語の途中で改行が入らないようにするための処理でしょう。
この一行あたりのカラム数は最低で 24 であることがプログラム上保証されています。24 文字以上もあるような英単語は稀ですし、英語は単語間に必ずスペースが入るためこれで問題ないのでしょう。ところが日本語は文章の中に半角スペースが入るとは限らないものです。
そのため、

  1. 一文字ずつ表示していく
  2. 行オーバー
  3. 直前のスペースまで戻る
  4. 日本語の場合、直前のスペースは前の文章の末尾
  5. 同じ文章をもう一度表示し始める
  6. 当然同じ場所で行オーバー
  7. 無限ループ

という流れになってしまうようです。
マルチバイト文字の場合は一文字手前で強制改行、という処理が妥当なのかなぁ?

ちなみに普段は *1export EDITOR=vi な人ですので、nano は全く使いません。翻訳するにあたって動作を確認しながらやっているのですが、よくわからない機能は訳せてなかったりします。常用している人がいたら未訳部分のアドバイスが欲しいですね。

*1:いじる人は vi 指定、そうでない人は gksudo gedit な気がするので nano ユーザっていないんじゃなかろうか?