Ghostty × tmux CmdキーだけでtmuxをChromeのように操作する設定テンプレート

Mac

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 keybindChrome/IDE相当エスケープシーケンス
新ウィンドウcmd+tCmd+T\x13\x03
ウィンドウ閉じるcmd+wCmd+W\x13\x78
次のウィンドウctrl+tabCtrl+Tab\x13\x6e
前のウィンドウctrl+shift+tabCtrl+Shift+Tab\x13\x70
ウィンドウ番号切替cmd+1-9Cmd+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
lazygitcmd+g\x13\x67
yazicmd+e\x13\x65
nvimcmd+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でfzfファイル検索。git変更ファイルが上部に優先表示され、右側にbatプレビューが出る

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+ncmd+dunbind で無効化しているけど、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 で新ウィンドウを開くなら:

  1. Keyboard Shortcut に Cmd+T を入力
  2. Action で「Send Hex Code」を選択
  3. 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
Thanks for reading!
GhosttytmuxキーバインドMacショートカット