0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

GhosttyとZellijでイケてるターミナルを目指す

Posted at

TLDR

Mac上でGhosttyとZellijを併用して下記のことが実現できた

  • quick-terminalでtabを利用
  • paneを枠線で囲む
  • emacs風のカーソル操作

スクリーンショット 2026-02-05 17.22.19.png

左半分は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の垂直方向のリサイズをしたい

まだまだ使い始めたばかりなので、今後の課題としたいと思います

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?