## 事象 ちょっと遅い。 ![[20260313_22_23_35.mp4]] ### 環境 | 対象 | バージョン | | --------- | ------ | | [[macOS]] | 15.7.4 | | [[cmux]] | 0.62.1 | ## 原因 サイドバーにプルリクステータスを表示するための処理で、PRポーリング停止処理を呼ぶようになり、`sleep 0.1` が入っているため必ず100msのwaitが発生するから。実際には 0.1 ~ 0.2秒 程度ラグが生じてそう。 ## 回避策 ### 方法1 (影響小・推奨) `~/.zshrc` に以下を追加することで、PRに関する処理を強引に無効化する。 ``` if [[ -n "$CMUX_SHELL_INTEGRATION" ]]; then _cmux_stop_pr_poll_loop 2>/dev/null || true _CMUX_PR_POLL_PID="" _CMUX_PR_FORCE=0 _cmux_start_pr_poll_loop() { return 0 } _cmux_stop_pr_poll_loop() { return 0 } _cmux_report_pr_for_path() { return 0 } _cmux_clear_pr_for_panel() { return 0 } fi ``` > [!caution] > 非公式の方法なので注意。 ### 方法2 (影響大) `sidebarShellIntegration` を無効化することで、上記処理を通らないようにする。 ``` $ defaults write com.cmuxterm.app sidebarShellIntegration -bool false ``` 以下のように設定が切り替わっていればOK。再起動後もこの設定は有効になる。 ``` $ defaults read com.cmuxterm.app sidebarShellIntegration 0 ``` > [!caution] > 非公式の方法なので注意。 #### 想定される副作用の有無 | 項目 | 供給元 | 設定変更後 | | --------------------------- | ---------------------------- | ---------- | | PR 状態表示 | cmux 独自 zsh/bash integration | ❌**止まる** | | Git branch / dirty 表示 | cmux 独自 zsh/bash integration | ❌**止まる** | | サイドバーの current directory | Ghostty 本体アクション | 残るはず | | コマンド名っぽいタイトル表示 | Ghostty 本体アクション | 残るはず | | ポート検出 | cmux 独自 zsh/bash integration | ❌**止まる** | | TTY 登録 | cmux 独自 zsh/bash integration | ❌**止まる** | | スクロールバック復元 | cmux 独自 zsh/bash integration | ❌**止まるはず** | | `PATH` の後段補正 | cmux 独自 zsh/bash integration | ❌**止まる** | | `Resources/bin` の初期追加 | アプリ本体 | 残る | | Ghostty 自身の zsh integration | Ghostty 本体 | 残るはず | #### 影響 - サイドバーの PR 状態表示が更新されなくなる。 - サイドバーの Git branch 表示が更新されなくなる。 - サイドバーの dirty 状態表示が更新されなくなる。 - サイドバーのポート表示が更新されなくなる。 - セッション復元時の terminal scrollback 復元が効かなくなる可能性がある。 - shell 起動後の PATH 補正が行われなくなる。 - .zshrc や plugin が shell 起動後に PATH を並べ替える環境では、cmux のラッパーが先頭から外れることがある。 - その場合、claude が cmux ラッパーではなく実体の claude を呼ぶ。 - その場合、cmux の Claude hook 注入や通知連携が効かなくなる。 - open が cmux ラッパーではなく system の open を呼ぶことがある。 - cmux が期待する CLI ではない解決先を引く可能性がある ## 解決方法 2026/03/14 時点ではなし。issueもなさそう。 ## 調査詳細 > [!right-bubble] ![[minerva-face-right.webp]] > cmux 0.62.1 からプロンプトでコマンドを入力してから、それが実行されるまでの間に0.数秒のラグが発生します。0.61.0では問題ありませんでした。 > [!left-bubble] ![[chappy.webp]] > • 調査結果です。コード変更はしていません。 > > - 最も有力な回帰点は zsh の shell integration です。844d85fe (Poll sidebar PR status while shells are idle) で、コマンド実行直前の _cmux_preexec() から PR ポーリング停止処理を呼ぶようになっています。現在の実装では _cmux_preexec:355 から _cmux_stop_pr_poll_loop:275 を毎回通ります。0.61.0 の preexec にはこの停止処理はありませんでした。 > - この停止処理の中に sleep 0.1 が入っているため、Enter 後に最低でも約 100ms の待ちが発生します。さらにプロセスツリーを ps で辿って gh pr view 側の子プロセスも止めようとしているので、条件次第で 0.1 秒超になります。手元で同等処理だけを測ると 0.111s でした。症状の「0.数秒のラグ」と一致します。 > - アプリ本体側の report_pwd / report_tty / ports_kick は、少なくとも shell integration が使う UUID 指定の通常経路ではホットパスをオフメインに逃がしてあり、今回の Enter 直後ラグの主因ではなさそうです。TerminalController.swift:13541 TerminalController.swift:13645 TerminalController.swift:13699 > [!right-bubble] ![[minerva-face-right.webp]] > PRなんて興味ないのでその設定を無効化することで高速化できませんか? > [!left-bubble] ![[chappy.webp]] > Show Pull Requests in Sidebar を OFF にしても高速化しません。これは表示だけを消す設定で、shell integration 側の PR ポーリング停止には連動していません。cmuxApp.swift:3676 ContentView.swift:9634 > > 高速化したいなら、隠し設定の sidebarShellIntegration を false にして shell integration 全体を止めるのが効きます。cmux はこのフラグが true のときだけ shell integration を注入しています。 > GhosttyTerminalView.swift:2816 > > 安定版アプリならたぶんこれです。 > > defaults write com.cmuxterm.app sidebarShellIntegration -bool false > > その後、cmux を再起動してください。 > > 副作用はあります。cwd / git branch / PR / ports など、shell integration 由来の sidebar 情報更新が止まります。 > [!right-bubble] ![[minerva-face-right.webp]] > `defaults write com.cmuxterm.app sidebarShellIntegration -bool false` はどこに設定するのですか? > [!left-bubble] ![[chappy.webp]] > • ターミナルで1回実行すれば大丈夫です。~/.zshrc などに書くものではありません。 > > defaults write com.cmuxterm.app sidebarShellIntegration -bool false > > そのあと cmux を完全終了して起動し直してください。defaults は macOS の設定DBに保存されるので、毎回実行は不要です。 > > 確認するならこれです。 > > defaults read com.cmuxterm.app sidebarShellIntegration > > もし cmux DEV などデバッグ版を使っているなら bundle ID が別で、そちらは com.cmuxterm.app.debug です。 > [!right-bubble] ![[minerva-face-right.webp]] > 逆に .zshrc とかで設定を上書きすることで、PR関連のものだけ止められないですかね? > [!left-bubble] ![[chappy.webp]] > はい、できます。 > > 前提があります。 > > - `sidebarShellIntegration=false` のままだと `cmux-zsh-integration.zsh` 自体が読み込まれません。 > - `.zshrc` で上書きして止める方式を使うなら、`sidebarShellIntegration` は `true` に戻す必要があります。 > > 成立する理由はこれです。 > > - cmux は wrapper の `.zshenv` で `cmux-zsh-integration.zsh` を source します。[.zshenv](/Users/tadashi-aikawa/git/github.com/manaflow-ai/cmux/Resources/shell-integration/.zshenv#L42) > - そのあと通常どおりユーザーの `.zshrc` が読まれます。 > - なので `.zshrc` で `_cmux_*` 関数を再定義できます。 > > PR 関連だけ止めるなら、`.zshrc` にこれで足ります。 > > ```zsh > if [[ -n "${CMUX_SHELL_INTEGRATION_DIR:-}" ]]; then > _cmux_stop_pr_poll_loop 2>/dev/null || true > _CMUX_PR_POLL_PID="" > _CMUX_PR_FORCE=0 > > _cmux_start_pr_poll_loop() { return 0 } > _cmux_stop_pr_poll_loop() { return 0 } > _cmux_report_pr_for_path() { return 0 } > _cmux_clear_pr_for_panel() { return 0 } > fi > ``` > > これで止まるもの: > > - PR poll loop の開始 > - PR poll loop の停止処理 > - `gh pr view` による PR 取得 > - `report_pr` / `clear_pr` の送信 > > これで残るもの: > > - `cwd` 更新 > - Git branch / dirty 更新 > - `report_tty` > - `ports_kick` > - cmux 独自の `PATH` 補正 > > 注意点は1つです。 > > - すでに表示されている PR バッジは、その panel を作り直すまで残る可能性があります。 > > つまり、今回の目的には `.zshrc` 上書きで対応できます。 > しかも `sidebarShellIntegration=false` より粒度が細かいです。