term周りの更新

terminal emulator を選定・・・

主に3つの動作環境、Windows, Windows wsl, Ubuntu-20.04 があってtoolや設定をある程度共通にしたいということで試行錯誤していた。 他に ssh経由, Windows wslg もあるよ。

wezterm

wezterm が有望であることがわかった

unknown: table => {"type":"table","align":[null,null,null,null,null,null],"children":[{"type":"tableRow","children":[{"type":"tableCell","children":[],"position":{"start":{"line":13,"column":1,"offset":205},"end":{"line":13,"column":19,"offset":223}}},{"type":"tableCell","children":[{"type":"text","value":"font fallback","position":{"start":{"line":13,"column":21,"offset":225},"end":{"line":13,"column":34,"offset":238}}}],"position":{"start":{"line":13,"column":19,"offset":223},"end":{"line":13,"column":35,"offset":239}}},{"type":"tableCell","children":[{"type":"text","value":"multiplexer","position":{"start":{"line":13,"column":37,"offset":241},"end":{"line":13,"column":48,"offset":252}}}],"position":{"start":{"line":13,"column":35,"offset":239},"end":{"line":13,"column":49,"offset":253}}},{"type":"tableCell","children":[{"type":"text","value":"emoji","position":{"start":{"line":13,"column":51,"offset":255},"end":{"line":13,"column":56,"offset":260}}}],"position":{"start":{"line":13,"column":49,"offset":253},"end":{"line":13,"column":57,"offset":261}}},{"type":"tableCell","children":[{"type":"text","value":"nerdfnt","position":{"start":{"line":13,"column":59,"offset":263},"end":{"line":13,"column":66,"offset":270}}}],"position":{"start":{"line":13,"column":57,"offset":261},"end":{"line":13,"column":67,"offset":271}}},{"type":"tableCell","children":[{"type":"text","value":"graphics escape","position":{"start":{"line":13,"column":69,"offset":273},"end":{"line":13,"column":84,"offset":288}}}],"position":{"start":{"line":13,"column":67,"offset":271},"end":{"line":13,"column":91,"offset":295}}}],"position":{"start":{"line":13,"column":1,"offset":205},"end":{"line":13,"column":91,"offset":295}}},{"type":"tableRow","children":[{"type":"tableCell","children":[{"type":"text","value":"wezterm windows","position":{"start":{"line":15,"column":3,"offset":389},"end":{"line":15,"column":18,"offset":404}}}],"position":{"start":{"line":15,"column":1,"offset":387},"end":{"line":15,"column":19,"offset":405}}},{"type":"tableCell","children":[{"type":"text","value":"✅","position":{"start":{"line":15,"column":21,"offset":407},"end":{"line":15,"column":22,"offset":408}}}],"position":{"start":{"line":15,"column":19,"offset":405},"end":{"line":15,"column":34,"offset":420}}},{"type":"tableCell","children":[{"type":"text","value":"✅","position":{"start":{"line":15,"column":36,"offset":422},"end":{"line":15,"column":37,"offset":423}}}],"position":{"start":{"line":15,"column":34,"offset":420},"end":{"line":15,"column":47,"offset":433}}},{"type":"tableCell","children":[{"type":"text","value":"color","position":{"start":{"line":15,"column":49,"offset":435},"end":{"line":15,"column":54,"offset":440}}}],"position":{"start":{"line":15,"column":47,"offset":433},"end":{"line":15,"column":55,"offset":441}}},{"type":"tableCell","children":[{"type":"text","value":"✅","position":{"start":{"line":15,"column":57,"offset":443},"end":{"line":15,"column":58,"offset":444}}}],"position":{"start":{"line":15,"column":55,"offset":441},"end":{"line":15,"column":64,"offset":450}}},{"type":"tableCell","children":[{"type":"text","value":"conpty issue","position":{"start":{"line":15,"column":66,"offset":452},"end":{"line":15,"column":78,"offset":464}}}],"position":{"start":{"line":15,"column":64,"offset":450},"end":{"line":15,"column":88,"offset":474}}}],"position":{"start":{"line":15,"column":1,"offset":387},"end":{"line":15,"column":88,"offset":474}}},{"type":"tableRow","children":[{"type":"tableCell","children":[{"type":"text","value":"wezterm wsl","position":{"start":{"line":16,"column":3,"offset":477},"end":{"line":16,"column":14,"offset":488}}}],"position":{"start":{"line":16,"column":1,"offset":475},"end":{"line":16,"column":19,"offset":493}}},{"type":"tableCell","children":[{"type":"text","value":"✅","position":{"start":{"line":16,"column":21,"offset":495},"end":{"line":16,"column":22,"offset":496}}}],"position":{"start":{"line":16,"column":19,"offset":493},"end":{"line":16,"column":34,"offset":508}}},{"type":"tableCell","children":[{"type":"text","value":"✅","position":{"start":{"line":16,"column":36,"offset":510},"end":{"line":16,"column":37,"offset":511}}}],"position":{"start":{"line":16,"column":34,"offset":508},"end":{"line":16,"column":47,"offset":521}}},{"type":"tableCell","children":[{"type":"text","value":"color","position":{"start":{"line":16,"column":49,"offset":523},"end":{"line":16,"column":54,"offset":528}}}],"position":{"start":{"line":16,"column":47,"offset":521},"end":{"line":16,"column":55,"offset":529}}},{"type":"tableCell","children":[{"type":"text","value":"✅","position":{"start":{"line":16,"column":57,"offset":531},"end":{"line":16,"column":58,"offset":532}}}],"position":{"start":{"line":16,"column":55,"offset":529},"end":{"line":16,"column":64,"offset":538}}},{"type":"tableCell","children":[{"type":"text","value":"conpty issue","position":{"start":{"line":16,"column":66,"offset":540},"end":{"line":16,"column":78,"offset":552}}}],"position":{"start":{"line":16,"column":64,"offset":538},"end":{"line":16,"column":88,"offset":562}}}],"position":{"start":{"line":16,"column":1,"offset":475},"end":{"line":16,"column":88,"offset":562}}},{"type":"tableRow","children":[{"type":"tableCell","children":[{"type":"text","value":"wezterm ssh","position":{"start":{"line":17,"column":3,"offset":565},"end":{"line":17,"column":14,"offset":576}}}],"position":{"start":{"line":17,"column":1,"offset":563},"end":{"line":17,"column":19,"offset":581}}},{"type":"tableCell","children":[{"type":"text","value":"✅","position":{"start":{"line":17,"column":21,"offset":583},"end":{"line":17,"column":22,"offset":584}}}],"position":{"start":{"line":17,"column":19,"offset":581},"end":{"line":17,"column":34,"offset":596}}},{"type":"tableCell","children":[{"type":"text","value":"✅","position":{"start":{"line":17,"column":36,"offset":598},"end":{"line":17,"column":37,"offset":599}}}],"position":{"start":{"line":17,"column":34,"offset":596},"end":{"line":17,"column":47,"offset":609}}},{"type":"tableCell","children":[{"type":"text","value":"color","position":{"start":{"line":17,"column":49,"offset":611},"end":{"line":17,"column":54,"offset":616}}}],"position":{"start":{"line":17,"column":47,"offset":609},"end":{"line":17,"column":55,"offset":617}}},{"type":"tableCell","children":[{"type":"text","value":"✅","position":{"start":{"line":17,"column":57,"offset":619},"end":{"line":17,"column":58,"offset":620}}}],"position":{"start":{"line":17,"column":55,"offset":617},"end":{"line":17,"column":64,"offset":626}}},{"type":"tableCell","children":[{"type":"text","value":"sixel, kitty, iterm2","position":{"start":{"line":17,"column":66,"offset":628},"end":{"line":17,"column":86,"offset":648}}}],"position":{"start":{"line":17,"column":64,"offset":626},"end":{"line":17,"column":88,"offset":650}}}],"position":{"start":{"line":17,"column":1,"offset":563},"end":{"line":17,"column":88,"offset":650}}},{"type":"tableRow","children":[{"type":"tableCell","children":[{"type":"text","value":"wezterm linux","position":{"start":{"line":18,"column":3,"offset":653},"end":{"line":18,"column":16,"offset":666}}}],"position":{"start":{"line":18,"column":1,"offset":651},"end":{"line":18,"column":19,"offset":669}}},{"type":"tableCell","children":[{"type":"text","value":"✅","position":{"start":{"line":18,"column":21,"offset":671},"end":{"line":18,"column":22,"offset":672}}}],"position":{"start":{"line":18,"column":19,"offset":669},"end":{"line":18,"column":34,"offset":684}}},{"type":"tableCell","children":[{"type":"text","value":"✅","position":{"start":{"line":18,"column":36,"offset":686},"end":{"line":18,"column":37,"offset":687}}}],"position":{"start":{"line":18,"column":34,"offset":684},"end":{"line":18,"column":47,"offset":697}}},{"type":"tableCell","children":[{"type":"text","value":"color","position":{"start":{"line":18,"column":49,"offset":699},"end":{"line":18,"column":54,"offset":704}}}],"position":{"start":{"line":18,"column":47,"offset":697},"end":{"line":18,"column":55,"offset":705}}},{"type":"tableCell","children":[{"type":"text","value":"✅","position":{"start":{"line":18,"column":57,"offset":707},"end":{"line":18,"column":58,"offset":708}}}],"position":{"start":{"line":18,"column":55,"offset":705},"end":{"line":18,"column":64,"offset":714}}},{"type":"tableCell","children":[{"type":"text","value":"sixel, kitty, iterm2","position":{"start":{"line":18,"column":66,"offset":716},"end":{"line":18,"column":86,"offset":736}}}],"position":{"start":{"line":18,"column":64,"offset":714},"end":{"line":18,"column":88,"offset":738}}}],"position":{"start":{"line":18,"column":1,"offset":651},"end":{"line":18,"column":88,"offset":738}}}],"position":{"start":{"line":13,"column":1,"offset":205},"end":{"line":18,"column":88,"offset":738}}}

