Playing with mlterm

端末エミュレータの話。基本的にvimが起動しっぱなしのコード書き専用端末はBlack Box(のnightly版)。他方、割と雑用的に使う端末は以前の記事の通りWezTermを試している。

WezTermのprosのひとつは、とにかく設定の自由度が高い上にluaでなんでもできてしまう点だろう。Gnome TerminalだとAlt+1〜Alt+9で開いたタブを直接選択する機能があるが(Black Boxもそうである)、WezTermにはない。ないが、単にそういうキーバインディングを設定すれば対応できてしまう。よい。

一方でよくない点もいくつかある。WezTermの売りのひとつはGPUを活用した高速なレンダリングである。WezTermの他にもうちGPU使ってるんで超速いっすよ!という端末はいくつかあるのでホットなトピックなのだろう。しかし、個人的には端末の高速レンダリングがそんなに嬉しいか? という感じがしてあんまり刺さらないんですよね。それに、端末上でtmuxを介するとだいたいここで大きく律速されてしまうので実質的にはあまり効果が感じられないという観点もある。

それと、おそらくはGPUのハンドリングにまつわる話なのだと思うのだけど起動中の占有メモリがけっこう半端なくなる時があるのも気になる。

その他、IMのハンドリングに若干のバグが残っておりたまにIMをアクティブにできなくなる、その上デスクトップ全体で文字入力ができなくなってしまうことがある(なぜかGnomeデスクトップ自身とIMの状態を共有してるっぽく、Gnomeのアプリ検索とかで一旦IMをアクティブにしてからWebTermに戻ると復帰したりする)、クリップボードから貼り付けるとおかしな文字選択状態になる、画面の最終桁からワイドな文字の入力を始めると次行からの表示がしっちゃかめっちゃかになるなど日本語の表示と入力に関して改善の余地がある。

そんなこんなで新しいバージョンがリリースされるのを待ち侘びているのだけど、最終バージョンが2024年の2月ということで相当待たないといけない予感がしている。それならば、その間に別の端末を試してみるか。

というわけで本題のmltermである。実はmlterm自体はLinux環境をセットアップするたびたいてい入れてたのだけど、常用の端末にはなってなかった。viやvimは入力モードを抜けるとカーソルが1文字左に戻るのだがこの仕様を便利だと思ったことはない。そこで

inoremap <silent> <Esc> <Esc>`^

というように定義して入力モードを抜けたら入力モードに入る前のマークへ強制的にカーソルを置くようにしている。しかしこの定義がなぜかmltermでだけカーソルが戻らない上に勝手にundoが実行されるという奇妙な動作になってしまいmlterm上でvimが使い物にならないのである。

実は同じような誤動作はWezTermでも起こるのだが、こちらの場合はリポジトリに置いてあるWezTerm用のterminfoを与えると直る。じゃあmltermもそうじゃないのということになるが、どうもmlterm用のterminfoは何が正しいのかよく分からず、放置していた。こういう話もある。

ところが、最近上記の定義をなんとなくmltermで動かしてみたところ、あれ?なんか普通に動くではないか。そこで、ちゃんと使ってみようかということになったのだ。

Transparency has gone.

最近Ubuntu 24.04.1 LTSに上げたわけなのだけど、

  • Wayland 環境で
  • 背景を半透明にする機能を備えたアプリケーションを
  • フルスクリーン表示にすると

その半透明機能が効かなくなるという現象が発生して困っている。たとえばgnome-terminalとかだ。端末の背景がスケスケの助になるのはカッコいいだけではなくちゃんと実用的なので、そうならないと日々の作業が直接的に不便になって困る。

調べてみるとこれはmutter(Waylandにおけるコンポジタ─すべてのウィンドウとデスクトップのビットマップを合成するプログラム)の仕様がそう変わったから、のようだ。フルスクリーンの状態ならそのアプリケーションが全てのピクセルについて責任を持とう、みたいなポリシーなんだろうか。
https://gitlab.gnome.org/GNOME/mutter/-/issues/2520

その理屈自体は筋が通っているかもしれないが、しかし実際影響が大きすぎるので、なんか代替の仕様が必要なんじゃない?みたいな話にもなっている…が、あまり動きは活発ではない。
https://gitlab.freedesktop.org/wayland/wayland-protocols/-/issues/116

とりあえずのワークアラウンドとしてはフルスクリーンではなくウィンドウを最大化すればいいわけなのだが、そうするとタイトルバーが無駄にピクセルを消費してとても邪魔なのである。これをどうにかしたい。

ここで、探してみるとウィンドウを最大化したときタイトルバーを隠しますと謳うgnomeエクステンションがあったりするのだけど、入れてもそうならない。gnomeエクステンションの仕様はちょくちょく破壊的な変更を伴うのか動作するバージョンの範囲が狭いものが多いのであまりに当てにならない。
https://github.com/hardpixel/unite-shell

ということで別の何かを探してみると、Black Boxという端末エミュレータがある。
https://gitlab.gnome.org/raggesilver/blackbox
新しい端末を作りました!ってお出しされた場合、肝心の端末のコア部分が既存のライブラリなのか、それを含めて自作なのかで評価の軸が変わってくる。このアプリケーションの場合コアはlibvteなので、主に評価すべきはそのガワの部分である(ただしflatpakパッケージとして公開されていて、最新のlibvteを内包している…という工夫がされている。そのため、sixelも使えてしまう)。

で、ガワの部分だけどタイトルバー(とタブバー)を隠すというオプションがあり、その通りに動作する。また、タイトルバーがありそうな位置にマウスポインタを持ってくるとニュッと出てくる動作にすることもできる。おー。いいじゃん。これにしよう。

…となりそうなのだけど、別の所から問題が出てくる。前述の通りこれはflatpakパッケージで、起動中flatpak-session-helperなるプログラムも漏れなく動いているわけなのだが、何か知らないがこれが常時数%〜十数%のCPUパワーを消費してマシンのファンをファンファンさせるのであった。なにこれぇ。
https://github.com/flatpak/xdg-dbus-proxy/issues/51

しかし原因がBlack Boxなのか、flatpak-session-helperなのかよく分かっていない。Black BoxにはNightly版もあるのでこれを使うようにして様子を見てみよう。

Playing with WezTerm

サムネイルを表示するlsというものを作ったのだけど、サムネイル、つまりsixel形式の画像データをどの端末エミュレータでも表示できるわけではないので、現時点では対応できる端末が限られている。

例えばUbuntuに最初から入ってる端末はlibvteというgnomeのコンポーネントを利用してその機能を提供しているのだけど、現時点ではsixelを表示できない(ただし、libvteのソースにはすでに対応コードが入っていて鋭意テスト中のようなので使えるようになるのは時間の問題だろう)。

そんなわけで、sixelが使える別の端末を探したところ、WezTermがよくできているようなので常用を試している。ちなみに、インストールする手段が複数提供されていてflatpak経由がかんたんなのだが、flatpakアプリケーションであるが故の不具合がちらほらあってハマる(マウスポインタがちょくちょく消えるとかfcitx5がよく壊れるとかluaで利用できるAPIが一部正しく動作しないとか)のでaptで入れるかappimageを利用するのがいいだろう。豆知識。

あと数年したら端末で画像を表示することが当たり前になって黒い背景に文字だけの時代は過去のものになるよ。マジで。