AeroSpaceで無理せずウィンドウを管理する

2026-06-27


結論

タイル型 Window Manager の AeroSpace を使うことにした。

GitHub - nikitabobko/AeroSpace: AeroSpace is an i3-like tiling window manager for macOS

AeroSpace is an i3-like tiling window manager for macOS - nikitabobko/AeroSpace

https://github.com/nikitabobko/AeroSpace

GitHub - nikitabobko/AeroSpace: AeroSpace is an i3-like tiling window manager for macOSのサムネイル
GitHub - nikitabobko/AeroSpace: AeroSpace is an i3-like tiling window manager for macOS

AeroSpace is an i3-like tiling window manager for macOS - nikitabobko/AeroSpace

タイル型 Window Manager として、というよりかは Workspace ごとにアプリのウィンドウを固定したかった側面が強い。普段 Neovim を使っているのでキーボードでウィンドウを操作できるのは魅力的だが、あくまでおまけについてきた Cool な機能だと思っている。

設定の概要

全体の設定は ras0q/dotfiles を参照。

アプリのデフォルト起動は Floating layout にする (これが一番共有したかった)。 これを設定することでアプリを自動で Tiling layout に載せずに、これまで通りマウスでアプリを移動・リサイズすることができる。 Tiling layout に載せたくなった場合は layout floating tiling の Keymap を設定して使うことで Layout を切り替えることができる。

[[on-window-detected]]
check-further-callbacks = true
run = "layout floating"

[mode.main.binding]
alt-shift-f = "layout floating tiling"

Workspace が多すぎると混乱するので、Macbook 側 (main) に Workspace 1〜3 を、外部ディスプレイ 側 (secondary) に Workspace a〜c の 3 つずつのみを用意する。 また、Workspace に固定したいアプリはアプリ起動時に move-node-to-workspace するように設定する

[workspace-to-monitor-force-assignment]
1 = "main"
2 = "main"
3 = "main"
a = "secondary"  # Terminal
b = "secondary"  # Browser
c = "secondary"

[[on-window-detected]]
if.app-id = "com.github.wez.wezterm"
run = ["layout tiling", "move-node-to-workspace a"]

[[on-window-detected]]
if.app-id = "com.google.Chrome"
run = ["layout tiling", "move-node-to-workspace b"]

経緯

Mac の Mission Control と仮想デスクトップを愛用していた。仮想デスクトップの使用中は快適に使えるのだが、問題は外部ディスプレイ 1 を繋ぎ直す時にある。

macOS は賢いので、モニターごとに仮想デスクトップの配置を記憶してくれている。しかし、それが仇になって (?) 別の外部ディスプレイに繋ぐと仮想デスクトップがごちゃごちゃになってしまうのである。

例を挙げる。ある外部ディスプレイと繋いだ時は以下のように整列していたとする。

External display ↓
+---------+----------+-----+
| Browser | Terminal | IDE |
+---------+---+------+-----+
              |
+-------------+---+-------------+
| Settings, Notes | Other apps  |
+-----------------+-------------+
MacBook display ↑

これが、別の外部ディスプレイに繋ぐと全仮想デスクトップが片方のディスプレイに偏り、もう片方には空のデスクトップが残るという配置になる。

External display ↓
          +-------+
          | Empty |
          +---+---+
              |
+---------+---+------+-----+-----------------+-------------+
| Browser | Terminal | IDE | Settings, Notes | Other apps  |
+---------+----------+-----+-----------------+-------------+
MacBook display ↑

ちなみに、これは全て macOS が悪いというわけではなく、各アプリごとに配置されるデスクトップの規則が異なることも原因の 1 つである (例えば Chrome は外部ディスプレイを繋ぎ直すとその下にあったデスクトップに移動し、WezTerm はアプリウィンドウを別のデスクトップに移動しても元のデスクトップに戻ってきたりする)。

これを解決するために AeroSpace をインストールした。

AeroSpace は Mac の仮想デスクトップとは別に Workspace という単位を設けており、各ディスプレイがそれぞれ 1 枚の Workspace を表示する。実装的には各ディスプレイの角に Inactive な Workspaces のアプリを隠しているらしい (参考: 4.1. Proper monitor arrangement)。

以下の画像では、Mac のディスプレイで Workspace 1 (Notion, Obsidian, システム設定) を、外部ディスプレイで Workspace a (WezTerm) を開いており、フォーカスが Workspace 1 に当たっている状態である。

AeroSpace (というか Window Manager?) を使うと仮想デスクトップを使う必要がなく、ディスプレイごとに 1 枚のデスクトップのみがあれば良くなるため、外部ディスプレイを繋ぎ直してもレイアウトが崩れにくくなる。

しばらくこれで試してみることにする。

Footnotes

  1. 仮想デスクトップと名前が似ているので注意。外部ディスプレイはいわゆるモニター、仮想デスクトップは 1 枚のディスプレイを複数枚のデスクトップとして用いることのできる機能である。頭では分かっているがこの記事の執筆中に何度も打ち間違えている。