iTerm2 に開きっぱなしの約70画面が Mac を温めていた。cmux に移ると、同じ画面数で CPU は約50分の1、メモリは半分以下に。原因の調べ方と、iTerm2 と同じ操作感にする設定をまとめます。

目次
  1. 3行まとめ
  2. この記事でやった設定の一覧
  3. 1. なぜ乗り換えたか
  4. 2. 結論: CPU は約50分の1
  5. 3. iTerm2 は何に CPU を使っていたのか
  6. 4. なぜ cmux を選んだか
  7. 5. 73画面をそのまま移す
  8. 6. iTerm2 と同じ操作感にする
  9. ⌥Space で窓を出す・隠す
  10. ⌘↩ で窓を広げる・戻す
  11. 窓を半透明にする
  12. 一覧の並べ替えを選ぶ
  13. 7. 移行で気をつけたいこと
  14. 8. 新しい Mac でも同じにする
  15. まとめ: こんな人におすすめ

3行まとめ

  • iTerm2 は、画面が多いほど重くなる作りだった(前面にいる間、0.5秒ごとに全プロセスを見回る)
  • 同じ約70画面で比べると、cmux は CPU が約50分の1、メモリが半分以下
  • 少し設定すれば、iTerm2 とほぼ同じ操作感で使える(設定は下の一覧のとおり)

測った環境: MacBook Pro(M4 Max・メモリ64GB)、macOS 15、iTerm2 3.7.4、cmux 0.65.0(2026年10月時点)

この記事でやった設定の一覧

やったことどこで何のため
✅iTerm2 の全タブを cmux に移すcmux の CLI(--layout)73画面を手で作り直さない
✅⌥Space で cmux を出す・隠すcmux の設定「グローバルホットキー」iTerm2 と同じ呼び出し方
✅iTerm2 の ⌥Space を外すiTerm2 の設定 → Keys → Hotkeyキーの取り合いを防ぐ
✅⌘↩ で窓を広げる・戻すHammerspooniTerm2 の全画面の代わり
✅cmux と Ghostty の ⌘↩ を外すcmux.json と Ghostty の設定Hammerspoon とぶつけない
✅背景を20%透かすGhostty の設定iTerm2 と同じ見た目
✅一覧の並べ替えを選ぶcmux の設定「通知時に並べ替え」好みで「動く/動かない」を選ぶ
✅設定ファイルをリポジトリで管理自分のセットアップ用リポジトリ新しい Mac でも同じにする

1. なぜ乗り換えたか

要点: 「目印」として残した70画面が、Mac を温めていた。

  • AI エージェント(Claude Code など)を何本も並べて使っている
  • 「この画面を見れば前の作業を思い出せる」ので、空の画面も閉じない
  • 気づけば iTerm2 に 22タブ・73画面
  • 再起動したばかりの Mac が温かく、調べたら原因の一つが iTerm2 だった

2. 結論: CPU は約50分の1

要点: 同じ約70画面を前面に置いて2分間測ると、桁が違った。

同じ約70画面で、CPU は約50分の1

iTerm2(73画面)cmux(72画面)
CPU(アプリ本体)1コアの 157%3.3%
メモリ(アプリ本体)約 1.8GB約 0.8GB

注意: iTerm2 の数字には、タブで動いていた Claude Code の画面を描く分も入っています。cmux は空のシェルだけです。条件が完全に同じではないので、「桁が違う」くらいに受け取ってください。

3. iTerm2 は何に CPU を使っていたのか

要点: 画面ごとの「今動いているコマンド」を調べるための見回り。

iTerm2 は、Mac の全プロセスを見回り続ける

  • 前面にいる間は 0.5秒ごと、裏にいる間は 5秒ごと に、Mac の全プロセスを見回る
  • 見回りのたびに補助プログラム pidinfo が起動して終わる(10秒に約20回)
  • 間隔はコードに直接書かれていて、設定では変えられない(ソース: iTermProcessCache.m)
  • ステータスバーは無関係だった(外して測り直しても誤差の範囲)