conpty を通すときに escape sequence が加工されるとかで、sixel, kitty, iterm2 いずれのプロトコルもうまくうごかなかった。iterm2 は絵はでるのだけど場所がずれるという惜しい挙動・・・。

https://github.com/wez/wezterm/issues/1236

SSH 経由で WSL することで対処する。

wslg(xtermなど)

xterm は軽快できれいに表示できるので良かった。フォントのフォールバックができないぽいのが弱点。 urxvt は、NerdFonts がうまくでなかった。 st (simple term) もフォントまわりでつまづきだったかな。

unknown: table => {"type":"table","align":[null,null,null,null,null,null],"children":[{"type":"tableRow","children":[{"type":"tableCell","children":[],"position":{"start":{"line":32,"column":1,"offset":1079},"end":{"line":32,"column":15,"offset":1093}}},{"type":"tableCell","children":[{"type":"text","value":"font fallback","position":{"start":{"line":32,"column":17,"offset":1095},"end":{"line":32,"column":30,"offset":1108}}}],"position":{"start":{"line":32,"column":15,"offset":1093},"end":{"line":32,"column":31,"offset":1109}}},{"type":"tableCell","children":[{"type":"text","value":"multiplexer","position":{"start":{"line":32,"column":33,"offset":1111},"end":{"line":32,"column":44,"offset":1122}}}],"position":{"start":{"line":32,"column":31,"offset":1109},"end":{"line":32,"column":45,"offset":1123}}},{"type":"tableCell","children":[{"type":"text","value":"emoji","position":{"start":{"line":32,"column":47,"offset":1125},"end":{"line":32,"column":52,"offset":1130}}}],"position":{"start":{"line":32,"column":45,"offset":1123},"end":{"line":32,"column":53,"offset":1131}}},{"type":"tableCell","children":[{"type":"text","value":"nerdfnt","position":{"start":{"line":32,"column":55,"offset":1133},"end":{"line":32,"column":62,"offset":1140}}}],"position":{"start":{"line":32,"column":53,"offset":1131},"end":{"line":32,"column":63,"offset":1141}}},{"type":"tableCell","children":[{"type":"text","value":"graphics escape","position":{"start":{"line":32,"column":65,"offset":1143},"end":{"line":32,"column":80,"offset":1158}}}],"position":{"start":{"line":32,"column":63,"offset":1141},"end":{"line":32,"column":82,"offset":1160}}}],"position":{"start":{"line":32,"column":1,"offset":1079},"end":{"line":32,"column":82,"offset":1160}}},{"type":"tableRow","children":[{"type":"tableCell","children":[{"type":"text","value":"xterm wslg","position":{"start":{"line":34,"column":3,"offset":1245},"end":{"line":34,"column":13,"offset":1255}}}],"position":{"start":{"line":34,"column":1,"offset":1243},"end":{"line":34,"column":15,"offset":1257}}},{"type":"tableCell","children":[],"position":{"start":{"line":34,"column":15,"offset":1257},"end":{"line":34,"column":31,"offset":1273}}},{"type":"tableCell","children":[],"position":{"start":{"line":34,"column":31,"offset":1273},"end":{"line":34,"column":45,"offset":1287}}},{"type":"tableCell","children":[{"type":"text","value":"mono","position":{"start":{"line":34,"column":47,"offset":1289},"end":{"line":34,"column":51,"offset":1293}}}],"position":{"start":{"line":34,"column":45,"offset":1287},"end":{"line":34,"column":53,"offset":1295}}},{"type":"tableCell","children":[{"type":"text","value":"✅","position":{"start":{"line":34,"column":55,"offset":1297},"end":{"line":34,"column":56,"offset":1298}}}],"position":{"start":{"line":34,"column":53,"offset":1295},"end":{"line":34,"column":62,"offset":1304}}},{"type":"tableCell","children":[{"type":"text","value":"sixel","position":{"start":{"line":34,"column":64,"offset":1306},"end":{"line":34,"column":69,"offset":1311}}}],"position":{"start":{"line":34,"column":62,"offset":1304},"end":{"line":34,"column":81,"offset":1323}}}],"position":{"start":{"line":34,"column":1,"offset":1243},"end":{"line":34,"column":81,"offset":1323}}},{"type":"tableRow","children":[{"type":"tableCell","children":[{"type":"text","value":"mlterm wslg","position":{"start":{"line":35,"column":3,"offset":1326},"end":{"line":35,"column":14,"offset":1337}}}],"position":{"start":{"line":35,"column":1,"offset":1324},"end":{"line":35,"column":15,"offset":1338}}},{"type":"tableCell","children":[{"type":"text","value":"✅","position":{"start":{"line":35,"column":17,"offset":1340},"end":{"line":35,"column":18,"offset":1341}}}],"position":{"start":{"line":35,"column":15,"offset":1338},"end":{"line":35,"column":30,"offset":1353}}},{"type":"tableCell","children":[{"type":"text","value":"mlterm-con","position":{"start":{"line":35,"column":32,"offset":1355},"end":{"line":35,"column":42,"offset":1365}}}],"position":{"start":{"line":35,"column":30,"offset":1353},"end":{"line":35,"column":44,"offset":1367}}},{"type":"tableCell","children":[{"type":"text","value":"color","position":{"start":{"line":35,"column":46,"offset":1369},"end":{"line":35,"column":51,"offset":1374}}}],"position":{"start":{"line":35,"column":44,"offset":1367},"end":{"line":35,"column":52,"offset":1375}}},{"type":"tableCell","children":[{"type":"text","value":"✅","position":{"start":{"line":35,"column":54,"offset":1377},"end":{"line":35,"column":55,"offset":1378}}}],"position":{"start":{"line":35,"column":52,"offset":1375},"end":{"line":35,"column":61,"offset":1384}}},{"type":"tableCell","children":[{"type":"text","value":"sixel","position":{"start":{"line":35,"column":63,"offset":1386},"end":{"line":35,"column":68,"offset":1391}}}],"position":{"start":{"line":35,"column":61,"offset":1384},"end":{"line":35,"column":80,"offset":1403}}}],"position":{"start":{"line":35,"column":1,"offset":1324},"end":{"line":35,"column":80,"offset":1403}}}],"position":{"start":{"line":32,"column":1,"offset":1079},"end":{"line":35,"column":80,"offset":1403}}}

