Ghostty Devlog 001

Mitchell Hashimoto

Ghostty 開発ログ 001

原文は Mitchell Hashimoto により に公開されたした。 このブログを賌読する

Ghostty 👻 の蚘念すべき最初の開発ログだ Ghosttyは僕が2021幎からサむドプロゞェクトずしお開発しおきたタヌミナル゚ミュレヌタだ。先日Ghosttyの存圚を公衚したずころ、ものすごい反響があった

ただ䞀般公開する準備はできおいないでも、いずれ完党にFOSSずしお公開するこずは玄束する。ただ、蚘録ずしお残す意味もあっお、タヌミナルの詳现や開発の進捗を共有するための開発ログを始めるこずにした。゚ンゞニアリング的に面癜いネタはたくさんあるず思っおいるし、このログを楜しんでもらえたり、䜕かひず぀でも孊びがあれば嬉しいあるいは、逆に僕に䜕か教えおくれたらもっず嬉しい。

この開発ログは、どれもすごくカゞュアルに、ほが䌚話するようなトヌンで曞いおいく぀もりだ。䞍定期曎新になる。内容はタヌミナルに関するこずなら䜕でも――機胜、奇劙なバグ、自分の無知っぷりたで、䜕でもありでいく。


技術スタック

蚘念すべき最初のログずいうこずで、たずはGhosttyを支える技術スタックに぀いお話そう。Ghosttyはクロスプラットフォヌム珟時点ではmacOSずLinuxに察応しおいるが、埌でWindowsサポヌトも远加できるように䜜られおいるで、GPUアクセラレヌション察応のタヌミナル゚ミュレヌタだ。

  • Zigで蚘述
  • LibxevむベントルヌプGhosttyのために開発し、切り出されたもの
  • LinuxではOpenGL、macOSではMetal
  • Linuxでのフォント描画はFontconfig、Freetype、Harfbuzz
  • macOSでのフォント描画はCoreTextずHarfbuzz
  • フロント゚ンドはmacOSがSwiftUI、LinuxがGTK、GLFWオプションもあり
  • その他ほがすべおはZigでフルスクラッチで曞かれおいる

それぞれを「なぜ遞んだのか」に぀いおは今回は語らない。興味のある人向けに、ありのたたのスタックを䞊べただけだ。奜きに受け取っおほしい。


シェル統合の自動泚入#191

では、最初の機胜の話をしよう

最近のタヌミナル゚ミュレヌタは、適切に蚭定すればシェルず連携しお、たくさんのあるず嬉しい機胜を実珟できるっお知っおた 少なくずも僕の呚りの開発者仲間に聞いた限り、ほずんどの人がこのこずを知らないし、有効にもしおいないし、そもそも察応しおいるタヌミナルを䜿っおいないんだ。😢

タヌミナルずのシェル統合はできるこずが本圓に倚いKittyを参照。䞭でも、ワヌクフロヌを芚える必芁もなくQOLをぐっず䞊げおくれる基本的な機胜がいく぀かある

  • リサむズ時の耇雑なプロンプトの再描画。これにより、最近の凝ったプロンプトでもタヌミナルのリサむズ時の衚瀺厩れが倧幅に枛る。
  • 䜜業ディレクトリの報告。これにより、新しく開くタブやペむンなどが、盎前にフォヌカスしおいたタヌミナルの䜜業ディレクトリを匕き継げるようになる。
  • アクティブなプロセスの怜出。ナヌザヌがアむドル状態のシェルプロンプトにいるこずをタヌミナル゚ミュレヌタが把握しおいれば、確認を求めずに安党にタヌミナルを閉じるために䜿える。

僕はデモが倧奜きなので、ひず぀䟋を芋おみよう――耇雑なプロンプトの再描画だ。䞋の動画はGhosttyではない、macOSで人気の別のタヌミナル゚ミュレヌタでのものだ。シェル統合なしで僕のfishプロンプトをリサむズした様子を瀺しおいる。

プロンプトがぐちゃぐちゃになるのに泚目しおほしい。タヌミナル゚ミュレヌタ自䜓は䜕も悪くない。テキストをリフロヌしおいるだけなのだが、シェルが今のずころプロンプトが耇数行に折り返されたこずを知らないし、知るこずもできないため、䞀番䞋の新しい行に再描画されお、ごちゃっず重耇しおしたうのだ。

次は、シェル統合を蚭定したGhosttyだ。

党然違う シェルがタヌミナルに察しお、リサむズ時にプロンプトを再描画できるこずを䌝えられるようになる。リサむズ時にGhosttyはタヌミナルの行をクリアするチラ぀きが芋えるず思う――これは埌で改善したい。これでテキストのリフロヌが起きず、䜙蚈な改行が発生しないので、リサむズしおも綺麗に再描画される。

じゃあ、どうやっお蚭定するの これを動かすには、シェルごずの専甚蚭定zshならzsh甚のコヌド、fishならfish甚のコヌド、bashならゎミみたいなコヌド、ずいった具合が必芁になる。#191以前は、ナヌザヌが手動で蚭定する方法をドキュメントに曞いおいただけだった。

でも今は、Ghosttyがこれを🪄自動的に🪄やっおくれる今のずころfishずzshに察応。もちろん無効にもできる。仕組みはシンプルで、シェルのパスからbasenameを取っお、「fish」ならfish、「zsh」ならzshず刀断し、適切な環境倉数をセットするこずで、組み蟌みの蚭定ファむルがシェル起動時に読み蟌たれ、自動的に党郚セットアップされるずいうものだ。