ハマりどころ: 測っている自分を数えていた 測定スクリプトの引数にアプリのパスを書いていたため、スクリプト自身まで「アプリの負荷」として数えていました。最初は cmux が 17.9% と出て、自分を除くと 3.3% でした。プロセスを名前で絞り込んで測る時は、自分が引っかかっていないか確かめましょう。

4. なぜ cmux を選んだか

要点: 「大量の作業を並べて、どれが呼んでいるか分かる」作りだから。

cmux の左の一覧。作業場所ごとに、名前・メモ・ブランチ・フォルダが並ぶ。一番上は「入力を待っています」の通知が来て上に移った作業場所

  • 左の一覧 に、作業場所ごとのブランチ・フォルダ・PR・最新の通知が出る
  • Claude Code が入力を待つと、その作業場所に 未読の印 が付き、⌘⇧U で飛べる
  • 作業場所ごとに 1行メモ(⌥⌘E)を書ける。「何をしていて次に何をするか」を残せる
  • 作業場所は、開いた時に初めてシェルを起動 する。並べておくだけなら軽い
  • 中身は Ghostty の描画エンジン(libghostty)なので、表示も速い

一度は「自分で軽いターミナルを作るか」とも考えましたが、作る前に既存のものを探して cmux に決めました。

5. 73画面をそのまま移す

要点: iTerm2 の分割の形とフォルダを読んで、cmux の --layout で作り直す。

  • iTerm2 の Python API で、タブごとの「分割の形・比率・フォルダ・タブ名」を読む
  • cmux の new-workspace --layout に渡す
cmux new-workspace --name "📸 写真アプリ" --focus false --layout '{
  "direction": "horizontal", "split": 0.5,
  "children": [
    {"pane": {"surfaces": [{"type": "terminal", "cwd": "/Users/you/workspace/app"}]}},
    {"pane": {"surfaces": [{"type": "terminal", "cwd": "/Users/you/workspace/app"}]}}
  ]
}'

書き方のポイント

  • horizontal は左右、vertical は上下の分割
  • 1つの分割は 子がちょうど2つ。3分割以上は2分割の入れ子にする
  • split は 0.1〜0.9 に丸められる
  • 作った結果は cmux --json tree で読み出して、元と突き合わせられる

ハマりどころ

  • cmux は既定で「cmux の中のプログラムからだけ」操作を受け付けます。外から一括で作るには一時的に許可を広げ、終わったら既定(cmuxOnly)に戻しましょう
  • new-workspace は選択中の作業場所の後ろに入るので、続けて作ると 逆順 になります。最後に cmux reorder-workspaces で並べ直します

6. iTerm2 と同じ操作感にする

⌥Space で窓を出す・隠す

要点: cmux の設定でオンにする。ただし iTerm2 側を先に外す。

  • cmux: 設定(⌘,)→「グローバルホットキー」→「システム全体のホットキーを有効にする」をオン → キーを ⌥Space に
  • iTerm2: 設定 → Keys → Hotkey のチェックを外す

ハマりどころ: iTerm2 の API で設定値をオフにしても、動いている iTerm2 はキーを手放しませんでした。設定画面のチェックを 一度入れてから外す と解放されます。

⌘↩ で窓を広げる・戻す

要点: cmux だけではできないので、Hammerspoon で「拡大/縮小」を押す。

⌘↩ で、同じデスクトップのまま窓を広げる

  • cmux の全画面(⌃⌘F)は、別のデスクトップに移る方式だけ
  • 代わりに macOS の「ウインドウ → 拡大/縮小」(同じデスクトップのまま広げ、もう一度で戻る)を使う
  • ただしメニューにショートカットを付けても、cmux が端末への入力として送ってしまい効かない
  • そこで Hammerspoon(無料)が、cmux が前面の時だけ ⌘↩ を先に受け取る
-- ~/.hammerspoon/init.lua
hs.autoLaunch(true)
hs.dockIcon(false)
hs.menuIcon(false)