mlterm はフォント周りの設定が強力でよかった。 文字セットごとにフォントを個別に指定できるので、フォントを合成せずともばらのままでよい。

mlterm-con という multiplexer があり sixel support があるらしい。 自前ビルドが必要そう(apt には含まれていないぽい)。

wslgは、頻繁にキーボードが押しっぱなしになったり不安定なような・・・ https://github.com/microsoft/wslg/issues/207 なおっているけ、リリースに時間がかかりそう?

libvte

libvte 系のterm。 gnome-terminal, xfce4-term など。

gpu rendering

GPUレンダリングで araclitty, kitty そして wezterm がある。 weztermWindows をサポートしていて、フォントのレンダリング、タブのサポートと総合的に良い。

その他

  • tabby

  • RLogin

  • ConEmu

など。

要件

日本語、中文、絵文字, NerdFonts を同時にいい感じに表示したい

となるとすべてを含むひとつのフォントより、主になるフォントを設定してそれにグリフが含まれなかったら、他のフォントにフォールバックする挙動をしてもらう方が便利。 いくつかのフォントを試してみたのだけど、 HackGenNerd Console が良かった。 で、中文の足りない漢字を 更紗ゴシックフォント にフォールバックするという組み合わせ。 がんばって完璧な合成フォントを自作すればいいのだけど、よくわからないので、 複数フォントのフォールバック機能が必要。

