ツリーではなくフラットな配列
どのスペースもフラットなウインドウの一覧です。レイアウトはその配列に対する純粋な関数で、ツリーをいじることは一切ありません。
KiwiDesk はウインドウを i3 のようなツリーではなくフラットな配列で管理します。Lua で全面的に設定でき、7 つのレイアウトを切り替えられます。そしてSIP を無効化しません。
MIT ライセンス ↗ · Swift と Lua で記述 · 署名・公証済み · macOS 14 以降、Apple シリコン
🥝 バージョン 1.1.2「タイル型のウインドウマネージャは、ずっと一部の人の玩具でした。私はそれを、誰にとっても直感的なものにしたかったのです。ただ、こんなふうに動いてくれればいい。」
「使う人に合わせて動くウインドウマネージャがほしかったんです。こちらが動き方を教えなければいけないものではなく。」
マスコットがひと画面ぶんのウインドウを楽しげに整えていく、10 秒の小さな映像です。KiwiDesk のやり方に、ちょっとした愛嬌を添えて。
クリックで再生 — 10 秒 🥝
「ひとこと注意を。キウイがキウイを積み上げるのを眺めるのと同じくらい、妙に心地よいです。並ぶところを見たいがために、わざとウインドウを開くようになります。」
フラットな一次元のウインドウモデル。そこから自然に生まれる、速くて、スクリプトから扱えて、安全なすべて。
どのスペースもフラットなウインドウの一覧です。レイアウトはその配列に対する純粋な関数で、ツリーをいじることは一切ありません。
bsp、スタック、スクロール(PaperWM 風)、モノクル、グリッド、トラック、フローティング。いつでも即座に切り替えられます。
サンドボックス化された Lua 5.5 VM が ~/.config/KiwiDesk/init.lua を読み込みます。設定が壊れていてもウインドウは固まりません。500 ms のウォッチドッグが守ります。
すべてをスクリプトから操作できます。ソケット経由でイベントを SketchyBar や JankyBorders、自作のツールへ流せます。
モニタごとに 1 つの display link を使うので、60 Hz と 120 Hz が混在する環境でも、それぞれが本来のリズムで滑らかに動きます。
カーネル拡張は使いません。モーダルなキーバインドは Carbon を使うため、入力監視の許可は不要で、キーロガーにもなりません。
Sticky にしたウインドウは、すべてのスペースに付いてきます。1 つの画面だけに留めることもできます。ウインドウのマークと Space Bar のバッジが、それを示します。
VoiceOver ではどの項目も名前と値を読み上げ、設定はキーボードだけでも操作できます(macOS のキーボードナビゲーションをオンに)。
Finder や Safari、ターミナルのタブを切り替えても、まとめても、レイアウトはそのままです。ウインドウマネージャーから見れば macOS のタブは別々のウインドウ。たいていそこで破綻します。
どのレイアウトも、同じフラットな配列に対する純粋な関数です。だから切り替えは一瞬で、結果も読めます。
二分割:新しいウインドウがペインを半分にします。
マスター領域と、その横のスタックカラム。
Niri / PaperWM 式の、スクロールするカラムまたは行。
フォーカス中のウインドウを最大化し、残りは背面へ。
動的または固定の、行 × 列。
カラムまたは行。どのサイズ変更にも、対象は 1 つだけ。
macOS のデフォルトを、そのまま。
スライダーより、テキスト派? ~/.config/KiwiDesk/init.lua に本物の Lua を書けば、そちらが主導権を握ります。レイアウトも間隔もキーバインドも、すべてコードで。サンドボックス化された Lua 5.5 VM 上で 500 ms のウォッチドッグ付きで動くため、書き間違いでウインドウが固まることはありません。
-- ~/.config/KiwiDesk/init.lua
KiwiDesk.set_gap_global(10)
KiwiDesk.set_mode("music", "floating")
-- one flat array per space, tidy by default
KiwiDesk.bind("cmd+alt+left", function()
KiwiDesk.focus("left")
end)すべての操作がコマンドです。キーに割り当てても、スクリプトから呼び出しても、Unix ソケット経由でイベントを SketchyBar や JankyBorders、自作のツールへ流し込んでも構いません。
「ウインドウマネージャがスクリプトから動かせるようになった日から、デスクトップは自分で回りはじめました。以来、ウインドウをドラッグしていません。」
$ kiwidesk set_mode monocle
$ kiwidesk focus left
$ kiwidesk get_state
# ライブイベントを配信(SketchyBar や自作ツールへ)
$ kiwidesk subscribe space_change「ターミナルはまったく苦になりませんが、思いどおりにウインドウを並べるためだけにコンテナの入れ子をずっと追いかけるのには疲れてしまいました。KiwiDesk はすべてをフラットに保ちます。無駄なオーバーヘッドも、気の散る要素もなく、ただプロジェクトに集中できます。」
パッケージマネージャーの方がよいですか。コマンド 1 つで kiwidesk CLI が PATH に入ります。どちらの方法でも、KiwiDesk はその後自動で最新に保たれます。
ドキュメントを読む署名・公証済みのディスクイメージは、同じ App です。そちらで入れた場合は、kiwidesk CLI を PATH に通すリンクをご自分で作ってください。CLI のドキュメントで手順を案内しています。
$ brew install --cask kiwicanopy/tap/kiwidesk
# kiwidesk CLI も PATH に入りますMIT ライセンス ↗ · Swift と Lua で記述 · 署名・公証済み · macOS 14 以降、Apple シリコン
$ git clone https://github.com/KiwiCanopy/KiwiDesk.git
$ cd KiwiDesk
$ swift build -c release
# コントリビューター向け — 手軽なのは HomebrewKiwiDesk をダウンロードするか、Homebrew でインストールしてください。どちらも同じ署名済みのビルドで、その後は自分で最新に保ちます。
MIT ライセンス ↗ · Swift と Lua で記述 · 署名・公証済み · macOS 14 以降、Apple シリコン
KiwiDesk は無料のオープンソースです。GitHub でスターを付けると、他の人が見つけやすくなります。
「1 日 1 個のリンゴと言いますが、キウイのほうがビタミンも多く、野心も大きいのです… 🥝」