SKK for Androidを自分用にカスタマイズする

ここ最近はキーボード入力ではSKK for Androidを使うことが多くなっている。なんだかんだで慣れてしまえばなかなか良いものである。

自分はATOKではqwertyとフリックを併用しているが、タブレットを使っているときは必然的にqwertyでの入力が多い。なので日本語のフリックはタブレットだと殆ど使わないので、日本語もqwertyでフリック出来るように変更した。

左下の文字切替キーに現在の状態を表示するようにして、文字切替キーの上フリックでフルキーと通常とを切り替えられるようにした。フルキーの配置は英語配列に。これは単純に英語配列の方がキー数が少ないからという理由だったりする。

通常でもフルキーレベルの文字入力が行えるよう。下フリックにも数字記号を割り当てる。英語配列を出来るだけ崩したくなかったので、hjkl-=;'を、cvbnm[],./をそれぞれ割り当てた。残る~aに、\zに割り当てる。

一先ずはこれで進めてみよう。

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が標準の動きになった。所謂メモ帳とかと同じになったので違和感が無くなったのは大きい。日本語の折り返し処理が例によってうまいこと働いてくれないので(実装されていないから当然ではある)、手を加えてそれっぽく動くようにする。

2017年になりました。

よろしくお願いします。生存報告がてら近況を。

GNU nano 2.7.4がリリースされたので、私家版にも反映

GNU nano 2.7.4がリリースされている。2.7.1では左側に行番号が(対応が不完全ながら)表示できるようになったので、私家版で行番号表示時でも日本語がちゃんと折り返されるように修正をかけていた。(なお、不完全な部分が解消されたのは2.7.2の中盤である)

2.7.2-21でdisplay_stringの挙動が変更になったので、私家版でちゃんと折り返しが出来なくなっていたのを修正。display_stringの挙動変更の意図をどう取るかで、修正をdisplay_string内でするのか、それとも呼び出し元でするのか悩ましいところだけど、ひとまず前者で対応することにする。影響を考えると後者の方が良いような気もしているが。

現在の2.7.4ではそこまで自分に影響のある状況ではなかったが、2.7.4-7あたりの変更が私家版のパッチと衝突を起こしたので、私家版のパッチを修正している。

なお、自分用のnanoにはタブサイズを2→4→8(→nanorcの値)→2に動的に変更できるように機能を追加している。自分はタブサイズを4にしているのだが、nanoの標準は8であり、ソースコードも8を前提に書かれている。よくオプションに-T 8を指定し忘れて開き直す、ということが多かった。多いと意外とストレスなものなのだけど、これで少しストレスが減った。

Aspire Switch 10eを回復メニューから初期化した。

意を決して回復メニューから初期化を実施。最初はかなり不安だったのだけど、思いの外すんなり行って拍子抜け。Acerのアプリとかが消えたけど、あまり影響はないと思える。

こいつのメリットはmicro USBで充電出来て、軽いノートPCとして使えることだ。キー配列も素直で困らない。尤も、こいつを所謂「Windowsタブレット」として使うことは殆ど無い。タブレットとしての需要は自分が使っているYOGA Tablet 3の8インチAndroid版でほぼ完全に満たせるからだ。

GNU nanoの折り返しを全角対応にしてみる

GNU nanoを日本語で使う上で問題となるのが、全角の折り返しだったりする。

例えば80桁で折り返す設定にしている場合、80桁目に全角文字が来た時にはその文字はちゃんと折り返しされずに空白で表示されてしまう。日本語を扱う身としては非常に使い難い。

一般的なエディタではそのような場合、79桁目まで表示して全角文字を次の行に折り返すパターンが多いと思われるので、なんとかGNU nanoでもそのようにできないか、ソースを確認。

文字列の表示自体はupdate_lineで実施しているので、ソフトラップ時の処理を見てみると、COLSで単純に割っている。ここを1行に入る分だけ表示し、それ以降は次の行に折り返す処理に変更する。actual_xstrnlenptを使って実装した。

カーソルの表示はreset_cursorで行なっている。こっちは折り返しが発生する際の桁数を見て補正していく形で実装。ひとまず動きはするレベルの実装になってしまっているので要修正。

もうちょっとスマートに実装したいところではある。

GNU nano 2.7.0をAndroid用にコンパイルした。

GNU nano 2.7.0が9/1にリリースされている。

大きな変更は二つ。一つはShift+で範囲選択が出来るようになったこと、もう一つはGNU nano標準でターミナルの行数/列数が非常に小さい値を返すような場合に対応したこと。

前者はキーボードで選択するのが楽になったはず。Android Terminal Emulator(ATE)上では物理キーボードでないと恩恵が少ないかもだが。

後者は対応する意味がわからないと思うが、少なくともATE上では発生しうることであった。例えばATOKで文字入力している時に変換候補を上フリックすると、ATOKで全画面表示になるため、ATEの表示領域がなくなるので、2.6.3まではnano.c 697行目の

if (COLS < MIN_EDITOR_COLS || editwinrows < MIN_EDITOR_ROWS)

で引っかかってしまい、nanoが落ちてしまっていた。ここに引っかからないように、事前にCOLSとeditwinrowsを補正したパッチを書く必要があった。今回の2.7.0でそのパッチ部分が不要になった。

2.6.3で書いた他のパッチを適用して、ATE上で動くことを確認。

HTML Generating Time : 0.046 s