tmuxは便利だけど、prefix + key の2ストロークが地味に煩わしい。Cmd+Tで新しいタブを開く感覚に慣れていると、毎回prefixを挟むのがもどかしくなる。
Ghosttyの keybind を使えば、Cmd+keyの1ストロークでtmuxの操作を実行できる。Chromeでタブを開くのと同じショートカットが、tmuxでもそのまま動く世界。
コピペで使えるテンプレートも用意した。Ghosttyの基本設定がまだの人は先にこちらから:
Ghostty入門|HashiCorp創業者が作った次世代ターミナルの設定ガイドMac仕組み: Ghostty keybind → tmux prefix
Ghosttyの keybind は、キー入力をインターセプトしてエスケープシーケンスをターミナルに送る仕組み。これを利用して、Cmd+keyを「tmux prefix + コマンド」に変換する。
例えば、Cmd+Tで新しいtmuxウィンドウを開く設定はこう。
# Ghostty config
keybind = cmd+t=text:\x13\x03
この1行の中身を分解すると:
\x13= Ctrl+S = tmux prefix\x03= Ctrl+C = tmuxのbind C-c new-windowに対応
Ghosttyがキー入力をインターセプトし、エスケープシーケンスとしてtmuxに渡す。tmuxから見ると「prefix → コマンドキー」が高速で連続入力されたように見えるので、通常のキーバインドとして処理される。
Chrome/IDEライクな設定テンプレート
以下のテンプレートをGhosttyとtmuxの設定にコピペすれば、ブラウザやIDEと同じショートカットでtmuxを操作できる。
| tmux操作 | Ghostty keybind | Chrome/IDE相当 | エスケープシーケンス |
|---|---|---|---|
| 新ウィンドウ | cmd+t | Cmd+T | \x13\x03 |
| ウィンドウ閉じる | cmd+w | Cmd+W | \x13\x78 |
| 次のウィンドウ | ctrl+tab | Ctrl+Tab | \x13\x6e |
| 前のウィンドウ | ctrl+shift+tab | Ctrl+Shift+Tab | \x13\x70 |
| ウィンドウ番号切替 | cmd+1-9 | Cmd+1-9 | \x13\x31-39 |
Ghostty側の設定
~/.config/ghostty/config に追加:
# --- tmux shortcuts ---
# 新ウィンドウ (Cmd+T)
keybind = cmd+t=text:\x13\x03
# ウィンドウを閉じる (Cmd+W)
keybind = cmd+w=text:\x13\x78
# 次のウィンドウ (Ctrl+Tab)
keybind = ctrl+tab=text:\x13\x6e
# 前のウィンドウ (Ctrl+Shift+Tab)
keybind = ctrl+shift+tab=text:\x13\x70
# ウィンドウ番号で切替 (Cmd+1-9)
keybind = cmd+1=text:\x13\x31
keybind = cmd+2=text:\x13\x32
keybind = cmd+3=text:\x13\x33
keybind = cmd+4=text:\x13\x34
keybind = cmd+5=text:\x13\x35
keybind = cmd+6=text:\x13\x36
keybind = cmd+7=text:\x13\x37
keybind = cmd+8=text:\x13\x38
keybind = cmd+9=text:\x13\x39
# --- 使わないGhosttyデフォルトを無効化 ---
keybind = cmd+n=unbind
keybind = cmd+d=unbind
tmux側の設定
~/.tmux.conf に追加:
# prefix を Ctrl+S に変更
set -g prefix C-s
unbind C-b
bind C-s send-prefix
# 新ウィンドウ (prefix + Ctrl+C)
bind C-c new-window
# ウィンドウを閉じる (prefix + x)
bind x confirm-before -p "kill window? (y/n)" kill-window
# 次/前のウィンドウ (prefix + n/p) ※デフォルトで設定済み
# ウィンドウ番号を1始まりに
set -g base-index 1
setw -g pane-base-index 1
エスケープシーケンスが暗号っぽく見えるけど、実態はtmuxデフォルトの prefix + n(次)/ prefix + p(前)をそのまま使っているだけ。
僕の追加設定
上のテンプレートに加えて、よく使うツールをCmdキーに割り当てている。
| tmux操作 | Ghostty keybind | エスケープシーケンス |
|---|---|---|
| fzf検索 | cmd+f | \x13\x66 |
| lazygit | cmd+g | \x13\x67 |
| yazi | cmd+e | \x13\x65 |
| nvim | cmd+n | \x13\x6e |
| シェル | cmd+enter | \x13\x0d |
| workmux管理 | cmd+d | \x13\x64 |
| workmuxダッシュボード | cmd+s | \x13\x01 |
tmux側:
# fzf検索をpopupで起動
bind f display-popup -E -w 80% -h 80% "fzf"
# lazygitをpopupで起動
bind g display-popup -E -w 90% -h 90% -d "#{pane_current_path}" "lazygit"
# yaziをpopupで起動
bind e display-popup -E -w 90% -h 90% -d "#{pane_current_path}" "yazi"
# nvimをpopupで起動
bind n display-popup -E -w 90% -h 90% -d "#{pane_current_path}" "nvim"
# シェルをpopupで起動
bind Enter display-popup -E -w 90% -h 90% -d "#{pane_current_path}" "$SHELL"
# workmux dispatch(prefix + d)
bind d run-shell "fish ~/.config/tmux/scripts/wma-dispatch.fish '#{pane_current_path}' '#{window_name}'"
# workmuxダッシュボード(prefix + Ctrl+A)
bind C-a display-popup -E -h 90% -w 90% "workmux dashboard"
Cmd+D はコンテキストに応じてpopupの中身が変わる。dispatchスクリプトが #{window_name} と .git ファイルの有無を見て、通常のディレクトリなら新規worktree作成画面(名前を入力 or 空Enterで自動命名)、workmuxウィンドウやgit worktree内なら merge / remove を選ぶ管理画面を出す。作成から片付けまで同じキーで完結する。
自分の場合、fzfはezaのアイコン表示 + batのプレビュー + git statusの優先表示を組み合わせて、ファイル一覧をリッチにしている。enterで相対パス、Ctrl+Aで絶対パスを現在のペインに送る設定にしておくと、パスの手入力がほぼなくなる。

