オープンソース
Show HN: Whetuu – Zigで書かれたゼロコンフィグのクロスシェルプロンプト
Show HN: Whetuu – a zero-config cross-shell prompt written in Zig (yamafaktory.github.io)
要約
WhetuuはZigで書かれた、設定不要で高速なクロスシェルプロンプトです。インストールはcurlコマンド1つで完了し、シェルの設定ファイルに自動的に追加されます。SSH接続時やroot権限時のみユーザー名とホスト名を表示し、現在のディレクトリ、Gitブランチとステータス、言語ツールチェーンのバージョン、コマンド実行時間などを表示します。特に、アップキーで呼び出せる履歴ピッカーは、入力に応じてフィルタリングし、色付けされたコマンド履歴を表示します。ディスクアクセスは並列化されており、Gitのハングアップ時でも250ms以内に応答を返すように設計されています。また、ネットワーク通信やテレメトリは一切行わず、セキュリティとプライバシーに配慮しています。
全文翻訳
~/install
ワンコマンド
1. 実行する。
インストーラーはプラットフォームを検出し、ダウンロードを公開されているSHA256SUMSと比較し、バイナリを~/.whetuu/binに配置し、実際に使用しているシェルの設定に2行を追加します。2回実行しても何も変わりません。
$ curl --proto '=https' --tlsv1.2 -fsSL https://yamafaktory.github.io/whetuu/install.sh | sh
コピー
macOSとLinux
スクリプトを読む
tarballsとチェックサム
2. 新しいシェルを開く。
これでインストールは完了です。
ドットファイルを自分で編集したいですか?
WHETUU_NO_MODIFY=1 を付けて実行すると、書き込む代わりに2行が出力されます。
whetuu init <shell> も同様に、それが属するファイルと共にそれらを出力します。
アンインストールは rm -rf ~/.whetuu に加えてそれらの行を削除することです。
Nerd Fontが必要です。
プロンプトは、gitブランチ、言語ロゴ、プロンプト文字にNerd Fontグリフを使用します。それがないと、それらは空のボックスとして表示されます。
~/demo
実際のシェルで見る
プロンプトはブランチ、gitステータス、ツールチェーンのバージョンを追跡します。アップキーを押すと履歴ピッカーが開きます。これは入力中にフィルタリングし、選択したものを実行します。
demo
~/modules
表示されるもの
左から右へ、各セグメントは関連がある場合にのみ表示されます。
user_host
ユーザー@ホストを太字の緑で表示しますが、SSH接続時またはrootの場合のみ、警告として太字の赤で表示します。
directory
現在のディレクトリ。 $HOME は ~ に折りたたまれます。アンカーと、幅に収まるだけの末尾のディレクトリを保持します。
git branch
ブランチのグリフと現在のブランチ、または(detached)をマゼンタで表示します。
git state
進行中の操作を黄色で表示します:(rebasing 2/7)、(merging)、(cherry-picking)。追加のサブプロセスなしで、.gitから直接読み取ります。
git status
競合、スタッシュ、ステージング済み、変更済み、追跡されていない、ahead、behindを1つの括弧で囲まれたグループで表示します。
language
39の言語とツールのブランドカラーで、ロゴとツールチェーンのバージョンを表示します。プロジェクトのマニフェスト、ソースファイルの拡張子、またはインフラマーカーから検出されます。
cmd_duration
最後のコマンドが2秒以上実行された場合、タイマーのグリフと経過時間を表示します。
character
デフォルトでは紫、または言語のブランドカラーの星。失敗したコマンドの後、赤色に変わります。
~/picker
アップキーでの履歴ピッカー
コマンドは、終了したときに記録され、正常に終了した場合にのみ記録されます。そのため、タイプミスがリストを散らかすことはありません。各コマンドは実行されたディレクトリと共に保存されます。ピッカーは現在のディレクトリにスコープされて開かれ、履歴がない場合はすべての履歴にフォールバックします。
whetuu history
2d git commit -m "Cache toolchain versions"
1d cd ~/cf/platform && git push -u origin HEAD
17h docker exec -i PGPASSWORD=x db psql
14m nvim ~/.config/fish/config.fish
11m npm ci
行はシンタックスハイライトされます。コマンド名、フラグ、パス、変数、引用符で囲まれた文字列、演算子は、ターミナルテーマの色から色付けされるため、ピッカーは既に実行しているパレットに一致します。ウィンドウに収まらない幅の広いコマンドは、その末尾ではなく中央を...で省略するため、長いプレフィックスを共有するコマンドの実行を区別できます。
type
フィルタリング。すべての単語は、大文字小文字を区別せずに一致する必要があります。
↑ / ↓
選択を移動します。上はさらに過去に遡ります。
Ctrl+G
このディレクトリの履歴とすべての履歴を切り替えます。
Tab
選択を検索フィールドにコピーして編集または拡張します。
Enter
実行します。何も一致しなくなった場合は、入力されたテキストを実行します。
Esc
キャンセルし、コマンドラインにあったものをそのまま残します。
~/performance
約2ミリ秒でレンダリング
プロンプトは各コマンドの前に実行されるため、シェルで高速である必要がある唯一のものです。ディスクを読み取るすべてのモジュールは、std.Ioを介して同時に実行されるため、レンダリングには、それらの合計ではなく、最も遅いプローブにかかる時間がかかります。
DirectoryRender
比較のため
リポジトリなし、ツールチェーンなし
2.3 ms
Zigリポジトリ、35ファイル
3.0 ms
zig versionのみ:3.1 ms
モノレポ、8259ファイル
20.2 ms
git statusのみ:19.3 ms
hyperfine --warmup 40 --runs 400 を 13世代 i9-13900H、ReleaseFast、パフォーマンスコアにピン留めし、それ以外はアイドル状態のマシンで測定しました。モノレポでは、プロンプト全体がgit status単独と同じくらいの時間がかかります。遅いリポジトリでもシェルをハングさせることはできません。
両方のサブプロセスは制限されています。Gitは250ミリ秒、ツールチェーンプローブは200ミリ秒かかり、それらは同時に実行されるため、最悪の場合は大きい方の時間になります。Gitが30秒ハングした場合でも、プロンプトは257ミリ秒で返されます。Gitセグメントは単にドロップされます。
~/security
何もマシンから出ない
プロンプトは実行するすべてのコマンドを表示し、ピッカーはそれらを保持します。これは小さなツールに渡すには多すぎる情報なので、whetuuが何を行い、何を行わないかを正確に示します。
ネットワークなし
ソケット、HTTPクライアント、同期はバイナリ内に一切ありません。テレメトリもアップデートチェックもありません。アカウントもオプトアウトするサーバーもありません。
2つのファイル
実行中、whetuuは正確に2つのファイルを書き込みます。履歴ストアは、モード600で作成され、書き込みごとにリセットされるため、古いバージョンで読み取り可能になったものが自己修正されます。そして、~/.cache/whetuu/versionsにあるツールチェーンバージョン文字列のキャッシュがあり、それ以外は何も保持せず、いつでも削除できます。
外部のデータ
両方のファイルはXDGベースディレクトリ仕様に従っているため、どちらもインストールディレクトリにはありません。whetuuを rm -rf ~/.whetuu で削除しても、履歴は一緒に削除されません。whetuu paths は両方の場所を表示します。
1つのインストール編集
インストーラーは、使用しているシェルの設定に2行を追加するだけで、それ以外は何も行いません。使用していないシェルの設定は決して追加しませんし、二度追加することもありません。WHETUU_NO_MODIFY=1 は、それらを書き込む代わりに表示させます。すべて~/.whetuuに配置されるため、削除するのは1つのディレクトリです。
コマンドをスキップする
コマンドをスペースで開始すると、決して記録されません。トークンを含むコマンドに使用してください。成功したコマンドのみが記録されます。
シェルは決して使用しない
whetuuは2つのサブプロセスを実行します:gitとツールチェーンバージョンプローブ。どちらもコマンドラインではなく、固定された引数のリストを受け取るため、入力したものはコマンドとして解釈されることはありません。リベース中のような状態は、サブプロセスなしで.gitから直接読み取られます。
エスケープ処理
コマンド、ブランチ名、ディレクトリ内のすべての制御バイトは、ターミナルに到達する前に?になります。クローンしたばかりのリポジトリは、whetuuを通じて画面を再描画したり、カーソルを移動したりすることはできません。
設定不要
設定ファイルがないため、設定パーサー、テーマフォーマット、起動時に実行されるユーザーの設定はありません。攻撃対象領域はバイナリと上記の2つのコマンドです。
1つの注意点
言語モジュールは、現在のディレクトリのファイルからプローブするツールチェーンを選択するため、信頼できないリポジトリに入ると、whetuuがnode --versionのようなものを実行する可能性があります。PATHが解決するものを実行するのであり、リポジトリ内のバイナリを実行することはありません。
チェック可能なダウンロード
Linuxビルドは静的muslでランタイム依存関係はありません。各リリースにはSHA256SUMSファイルが付属しています。ソースはGitHubにあり、ビルドは1コマンドで実行できます。