Ghostty 開発ログ 004
原文は Mitchell Hashimoto により に公開されました。 このブログを購読する
こんにちは! Ghostty 👻 の4回目の公式開発ログへようこそ!
過去の開発ログを見逃した方や、Ghosttyについてもっと知りたい方は、本サイトのGhosttyページをご覧ください。
コミュニティの近況
先週、公開Discordサーバーを公開し、GhosttyとZigについてのトークも行いました。見逃した方はぜひチェックしてみてください。新しいベータ招待はDiscordコミュニティを通じて配布しています。また、Discordコミュニティは600人を超えました。すごいことです!
前回のGhostty開発ログ以降、クローズドベータの参加者は約30人から約100人に増えました。プロジェクト初期は1回のベータ募集で数人しか追加できませんでしたが、Ghosttyが安定してきたことで、今では1回あたり15〜20人ほど安心して増やせるようになっています。これはとても良い兆候だと捉えています!
美しいGUI
ターミナルの内部や古の技術の深淵に飛び込む前に、GUIの改善について語り、目を楽しませるものを見てみましょう。深い技術的な内容をお求めの方は、後半のセクションでかなりディープな話をしています。
macOSとLinuxの両方で、ネイティブGUIが大きく進化しました。Linuxでは、Ghosttyにヘッダーバーメニュー、ワイドタブ(設定可能)、Aboutウィンドウなどが追加されました。Gnome Terminalや他のGTKベースのターミナルと並べても、Ghosttyは自然に馴染みます:

さらにLinuxでは、SwayやHyprlandなどのコンポジタを通じてWaylandでGhosttyを使うベータテスターが複数います。多くの問題を修正し、GhosttyはWaylandで素晴らしく動作するようになりました。
macOSでは、window-theme設定を追加し、システム設定に追従するだけでなく、Ghosttyを常にダークモードやライトモードに固定できるようにしました。私は普段macOSをライトモードで使っていますが、ターミナルはずっとダークにしたいので、ダークに固定しています。また、フォーカスされていないスプリットはフェードするようにしました(設定で変更可能です)。どれもとても美しい仕上がりです:

Ghosttyの掲げる目標の一つは、まるでそのプラットフォームのためだけに作られたかのように感じられるネイティブな体験を提供することです。私たちはGUIの改善を非常に真剣に考えており、Ghosttyが動作するプラットフォームの慣習的なデザインに従うようにしています。上記の改善は、そうした理想に向けた私たちの進捗を示すものです。
Vimのバグを見つけました!そして行儀の悪いプログラムたち
Ghosttyはこれまでのほとんどの期間、TERM=xterm-ghosttyとして自身を名乗ってきました。xterm-という接頭辞を付けていたのは、多くの行儀の悪いプログラムがTERMを文字列マッチングして、ターミナルが特定の機能をサポートしているかを判断しているためです。これは間違っており、非常に行儀が悪いので、真似しないでください!正しい方法はterminfoデータベースに問い合わせることです。
terminfo自体が極めて興味深い(主に呪われているという意味で)トピックです。いつかterminfoについての専用のブログ記事を書きたいと思っています。この開発ログではterminfoの詳細には立ち入りません。この古の怪物をちょっと覗いてみたい方は、ターミナルでinfocmpを実行してみてください。
この1ヶ月間、私たちはxterm-という接頭辞を取り除き、単にTERM=ghosttyになろうとしてきました。その過程で、私たち自身のterminfoデータベースの多くのバグや、アップストリームの問題も見つかりました。見つかるたびに両方を修正してきました。
直近では、Vimのバグによって足止めされています。Vim 9.0はKitty Keyboard Protocolをサポートしていますが、対応するターミナルのリストをハードコードしており、terminfoデータベースを適切に尊重していません。これはバグであり、素晴らしいことにGhosttyコミュニティのメンバーが修正のためのプルリクエストを作成してくれました。この問題はNeovimには影響しません。
Vimはほんの少しだけ重要なので1、そのバグが修正され、下流のディストリビューションに広く反映されるまでは、残念ながらTERM=xterm-ghosttyに戻さざるを得ませんでした。それでも、私たちが成し遂げた進歩を誇りに思いますし、近いうちにxtermの束縛から解放されると楽観しています。
他にもアップストリームのバグを見つけましたが、Ghosttyコミュニティが問題を報告するだけでなく、修正まで提供してくれていることを誇りに思います。Timは人気のGoライブラリtcellに、特に深刻な問題を修正するPRを出してくれました。これはlazygitやlazydockerといった人気のTUIアプリケーションが使っている重要なライブラリです。この修正がないと、明示的にTERM=xterm-256colorで実行しない限り、それらのプログラムは文字化けを大量に出力してしまいます。この修正が早く取り込まれることを願っています!
これらのバグや修正はGhostty固有のものではなく、未知のターミナルエミュレータに対してプログラムをより堅牢にするはずです。
この取り組みは主にTim Culverhouse氏が推進してくれたもので、彼の尽力に深く感謝しています。
XTGETTCAP (#563)
terminfoの大きな問題の一つは、実行中のプログラムが参照しなければならないローカルファイルに依存していることです。つまり、リモートホストにSSHで接続した際に、リモート側にあなたのターミナルのterminfoがなければ、プログラムはターミナルが何ができるかを判断できず、誤動作したり最適でない動作をしたりする可能性があります。
XTGETTCAPは、ローカルファイルを読み込むのではなく、VTエスケープシーケンスを通じてターミナルのterminfoデータベースに問い合わせることができるターミナルの機能です。これにはいくつかの利点があります。プログラムはバイナリ形式のパース方法やファイルパスの探索方法を知る必要がなく、リモートで実行されている場合でもterminfoを問い合わせることができます。
XTGETTCAPは次のような見た目です:
# Query for stylized underline support (key "Smulx")
ESC P + q 536D756C78 ESC \
# Response from the terminal (Smulx=\E[4:%p1%dm)
ESC P 1 + r 536D756C78=5C45343A25703125646D ESC \まったく自明ですよね?実際はそこまで悪くありません。プログラムはESC P + q <key> ESC \というテキストを送信します。ここで<key>は16進エンコードされた文字列です。上の例では「Smulx」を16進エンコードしています。そしてレスポンスには、そのterminfoエントリのキーと値が同じく16進エンコードされて返ってきます。
私たちの実装で特にクールなのは、Zigのcomptime機能を使って、考えられるすべてのリクエストとレスポンスをコンパイル時に生成していることです。これは実際のterminfoファイルを生成するのと同じソースファイルから生成されるため、terminfoとXTGETTCAPは常に完全に同期しています。
XTGETTCAPのパフォーマンスは正直まったく重要ではないのですが、私たちのXTGETTCAP実装はコンパイル時に最適化されたルックアップテーブルであるため、馬鹿みたいに高速です。アロケーションや文字列フォーマットなどを行う必要がありません。シンプルにルックアップを行い、安定した文字ポインタを見つけて、それを直接ptyに書き込むだけです。とてもクールです。
これを生成するZigスニペットをご覧ください。Zigのcomptimeが大好きです。
可変フォント(#345)
ほとんどのフォントは「Bold」「Heavy」「Medium」「Italic」といった固定のスタイルセットを提供します。一方で可変フォント(Variable fonts)は、weightやslantなどの様々な軸を、ある範囲内で連続的な値として設定できる単一のフォントフェイスを提供します。Ghosttyは可変フォントとバリエーション軸の設定をサポートするようになりました。
まず、可変フォントがどのようなものか見てみましょう。Inconsolataには可変フォント版があり、下の動画では文字の幅や太さを細かく制御している様子がご覧いただけます。
こちらがInconsolataを使ったGhosttyのデフォルトの見た目です。フォントバリエーション軸を何も設定していない状態です:

そしてこちらが、weightを少しだけ変更した設定です。違いは微妙ですが、見比べれば分かります。まずは設定内容、続いてスクリーンショットです。
font-family = Inconsolata
font-variation-bold = wght=500

なぜ上ではweightではなくwghtなのでしょうか?バリエーションのキーはフォントによって決まり、フォントバリエーションは4文字でなければなりません。これらは標準化されていないため、weightを安全にwghtに変換することはできません。Ghosttyの設定では文字通りのバリエーションキーを使用しており、ユーザーはFontDropのようなフォント検査プログラムを使って有効なキーを確認できます。
可変フォントのサポートはターミナルエミュレータの中では比較的珍しいので、これを(しかもクロスプラットフォームで!)サポートできたことを誇りに思います。こうした機能によって、ターミナルを自分の好みにぴったりと微調整し、しっくりくる感覚に仕上げることができます。
おわりに
今回のベータテスターの皆さん、改めてありがとうございます。毎回、特定の分野に深い知識を持つ素晴らしい方々や、これまでにないユニークな方法でターミナルを使い込んで問題を見つけてくれる方々が参加してくださいます。
最新情報を追いたい方は、TwitterやMastodonでフォローしてください(リンクはフッターにあります)。このブログにはRSSフィードもあります。
Boo. 👻
脚注
安らかにお眠りください、Bram Moolenaar氏。そして私たちに与えてくださったすべてに感謝します。↩
記事をランダムに読む
コメント
ログインしてコメントする