CMUX = "com.cmuxterm.app"
cmuxZoomKey = hs.hotkey.new({"cmd"}, "return", function()
  local app = hs.application.frontmostApplication()
  if app and app:bundleID() == CMUX then
    app:selectMenuItem({"ウインドウ", "拡大/縮小"})  -- 英語の macOS なら {"Window", "Zoom"}
  end
end)

local function update(app)
  if app and app:bundleID() == CMUX then
    cmuxZoomKey:enable()
  else
    cmuxZoomKey:disable()
  end
end
cmuxWatcher = hs.application.watcher.new(function(_, event, app)
  if event == hs.application.watcher.activated then update(app) end
end)
cmuxWatcher:start()
update(hs.application.frontmostApplication())

使う前にやること

  • Hammerspoon に「アクセシビリティ」の許可を出す(システム設定 → プライバシーとセキュリティ)
  • cmux のチェックリストの ⌘↩ と、Ghostty 既定の ⌘↩(全画面)を外す(下の設定)

~/.config/cmux/cmux.json:

{
  "shortcuts": {
    "bindings": {
      "showHideAllWindows": "opt+space",
      "toggleChecklistItemComplete": null
    }
  }
}

窓を半透明にする

要点: Ghostty の設定に1行。再起動はいらない。

~/.config/ghostty/config:

background-opacity = 0.8
keybind = super+enter=unbind
  • cmux のメニュー「構成を再読み込み」で反映される
  • 0.8 は「20%透ける」。好みで数字を変える

一覧の並べ替えを選ぶ

要点: 設定 → アプリ →「通知時に並べ替え」。検索するなら「通知時」。

選ぶもの動き向いている人
オフ並び順を変えないiTerm2 のように場所で覚えたい
通知(既定)通知が来た作業場所を上に移す呼ばれたものだけ上に来てほしい
エージェントのアクティビティ依頼を送った・返答が終わった時なども上に移す動いているものを上にまとめたい

7. 移行で気をつけたいこと

  • Claude Code の ⇧↩(改行)と通知はそのまま使える: cmux は Ghostty を名乗る(TERM_PROGRAM=ghostty)ので、Claude Code 公式の「設定不要」の側に入る
  • iTerm2 が入れたフックが残る: iTerm2 3.7 は ~/.claude/settings.json に自分の道具(cc-status)を登録する。cmux では使わないので、iTerm2 をやめる時に外せる
  • Claude Code の設定フォルダを分けている人: cmux の「Vault」(昔の会話の検索)は、CLAUDE_CONFIG_DIR か ~/.claude の会話しか読まない
  • キー操作は自分の指で確かめる: プログラムから送った偽のキー入力には cmux が反応せず、「動かない」と勘違いしかけた
  • 日本語: cmux はほぼ日本語。Hammerspoon は英語だけなので、アイコンを隠した

8. 新しい Mac でも同じにする

要点: 設定ファイル3つをリポジトリに置き、リンクで使う。

  • 置くもの: cmux.json・Ghostty の config・Hammerspoon の init.lua
  • 小さな install.sh で、リンクと Mac の設定(cmux のグローバルホットキーをオン等)をまとめて入れる
  • 手作業で残るのは、Hammerspoon のアクセシビリティの許可だけ

まとめ: こんな人におすすめ

おすすめ

  • AI エージェントを何本も並べて動かし、タブが増え続けている
  • 「どのタブが自分を呼んでいるか」を一目で知りたい
  • 開きっぱなしのターミナルで、Mac が温かい・ファンが回る

向かないかもしれない

  • iTerm2 の tmux 連携(tmux -CC)やトリガーなど、iTerm2 ならではの機能に頼っている
  • 同じデスクトップのままの全画面を、追加の道具なしで使いたい

cmux なら、70画面を並べておいてもアプリ本体の CPU はほとんど使いません。そのうえ「どこで呼ばれているか」が左の一覧で分かります。タブを閉じられない人ほど、試してみる価値があると思います。

書いた人

Kyohei T.

個人開発者。つくったものと、その作り方を記録しています。運営者情報