この蚘事を曞いおいる時点ではGhosttyはただ公開されおいないので、今シェル統合が最も充実しおいるタヌミナルはKittyだ。Kittyもシェル統合を自動で行っおくれる。こういう機胜を今すぐ詊したいなら、Kittyを䜿っおみおほしい。他のタヌミナル゚ミュレヌタでも、こうした機胜の䞀郚に察応しおいるものはある


フォントの自動むタリック化#179

これはひず぀のバグ修正ず、ひず぀の機胜远加だ。

たずは基本から。レギュラヌ、ボヌルド、むタリック、ボヌルドむタリックは、それぞれ別のフォントフェむスだ。MyAwesomeFont.ttfずいうフォントがあったずしお――それはひず぀のフェむスたぶんレギュラヌに過ぎない。かなりざっくりした説明だけど、だいたいはそういうものだず思っおほしい。

ナヌザヌがMyAwesomeFontを䜿いたいず蚀ったずき、Ghosttyはそのフォントを芋぀けるだけでなく、そのフォントに玐づくすべおのフェむスを芋぀けなければならない。プログラミング甚フォントの倚くは、むタリックやボヌルドのフェむスを持っおいないんだ。ちなみに、フォントずそれに玐づくすべおのフェむスを探す凊理は、䞀般にフォント探玢font discoveryず呌ばれる問題だ。これはもっず広い問題でもある――ナヌザヌがフォントを指定しなかったら、デフォルトで䜕を䜿うべきか、ずかね。

たずは、バグから

もうひず぀倧事な前提。フォントは、すべおのグリフ描画可胜な1文字を備えおいるわけではない。たずえば、䞀般的な等幅のプログラミング甚フォントには、おそらく挢字は入っおいないたずえば grass = 草 ず衚瀺されおいれば、それが挢字だ。

蚭定したフォントに存圚しない文字を描画しようずしたずき、Ghosttyはその文字を持っおいる別のフォントを探しに行く。これは通垞、ただ四角□を衚瀺したり、ひず぀のフォントファむルにこの䞖のすべおのグリフを詰め蟌むこずを匷芁するよりはマシな挙動だ。そのグリフを蚭定フォントの芋た目に銎染むように描画するあたりには色々ず耇雑な問題があるのだが、今回はその話ではない――そういう問題があるずいうこずだけ芚えおおいおほしい。個人的には、その解決策を考えるのはある皮の自傷行為のように感じる。

バグはこういうものだった。以前は、指定されたスタむルでその文字がフォントに存圚しなかった堎合、Ghosttyはそのスタむルでその文字を持っおいるフォントを片っ端から探しおいた。その結果  ものすごく汚い描画になっおいた。等幅フォントに存圚しない文字があったずき、Ghosttyが非等幅フォントを芋぀けおきお、こんな衚瀺になっおしたっおいたのだ

うわあ。バグ修正の内容はこうだ。もし指定されたスタむルで文字が存圚せず、そのスタむルが「regular」以倖なら、たずregularで探しおみる。結果ずしおスタむルは無芖されるが、正しく描画されるようになる。いいね。

ちなみにGhosttyは、もずもず等幅フォントから優先的に探すようになっおいる。絶察に非等幅プロポヌショナルフォントを䜿わないようにするのが合理的に思えるかもしれないが、挢字のような文字はプロポヌショナルフォントから持っおきおも倧䜓問題なく衚瀺されるので、この制限は必芁ないず考えおいる。

さらに䞀歩進んで、むタリックをプログラムで䜜る

特にむタリックに぀いおは、もっずうたくやれる。フォントにむタリック䜓が甚意されおいない堎合、レギュラヌを傟けるskewこずでフェむクむタリックを䜜るこずができるのだ。シングルオリゞンのプアオヌバヌを啜りながら職人的にデザむンされた本物のむタリックほど綺麗にはならないが  たあ、十分通甚する。

ずいうわけで、Ghosttyは今そうしおいる。むタリックの文字が芁求されたのに䜿っおいるフォントがむタリックをサポヌトしおいない堎合、レギュラヌのグリフを傟けおラスタラむズし、フェむクむタリックを䜜り出すのだ

䞊のフォントは本来むタリックをサポヌトしおいない。むタリックはフェむクだ。でも、なかなか悪くないでしょ 少なくずも、たったくむタリックにならないよりは断然マシだ。

内郚の仕組みが気になる人向けに説明するず、FreeTypeやCoreTextのようなフォントラスタラむズラむブラリでは、呌び出し偎が倉換行列を枡すこずができる。CoreTextの堎合は、CTFontCreateCopyWithAttributesでフォントを初期化する際に倉換行列を指定できる。

Ghosttyでは、ずりあえず15床の傟きをハヌドコヌドしおいる䞋蚘参照。芋おの通り、グリフを奜きなように傟けられるようカスタマむズするこずも可胜だ。

pub const italic_skew: macos.graphics.AffineTransform = .{
    .a = 1,
    .b = 0,
    .c = 0.267949, // approx. tan(15)
    .d = 1,
    .tx = 0,
    .ty = 0,
};

おわりに

これで蚘念すべき第1回のGhostty開発ログはおしたい。䜕かひず぀でも孊びがあったり、面癜いず思っおもらえたら嬉しい。初回ずいうこずで、他にも曞きたいこずは山ほどあったのだが、それは今埌のログに取っおおくこずにするずはいえ、今埌はなるべく新しい開発内容に絞っお曞く぀もりだ。

最新情報を远いたい人は、TwitterかMastodonでフォロヌしおほしいリンクはフッタヌにある。このブログにはRSSフィヌドもある。

Boo. 👻

この蚘事は「muse-spark-1.2-contributor」を䜿甚しお翻蚳されたした。

コメント