TLDR
Mac上でGhosttyとZellijを併用して下記のことが実現できた
- quick-terminalでtabを利用
- paneを枠線で囲む
- emacs風のカーソル操作
左半分はClaude Codeをおいています。右半分は上からvite, firestore emulator, storybookを並べています。
Ghosttyの設定ファイル
## Zellij用に無効化
# cmd+[,] pane間の移動用
keybind = super+bracket_left=unbind
keybind = super+bracket_right=unbind
# cmd+t,w tabを開閉
keybind = super+t=unbind
keybind = super+w=unbind
# cmd+d, shift+d paneを開く
keybind = super+d=unbind
keybind = super+shift+d=unbind
# cmd+1,...,9 tab間の移動
keybind = super+1=unbind
keybind = super+2=unbind
keybind = super+3=unbind
keybind = super+4=unbind
keybind = super+5=unbind
keybind = super+6=unbind
keybind = super+7=unbind
keybind = super+8=unbind
keybind = super+9=unbind
keybind = super+digit_1=unbind
keybind = super+digit_2=unbind
keybind = super+digit_3=unbind
keybind = super+digit_4=unbind
keybind = super+digit_5=unbind
keybind = super+digit_6=unbind
keybind = super+digit_7=unbind
keybind = super+digit_8=unbind
keybind = super+digit_9=unbind
## Zellij用にoptをaltとして扱う
macos-option-as-alt = true
## quick-terminal
# opt+spaceで開閉
keybind = global:opt+space=toggle_quick_terminal
# スタイル設定
quick-terminal-position = top
quick-terminal-animation-duration = 0.2
quick-terminal-screen = main
quick-terminal-size = 100%
## この辺は見た目なのでお好みで
theme = Nord Wave
cursor-style = bar
macos-titlebar-style = hidden
Zellijの設定ファイル
keybinds {
shared {
// emacs風のカーソル操作とモード変更が重複するため無効化
unbind "Ctrl n" "Ctrl p" "Ctrl b" "Ctrl h" "Ctrl t" "Ctrl s" "Ctrl o" "Ctrl g"
// defaultのキーバインドのうちあとで設定するものと重複するものを無効化
unbind "Alt n" "Alt Left" "Alt Right" "Alt Up" "Alt Down" "Alt h" "Alt j" "Alt k" "Alt l"
// paneの名前変更ができるように
bind "Alt p" { SwitchToMode "RenamePane"; PaneNameInput 0; }
// tabの名前変更ができるように
bind "Alt t" { SwitchToMode "RenameTab"; TabNameInput 0; }
// cmd+[,] pane間の移動
bind "Super [" { FocusPreviousPane; }
bind "Super ]" { FocusNextPane; }
// cmd+d,shift+d paneの作成
bind "Super d" { NewPane "right"; }
bind "Shift Super d" { NewPane "down"; }
// cmd+t,w tabを開閉
bind "Super t" { NewTab; }
bind "Super w" { CloseFocus; }
// cmd+1,...,9 tab間の移動
bind "Super 1" { GoToTab 1; }
bind "Super 2" { GoToTab 2; }
bind "Super 3" { GoToTab 3; }
bind "Super 4" { GoToTab 4; }
bind "Super 5" { GoToTab 5; }
bind "Super 6" { GoToTab 6; }
bind "Super 7" { GoToTab 7; }
bind "Super 8" { GoToTab 8; }
bind "Super 9" { GoToTab 9; }
}
}
// この辺は見た目なので好みで
theme "ao"
show_startup_tips false
Ghosttyとは
2024年末あたりから話題になっているターミナルエミュレータ。動作が軽いことで評判です。
iterm2から乗り換えるモチベーションは設定がシンプルであることです。
- iterm2: ネストされたタブが大量にあるGUIの設定画面。自由度が高い反面複雑
- Ghostty: GUIの設定画面は持たず、Configファイル1つで設定を管理
iterm2の操作感に似ており、乗り換えコストも低めです。
Zellijとは
Rust製のターミナルマルチプレクサ(tmuxやscreenと同じカテゴリ)。ターミナルを閉じてもセッションがバックグラウンドで維持されるため、誤ってターミナルを閉じても作業中の状態を失わずに復帰できます。
Zellijを導入するモチベーションは、tabとpaneがイケてる(好み)ということです。
Tab機能
Ghosttyにもtab機能はありますが、以下の制約があります。
- tab名を自由に変更できない
- quick-terminal(オーバーレイ表示されるターミナル)でtabがサポートされていない
これらに対応するPRはありますが、まだリリースされていません(2026年2月5日現在)。
Zellijならtab名を自由に変更可能です。Ghosttyのquick-terminal内でZellijのtab機能を使えば、オーバーレイ表示 + tab が実現できます。
Pane機能
Ghosttyにも「split」というpane相当の機能はありますが、こちらも制約があります。
- pane名を変更できない
- カスタマイズは境界線の色の指定程度に限られる
Zellijならpane名を変更可能。なによりpaneを枠線で囲んでいるデザインがイイ(好み)。
併用のための設定変更
目指す姿
- Ghosttyのquick-terminal上でZellijのtab/pane機能を使う
- tab/paneの操作感はiterm2やVSCodeなど使い慣れたツールに寄せる
- デザインはGhosttyとZellijのthemeからイイ感じのものを選ぶ
Ghosttyの設定
tab/paneのキーバインドを無効化する
tab/paneはZellijのものを使うため、Ghosttyデフォルトのキーバインドを無効化してZellijにキー入力を渡せるようにします。無効化しないとGhostty側が先にキー入力を処理してしまい、Zellijにキーが届きません。
# cmd+[,] pane間の移動用
keybind = super+bracket_left=unbind
keybind = super+bracket_right=unbind
# cmd+t,w tabを開閉
keybind = super+t=unbind
keybind = super+w=unbind
# cmd+d, shift+d paneを開く
keybind = super+d=unbind
keybind = super+shift+d=unbind
# cmd+1,...,9 tab間の移動
keybind = super+1=unbind
keybind = super+2=unbind
keybind = super+3=unbind
keybind = super+4=unbind
keybind = super+5=unbind
keybind = super+6=unbind
keybind = super+7=unbind
keybind = super+8=unbind
keybind = super+9=unbind
keybind = super+digit_1=unbind
keybind = super+digit_2=unbind
keybind = super+digit_3=unbind
keybind = super+digit_4=unbind
keybind = super+digit_5=unbind
keybind = super+digit_6=unbind
keybind = super+digit_7=unbind
keybind = super+digit_8=unbind
keybind = super+digit_9=unbind
super+1だけでなくsuper+digit_1も設定しないと無効化できません。
リリース後に項目名が変更になったらしく、混乱したユーザー(自分もその一人)がdiscussionやissueとして報告しています。
OptionキーをAltとして扱う
ZellijのキーバインドではAltキーを使いますが、macOSのOptionキーはデフォルトでは特殊文字入力用のmodifierとして扱われます。この設定でOptionキーをAltとして認識させ、Zellijのキーバインドが機能するようにします。
macos-option-as-alt = true
quick-terminalを設定する
Ghosttyのquick-terminal機能でオーバーレイ表示されるターミナルを有効にします。この中でZellijを起動することで、オーバーレイ表示とtab/pane管理を両立させます。
keybind = global:opt+space=toggle_quick_terminal
quick-terminal-position = top
quick-terminal-animation-duration = 0.2
quick-terminal-screen = main
quick-terminal-size = 100%
見た目を設定する
テーマやカーソルスタイルなど、見た目に関する設定です。お好みで選んでください。
theme = Nord Wave
cursor-style = bar
macos-titlebar-style = hidden
Zellijの設定
ドキュメント通りに進めるとデフォルト設定がファイルに書き出されます。
mkdir ~/.config/zellij
zellij setup --dump-config > ~/.config/zellij/config.kdl
個人的にはよくわからない設定が並ぶのは好みではないので、真っさらな状態から必要なものだけ書く方針にしました。以下のキーバインド設定はすべてkeybinds { shared { ... } }ブロック内に記述します。
モード切替のキーバインドを無効化する
ZellijのデフォルトではCtrl+*でモードを切り替えますが、これがEmacs風カーソル操作と競合します。
| キー | Zellijデフォルト | Emacs操作 |
|---|---|---|
Ctrl+N |
Resizeモード | 次の行へ移動 |
Ctrl+P |
Paneモード | 前の行へ移動 |
Ctrl+B |
Tmuxモード | 1文字後退 |
Ctrl+H |
Moveモード | バックスペース |
Ctrl+T |
Tabモード | 文字の入替 |
Ctrl+S |
Searchモード | 前方検索 |
Ctrl+O |
Sessionモード | 行の挿入 |
Ctrl+G |
Lockモード | キャンセル |
Emacs風のカーソル操作はシェルやエディタで日常的に使うため、これらのモード切替をすべてunbindします。
unbind "Ctrl n" "Ctrl p" "Ctrl b" "Ctrl h" "Ctrl t" "Ctrl s" "Ctrl o" "Ctrl g"
モード切り替えのキーバインドを無効化することでZellijのいろいろな便利機能が使えなくなっています。今回は見た目が好きで導入したため問題なく使用できていますが、機能を活用したい場合はunbindした上で別のキーバインドを設定してください。
デフォルトのAltキーバインドを無効化する
ZellijデフォルトのAlt系キーバインドが、後述するtab/pane操作やリネームのキーバインドと競合するため無効化します。
unbind "Alt n" "Alt Left" "Alt Right" "Alt Up" "Alt Down" "Alt h" "Alt j" "Alt k" "Alt l"
tab操作のキーバインドを設定する
iterm2やVSCodeと同じ感覚でtabを操作できるようにします。
bind "Super t" { NewTab; }
bind "Super w" { CloseFocus; }
bind "Super 1" { GoToTab 1; }
bind "Super 2" { GoToTab 2; }
bind "Super 3" { GoToTab 3; }
bind "Super 4" { GoToTab 4; }
bind "Super 5" { GoToTab 5; }
bind "Super 6" { GoToTab 6; }
bind "Super 7" { GoToTab 7; }
bind "Super 8" { GoToTab 8; }
bind "Super 9" { GoToTab 9; }
pane操作のキーバインドを設定する
こちらもiterm2やVSCodeに寄せた操作感にします。
bind "Super d" { NewPane "right"; }
bind "Shift Super d" { NewPane "down"; }
bind "Super [" { FocusPreviousPane; }
bind "Super ]" { FocusNextPane; }
tab/paneの名前を変更できるようにする
Zellijの強みであるtab/paneの名前変更機能を使えるようにします。何のプロセスが動いているかをひと目で把握できるようになります。
bind "Alt p" { SwitchToMode "RenamePane"; PaneNameInput 0; }
bind "Alt t" { SwitchToMode "RenameTab"; TabNameInput 0; }
見た目を設定する
テーマなど見た目に関する設定です。お好みで選んでください。これらはkeybindsブロックの外に記述します。
theme "ao"
show_startup_tips false
これから
Zellijのテーマを設定してみたものの、まだ以下の点が気になっています
- Tabを表示しているribbonの形をもっと丸くしたい
- Paneをリサイズする際の段階をもう少し細かくしたい
- Paneの垂直方向のリサイズをしたい
まだまだ使い始めたばかりなので、今後の課題としたいと思います