tmux popupで起動するので、Claude Code CLIの実行中でもCmd+Fで呼び出せる。ファイルパスを聞かれたときにサッと検索して送れるのが地味に助かる。
この辺は好みで。自分がよく起動するツールをCmdキーに割り当てると、ランチャー感覚で使えて便利。
Ghostty + tmuxの開発環境を全体的に整えたい人はこちらも参考にどうぞ:
ターミナルの主役はClaude Code中心になった! Claude Codeファーストなターミナル構築開発tmux-which-key で覚えなくていい
tmuxにはデフォルトで大量のキーバインドがある。設定をカスタマイズしていると「あれ、デフォルトのバインドなんだっけ」となりがち。tmux-which-key を入れると、prefix + Space でキーバインドの一覧がポップアップ表示される。
# TPM (tmux Plugin Manager) でインストール
set -g @plugin 'alexwforsythe/tmux-which-key'
prefix + Space を押すと、カテゴリ分けされたキーバインド一覧が出る。tmuxのデフォルトバインドを全部覚えている人はそういないと思うので、困ったらとりあえずこれを開けばなんとかなる。
注意点
Ghosttyデフォルトとの競合
Ghosttyには cmd+n(新ウィンドウ)、cmd+d(分割)などのデフォルトキーバインドがある。text: で上書きしたキーはそのままtmuxに送られるけど、上書きしていないデフォルトキーバインドはGhosttyの動作が残る。
テンプレートでは cmd+n と cmd+d を unbind で無効化しているけど、Ghosttyのウィンドウ分割機能を普段から使っている人は外すといい。
tmux非使用時のトレードオフ
この設定はtmuxセッション内でのみ意味がある。tmuxを起動していない状態でCmd+Tを押しても、エスケープシーケンスがそのまま端末に送られるだけ。
対策は2つ:
- tmuxを常時起動する。シェル起動時に自動アタッチする設定を入れておけばいい
- Ghostty設定を使い分ける。tmux用と非tmux用のconfigを別ファイルにして切り替える
tmux-resurrectでセッション復元できるようにしておけば、再起動しても作業状態が戻ってくる安心感がある。自分にとってtmuxは常時起動が前提。
iTerm2でも同じことはできる、ただし面倒
同じ「CmdキーでtmuxをChromeのように操作する」をiTerm2でもやっていた時期がある。できることは同じだけど、設定の手間が段違い。
iTerm2の場合、Preferences → Profiles → Keys を開いて、「+」ボタンで1つずつGUIで追加していく。アクションに「Send Hex Code」を選んで、Hexコードを手入力する。
例えば Cmd+T で新ウィンドウを開くなら:
- Keyboard Shortcut に
Cmd+Tを入力 - Action で「Send Hex Code」を選択
0x02 0x6EのようなHexコードを入力
これを全ショートカット分、1個ずつ繰り返す。Cmd+1〜9のウィンドウ切替だけで9回。テンプレート全体だと15回以上のGUI操作が必要になる。
実際にiTerm2で同じことをやっていたけど、設定を追加・変更するたびにGUIを開くのが面倒で、dotfilesにも入れづらかった。Ghosttyに移行した理由の1つがこれ。
Ghosttyなら設定ファイルに1行書くだけ。コピペで共有できて、Gitで管理できて、差分も見える。
# Ghostty: 1行で完結
keybind = cmd+t=text:\x13\x03
# iTerm2: GUIで3ステップ
# 1. Preferences > Profiles > Keys > +
# 2. Keyboard Shortcut: Cmd+T
# 3. Action: Send Hex Code → 0x13 0x03
iTerm2でも.itermkeymapファイルとしてエクスポート/インポートはできるし、Dynamic Profilesを使えばJSON管理も可能。ただ、プライマリのワークフローがGUIである以上、「設定ファイルをテキストエディタで編集して終わり」のGhosttyとは快適さが違う。
まとめ
Ghosttyの keybind + text: エスケープシーケンスで、tmuxのprefix 2ストロークをCmd 1ストロークに圧縮できる。
ChromeやVS Codeと同じショートカットでターミナルを操作できるのは、思った以上に快適だった。テンプレートをベースに、自分のワークフローに合わせて好きにいじるといい。
Ghosttyの基本設定がまだの人はこちらから:
Ghostty入門|HashiCorp創業者が作った次世代ターミナルの設定ガイドMac