またもやりなおし。 だいぶ課題が整理されてきた。 そろそろうまくいくといいのだが。

https://github.com/ousttrue/w3m/tree/zig_string

なんだかんだで w3m を代替するツールは出てこない。 Cursor のある Pager という落としどころが良いのだと思う。 たいがいの Pager はカーソルが無いのだが、 カーソルがあると focus して action を起せるから機能が広がるのだ。

改造する上で課題となる点は以下のようなところだ。

Bohem GC

Bohem GC で文字列などを管理している。 当初 c++ 化して std::string に置き換えられるか試みていたのだが 、これは筋が良くなかった。 今回は zig やるつもりで、c++ はやらない意向。

文字列は以下のような型になっている。

typedef struct _Str {
    char* ptr;
    int length;
    int area_size;
}* Str;

今回は、ここから手を付けてみようかと。 GC を zig の allocator として管理してみようと考えている。 そこを足がかりに、すこしずつ動く状態を維持して zig 化しようと企んでいる。

  • Str.c を zig 化できた

  • va_list が arm64 でコンパイル通らない !(zig-0.15.2)

zig 化

zig 化すると C要素へのアクセスが module 経由になる都合上、 global 変数や、macro へのアクセスも明示的になるので、 整理作業上すこぶる便利だということがわかった。 ファイル単位でやると量的に大変になったりするが、 関数単位で一個ずつ zig 化するのはそれほど大変ではない。

test を本文中に書けるのも、C移植がうまくいっているか確認できるので非常に良い。

lua 化

さらに lua の導入をしたい。 keymap に登録する task の定義に使いたい。 元は C のマクロと awk の併せ技だったりするのだが、 無理にコンパイル時に解決せずにメンテナンス性重視にしたい。

描画スクリーンの vaxis 化

zig の TUI ライブラリの vaxis と合体してみる意向。 のだが、 epoll にしたかったので止めた。 rawmode の書き型を参考に自作した。

fork の debug が困難

どうも fork した子プロセスの方で問題が起きているようだったのだけど、 break point をアタッチする方法がわからず。 thread で代替しようと思ったが、 global 変数多用でスレッドセーフじゃなくて無理だった。