かつて w3m で表示が乱れることで苦労した ambigous width 問題はあまり気にならなくなっていた。 なんか、表示は2カラム使うが、データ上は1カラムと見なすような扱いになっていて、 X につづいて で隙間を開けることで正しく表示できるようだ。 NerdFonts や 絵文字 はそのようになっている?

エスケープシーケンスで画像を表示したい

sixel とか kitty とか iterm2 による画像表示。

unknown: table => {"type":"table","align":[null,null],"children":[{"type":"tableRow","children":[{"type":"tableCell","children":[],"position":{"start":{"line":83,"column":1,"offset":2424},"end":{"line":83,"column":26,"offset":2449}}},{"type":"tableCell","children":[{"type":"text","value":"graphics","position":{"start":{"line":83,"column":28,"offset":2451},"end":{"line":83,"column":36,"offset":2459}}}],"position":{"start":{"line":83,"column":26,"offset":2449},"end":{"line":83,"column":49,"offset":2472}}}],"position":{"start":{"line":83,"column":1,"offset":2424},"end":{"line":83,"column":49,"offset":2472}}},{"type":"tableRow","children":[{"type":"tableCell","children":[{"type":"text","value":"Windows Native(conpty)","position":{"start":{"line":85,"column":3,"offset":2524},"end":{"line":85,"column":25,"offset":2546}}}],"position":{"start":{"line":85,"column":1,"offset":2522},"end":{"line":85,"column":26,"offset":2547}}},{"type":"tableCell","children":[],"position":{"start":{"line":85,"column":26,"offset":2547},"end":{"line":85,"column":49,"offset":2570}}}],"position":{"start":{"line":85,"column":1,"offset":2522},"end":{"line":85,"column":49,"offset":2570}}},{"type":"tableRow","children":[{"type":"tableCell","children":[{"type":"text","value":"wsltty","position":{"start":{"line":86,"column":3,"offset":2573},"end":{"line":86,"column":9,"offset":2579}}}],"position":{"start":{"line":86,"column":1,"offset":2571},"end":{"line":86,"column":26,"offset":2596}}},{"type":"tableCell","children":[{"type":"text","value":"sixel","position":{"start":{"line":86,"column":28,"offset":2598},"end":{"line":86,"column":33,"offset":2603}}}],"position":{"start":{"line":86,"column":26,"offset":2596},"end":{"line":86,"column":49,"offset":2619}}}],"position":{"start":{"line":86,"column":1,"offset":2571},"end":{"line":86,"column":49,"offset":2619}}},{"type":"tableRow","children":[{"type":"tableCell","children":[{"type":"text","value":"xterm wslg","position":{"start":{"line":87,"column":3,"offset":2622},"end":{"line":87,"column":13,"offset":2632}}}],"position":{"start":{"line":87,"column":1,"offset":2620},"end":{"line":87,"column":26,"offset":2645}}},{"type":"tableCell","children":[{"type":"text","value":"sixel","position":{"start":{"line":87,"column":28,"offset":2647},"end":{"line":87,"column":33,"offset":2652}}}],"position":{"start":{"line":87,"column":26,"offset":2645},"end":{"line":87,"column":49,"offset":2668}}}],"position":{"start":{"line":87,"column":1,"offset":2620},"end":{"line":87,"column":49,"offset":2668}}},{"type":"tableRow","children":[{"type":"tableCell","children":[{"type":"text","value":"wezterm linux","position":{"start":{"line":88,"column":3,"offset":2671},"end":{"line":88,"column":16,"offset":2684}}}],"position":{"start":{"line":88,"column":1,"offset":2669},"end":{"line":88,"column":26,"offset":2694}}},{"type":"tableCell","children":[{"type":"text","value":"sixel, kityt ,iterm2","position":{"start":{"line":88,"column":28,"offset":2696},"end":{"line":88,"column":48,"offset":2716}}}],"position":{"start":{"line":88,"column":26,"offset":2694},"end":{"line":88,"column":50,"offset":2718}}}],"position":{"start":{"line":88,"column":1,"offset":2669},"end":{"line":88,"column":50,"offset":2718}}}],"position":{"start":{"line":83,"column":1,"offset":2424},"end":{"line":88,"column":50,"offset":2718}}}

という感じになった。wslttyconpty ではなくて winpty なので例外的に sixel が通過できるらしい。 動く環境でも tmux を挟むと動かなくなる。 代わりに terminal emulator の方で multiplexer(タブ機能) する必要が発生。

まとめ

総合力で wezterm が強い。

  • あまり頑張らなくてもフォントがうまく設定できる(cjk, NerdFonts, 絵文字)

  • multiplexer 機能あり

  • sixel, kitty, iterm2 プロトコルで画像を表示できる

  • Windows でも動く

参考