MacでGhostty+Zellijをキーが衝突しないように使いたい

Table of Contents

きっかけ

最近Claude Codeでの開発が増えたので、ターミナル環境を整備しようと思った。
そこでモダンなGhosttyZellijにしようと思ったが、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のおかげでだいぶ楽な時代になったと感じる。

関連記事


  1. Zellijを快適に使うためのエイリアス・関数集
  2. GhosttyやClaude Codeで完了通知に使われているOSCとは
  3. Macのzsh上でFn-Deleteが動作しない問題
  4. rmコマンドとmvコマンドの事故に備えた安全な使い方
  5. Tera Termのマクロで、パスワードを扱う操作を自動化する
  6. 主要なAIエージェントフレームワークのリンク集
  7. StreamlitのアプリをPyInstaller+GitHub Actionsでビルドする