HN公開:FlashSpace – 高速でオープンソースのmacOS Spaces代替アプリ
(github.com/wojciech-kulik)- FlashSpaceはmacOS標準のSpacesを補完・置き換える仮想ワークスペースマネージャーで、macOSのアニメーション待ちなしに素早くワークスペースを切り替えることを目指す
- ワークスペースごとにアプリとディスプレイを指定し、切り替え時にそのディスプレイの指定アプリを表示し、その他のアプリを隠す方式で、独立したマルチディスプレイ切り替えをサポートする
- Space Control、
Option + TabベースのWorkspace Switcher、Focus Manager、プロファイル、スワイプジェスチャー、Floating Apps、JSON/YAML/TOML設定、CLI、SketchyBarおよびRaycast連携を提供する - macOS 14.0以降と「Displays have separate Spaces」設定が必要で、Homebrewでのインストール、バイナリのダウンロード、ソースからのビルドに対応する
- 個別ウィンドウ単位のワークスペースとレイアウト管理はサポートせず、macOSに特定ウィンドウを隠す公開APIがないことと、シンプルさ・性能を理由に、アプリの表示/非表示を中心とした設計を維持する
FlashSpaceが行うこと
- FlashSpaceはmacOS向けの仮想ワークスペースマネージャーで、標準のmacOS Spacesを補完し置き換えるよう設計されている
- 目的は、macOSのアニメーションを待たない高速なワークスペース切り替えである
- 各ワークスペースにはアプリを割り当て、ワークスペース自体は特定のディスプレイに割り当てる
- ワークスペースに切り替えると、割り当てられたアプリは自動的に表示され、同じディスプレイ上の他のアプリは隠される
- 複数のディスプレイでワークスペースを独立して切り替えられる
インストールと基本的な利用フロー
- 要件はmacOS 14.0以降と、システム設定の
Desktop & Dockにある「Displays have separate Spaces」の有効化である - インストール方法はHomebrew、リリースバイナリのダウンロード、ソースからのビルドに対応する
- Homebrewでのインストールコマンドは
brew install flashspace - バイナリはReleases Pageから入手できる
- Homebrewでのインストールコマンドは
- 基本的な利用フローは次の通り
- すべてのアプリをディスプレイごとの単一のmacOS Spaceへ移動
- ワークスペースを作成
- アプリを割り当て
- ワークスペースにディスプレイを割り当てる、または動的モードを使用
- すばやく有効化するためのショートカットを設定
- 他のワークスペースにも同じ手順を適用
- ショートカットで設定済みのワークスペースへ切り替え
- 同じアプリを複数のワークスペースに維持したい場合は、アプリ設定のFloating Apps機能を使うか、メインのアプリウィンドウでアプリを複数のワークスペースに追加できる
主な機能
- 高速なワークスペース切り替えとマルチディスプレイ対応を提供する
- Space Controlは、すべてのワークスペースをグリッドでプレビューして切り替える機能である
0-9と矢印キーでワークスペースを切り替えられる
- Workspace Switcherは、デフォルトでは
Option + Tabでワークスペース一覧を表示して切り替える- macOSのアプリスイッチャーである
CMD + Tabに似た方式で動作する
- macOSのアプリスイッチャーである
- Focus Managerは、ショートカットでウィンドウ間のフォーカスを任意の方向へ移動し、ディスプレイ間のジャンプもサポートする
- その他の機能には次が含まれる
- アプリのフォーカスを検出した後にワークスペースを有効化
- アクティブウィンドウへカーソルを自動的に中央揃えするCursor manager
- 複数の設定を素早く切り替えるProfiles
- ワークスペースごとにアイコンとテキストを設定できるメニューバー
- トラックパッドのスワイプジェスチャー動作のカスタマイズ
- GUIと設定ファイルベースの構成
- JSON、YAML、TOML設定ファイル形式のサポート
- CLIによるアプリ制御
- Picture-in-Picture対応
- SketchyBar連携
- Raycast extension対応
ディスプレイ割り当て方式
- FlashSpaceは静的モードと動的モードの2つのディスプレイ割り当て方式をサポートする
- 静的モードはデフォルトで、各ワークスペースを特定のディスプレイに割り当てる
- macOS Spacesのように、ディスプレイごとに専用のワークスペースを望むユーザーに適している
- 複数のディスプレイを使い、配置を頻繁に変える場合は難しいことがある
- 動的モードは、各ワークスペースを、そのワークスペースのアプリが位置するディスプレイに自動的に割り当てる
- 1つのワークスペースを複数のディスプレイに同時表示できる
- アプリをディスプレイ間で移動してワークスペースを再配置したい場合に便利
- このモードでは空のワークスペースを表示できない
- ディスプレイ割り当てモードは、アプリ設定のWorkspacesで変更できる
Picture-in-Picture対応と制約
- FlashSpaceはPicture-in-Pictureモードに対応するが、実験的機能である
- この機能は
App Settings -> Workspacesで無効化できる - macOSは特定のウィンドウだけを隠す公開APIを提供しておらず、アプリを隠すとPiPウィンドウも一緒に隠れる
- FlashSpaceはこの問題を回避するため、アプリがPiPをサポートしているかどうかを識別し、PiPウィンドウを除くすべてのウィンドウを画面の隅に隠す
- PiPウィンドウが見えない場合は標準動作が適用される
- 対応ブラウザはSafari、Zen Browser、Chrome、Firefox、Brave、Vivaldi、Arc、Dia、Opera、Microsoft Edge、Cometである
- ブラウザの言語がEnglishに設定されていない場合、この機能が動作しないことがある
設計原則と意図的な非対応
- プロジェクトの価値は性能、シンプルさ、安定性、邪魔をしない動作、UNIX哲学である
- FlashSpaceはワークスペース管理を1つの仕事と捉え、その仕事をうまく行う方向に従う
-
邪魔をしない動作
- FlashSpaceはウィンドウを積極的には管理しない
- ワークスペースに切り替えた後、そのワークスペースに割り当てられていないアプリを呼び出すと、そのアプリはワークスペースのアプリの上に表示される
- この動作により、他のアプリへ素早くアクセスしつつ、グリッチやワークスペース切り替えを避けられる
- タイリングウィンドウマネージャーでは、設定されていないポップアップやダイアログのためにグリッチがよく起こることがある
- FlashSpaceは、割り当てられていないウィンドウやアプリを管理しない方式で、システムと干渉せずに相互作用するようにしている
-
個別アプリウィンドウ単位のワークスペースは非対応
- FlashSpaceは、アプリの個別ウィンドウをワークスペース別に分ける概念をサポートしない
- シンプルで高速に保つための意図的な決定である
- ネイティブの表示/非表示機能に依存し、ワークスペース管理と切り替えを効率的に実行する
- この方式はバッテリーに有利で、Mission Controlのようなシステム機能を壊さない
- 個別ウィンドウ単位のサポートは大きな複雑さを生み、性能に悪影響を与える可能性がある
- macOSには特定ウィンドウを隠す公開APIがなく、現在の選択肢はウィンドウを画面の隅に移動するか最小化することだけで、どちらも理想的なユーザー体験ではない
-
レイアウトは非対応
- FlashSpaceはウィンドウの移動、サイズ変更、レイアウト変更をサポートしない
- この機能は複雑さを大きく増し、性能に悪影響を与える可能性がある
- すべてのエッジケースとグリッチに対応するには多くの作業が必要である
- ウィンドウ管理アプリであるMagnet、Rectangle、Raycastなどと併用できるため、その機能を重複させない
連携、CLI、ビルド
- SketchyBarなどと連携でき、ワークスペース変更時に構成可能なスクリプトを実行する
- CLIはワークスペース、アプリ、プロファイルの管理をサポートする
- まずアプリ設定のCLIからインストールする必要がある
flashspace --helpで利用可能なコマンドを確認できる
- ソースビルドはXcodeGenで
project.ymlからXcodeプロジェクトを生成する- リポジトリをクローンした後、
brew bundleで依存関係をインストールする xcodegen generateを実行した後、FlashSpace.xcodeprojをXcodeで開いてビルドする- ブランチを切り替えたり変更をpullしたりするたびに、
xcodegen generateを再実行する必要がある - 署名設定を含めてプロジェクトを生成するには、
XCODE_DEVELOPMENT_TEAM=YOUR_TEAM_ID xcodegen generateを使用できる
- リポジトリをクローンした後、
利用のヒント
- macOSにはスリープ後にアプリが誤ったディスプレイに表示されるバグがある
- アプリがスリープ中に隠されていると発生する
- 復帰後、ログイン前にすべてのディスプレイをオンにすると、アプリが正しいディスプレイに表示されることがある
- macOS 15はサードパーティアプリなしでウィンドウの移動とサイズ変更機能を提供する
- メニューバーの
WindowでMove & Resizeサブメニューを確認できる - ショートカットの調整は限定的で、より柔軟な方法はRaycast、Magnetなどのウィンドウ管理アプリの利用である
- メニューバーの
- 同じアプリのウィンドウ間のフォーカス切り替えは、macOSの
Cmd + `ショートカットで可能である - SKHDはユーザー定義のグローバルショートカットを定義するCLIツールで、FlashSpace CLIと併用できる
- RaycastユーザーはRaycast extensionで、キーボードから手を離さずにFlashSpaceを管理できる
1件のコメント
Amethystと互換性があるのか気になる。タイル型ウィンドウ管理は欲しいが、スペース切り替えの遅延は望まない
とても良い!ワークスペースのグリッド表示を追加できるといいのに。TotalSpacesが恋しい
ちょうどいいタイミング。この分野で選択肢を再検討していて、AeroSpaceに決めたところだった。この製品も試してみるつもり
ありがとう!たった今インストールしたけど、今のところ順調に動いている
この目的のために1年以上AeroSpaceを使っている。設定ですべてのタイル機能を無効にして、2つのショートカットだけを使っている: ワークスペースに切り替えることと、現在のウィンドウをワークスペースに移動すること。小さい画面で作業するときには必須