MacでGhostty+Zellijをキーが衝突しないように使いたい
きっかけ
最近Claude Codeでの開発が増えたので、ターミナル環境を整備しようと思った。
そこでモダンなGhosttyとZellijにしようと思ったが、Zellijはターミナルで使うキーとの衝突が多いのが気になってしまった。
そんなわけでいろいろと試行錯誤したところ、自分にしっくりくる設定を見つけたのでメモしておく。
コンセプト
既存のキーアサインはできるだけそのままにして、ZellijではLockモードをメインに使う。
そしてLockモード切替やタブ・ペイン移動には、既存のアプリやターミナルと衝突しないようなキーを設定する。
設定内容
Ghostty
Settingsに以下を追記する。
macos-option-as-alt = left
keybind = cmd+alt+left=text:\x1b[1;11D
keybind = cmd+alt+right=text:\x1b[1;11C
keybind = cmd+alt+up=text:\x1b[1;11A
keybind = cmd+alt+down=text:\x1b[1;11B
keybind = ctrl+cmd+left=goto_split:left
keybind = ctrl+cmd+right=goto_split:right
Zellij
こちらはパッチ形式で。
--- /Users/tosi/.config/zellij/config.kdl.bak 2026-01-19 12:17:07
+++ /Users/tosi/.config/zellij/config.kdl 2026-01-19 12:17:07
@@ -1,6 +1,14 @@
keybinds clear-defaults=true {
locked {
- bind "Ctrl g" { SwitchToMode "normal"; }
+ bind "Alt Super z" { SwitchToMode "normal"; }
+ bind "Alt Super left" { MoveFocusOrTab "left"; }
+ bind "Alt Super down" { MoveFocus "down"; }
+ bind "Alt Super up" { MoveFocus "up"; }
+ bind "Alt Super right" { MoveFocusOrTab "right"; }
+ bind "Alt Super f" { ToggleFloatingPanes; }
+ bind "Alt Super ," { Resize "Increase"; }
+ bind "Alt Super ." { Resize "Decrease"; }
+ bind "Alt Super p" { NewPane; }
}
pane {
bind "left" { MoveFocus "left"; }
@@ -134,17 +142,17 @@
}
}
shared_except "locked" {
- bind "Alt left" { MoveFocusOrTab "left"; }
- bind "Alt down" { MoveFocus "down"; }
- bind "Alt up" { MoveFocus "up"; }
- bind "Alt right" { MoveFocusOrTab "right"; }
+ bind "Alt Super left" { MoveFocusOrTab "left"; }
+ bind "Alt Super down" { MoveFocus "down"; }
+ bind "Alt Super up" { MoveFocus "up"; }
+ bind "Alt Super right" { MoveFocusOrTab "right"; }
bind "Alt +" { Resize "Increase"; }
bind "Alt -" { Resize "Decrease"; }
bind "Alt =" { Resize "Increase"; }
bind "Alt [" { PreviousSwapLayout; }
bind "Alt ]" { NextSwapLayout; }
bind "Alt f" { ToggleFloatingPanes; }
- bind "Ctrl g" { SwitchToMode "locked"; }
+ bind "Alt Super z" { SwitchToMode "locked"; }
bind "Alt h" { MoveFocusOrTab "left"; }
bind "Alt i" { MoveTab "left"; }
bind "Alt j" { MoveFocus "down"; }
@@ -287,7 +295,7 @@
// Choose the base input mode of zellij.
// Default: normal
//
-// default_mode "locked"
+default_mode "locked"
// Choose the path to the default shell that zellij will use for opening new panes
// Default: $SHELL
MacOS
~/Library/KeyBindings/DefaultKeyBinding.dict
{
"@^\UF702" = "noop";
"@^\UF703" = "noop";
}
設定内容の個別解説
Alt(Option)キーが使えるようにする
Ghosttyは、デフォルトではAlt(Option)キーがMetaキーとして送信されないようになっている。
Ghosttyの設定
macos-option-as-alt = left
Pane/Tab移動のキー割り当てを変更する
デフォルトでは、Pane/Tab移動はAlt + →とAlt + ←に割り当てられている。
しかしMacではこれらは単語単位のカーソル移動に割り当てられているため、キー設定がコンフリクトしてしまう。
したがってこれを回避するため、Alt + Cmd + カーソルをPane/Tab移動に割り当てる。
Zellijの設定
shared_except "locked"に定義されているデフォルト設定を以下の様に変更する。
shared_except "locked" {
- bind "Alt left" { MoveFocusOrTab "left"; }
- bind "Alt down" { MoveFocus "down"; }
- bind "Alt up" { MoveFocus "up"; }
- bind "Alt right" { MoveFocusOrTab "right"; }
+ bind "Alt Super left" { MoveFocusOrTab "left"; }
+ bind "Alt Super down" { MoveFocus "down"; }
+ bind "Alt Super up" { MoveFocus "up"; }
+ bind "Alt Super right" { MoveFocusOrTab "right"; }
Ghosttyの設定
以下の設定をすることでCmd + Alt + カーソルのときにエスケープシーケンスが送信できるようにする。
keybind = cmd+alt+left=text:\x1b[1;11D
keybind = cmd+alt+right=text:\x1b[1;11C
keybind = cmd+alt+up=text:\x1b[1;11A
keybind = cmd+alt+down=text:\x1b[1;11B
左右だけで十分かもしれないが、せっかくなので一応上下についても設定している。
Lockモードの切替キーを変更する
デフォルトのLockモード切替キーCtrl + gも、シェルやEmacsなどの操作とコンフリクトしている。
そのためlockedの設定を以下のように変更した。
Zellijの設定
locked {
- bind "Ctrl g" { SwitchToMode "normal"; }
+ bind "Alt Super z" { SwitchToMode "normal"; }
さらにshared_except "locked"の方も以下のように変更した。
Zellijの設定
- bind "Ctrl g" { SwitchToMode "locked"; }
+ bind "Alt Super z" { SwitchToMode "locked"; }
LockモードでもPane/Tabを操作できるようにする
Lockモードをメインで利用する際、PaneとTabはある程度操作できたほうが快適だと思い、以下を追加した。
Zellijの設定 まずはデフォルトをLockモードに。
-// default_mode "locked"
+default_mode "locked"
さらにTabとPane操作するためのキーバインドを追加。
+ bind "Alt Super left" { MoveFocusOrTab "left"; }
+ bind "Alt Super down" { MoveFocus "down"; }
+ bind "Alt Super up" { MoveFocus "up"; }
+ bind "Alt Super right" { MoveFocusOrTab "right"; }
+ bind "Alt Super f" { ToggleFloatingPanes; }
+ bind "Alt Super ," { Resize "Increase"; }
+ bind "Alt Super ." { Resize "Decrease"; }
+ bind "Alt Super p" { NewPane; }
下3つはサイズ変更やPane追加ができるように。
Normalモードとはキーアサインが違うけど、まぁ直感的に操作できそうかなと。
IncreaseはAlt Super +にしちゃうとShiftキーが大変になるので、別のキーにずらしている。
Ghosttyの分割も移動できるようにする
Claude CodeはデフォルトでOSC 9のエスケープシーケンスを使っているようだ。
しかしこれらについて、Zellijは今のところサポートしていない模様。
そこで、Claude CodeのみGhosttyで直接起動する方法を考えた。 Ghosttyに以下の設定を追加する。
keybind = ctrl+cmd+left=goto_split:left
keybind = ctrl+cmd+right=goto_split:right
こうすればCmd + DでGhosttyレベルで分割でき、左右に移動することもできる。
そしてGhosttyの通知の仕組みが動作する。
ただしこれを行うとなぜかMac OSのビープ音(?)が鳴ってしまう。
これについてはGhosttyのとあるDiscussionsによると、~/Library/KeyBindings/DefaultKeyBinding.dictに以下を記載すれば抑制できるようだ。
{
"@^\UF702" = "noop";
"@^\UF703" = "noop";
}
感想
昔はscreenでprefixキーをCtrl+zにして使っていたので、普段は気にせず使うことができた。
そのためZellijのNormalモードはかなり辛いと感じたが、Lockモードをメインで使えば乗り切れそうだということがわかった。
screenよりもマウスでの操作(Tab/Pane切り替え、スクロールやコピペ)などが可能な面では優れているので、体験は大きく向上しそうだ。
元々マウス操作を使うと疲労しやすいのだが、これを使えば疲労が軽減できそうだと感じるものが出来たと思う。
新しいツールの設定はなかなかコンフィグが大変だが、生成AIのおかげでだいぶ楽な時代になったと感じる。