⌨️

tmuxを慣れ親しんだキーバインドで使う - Prefixキーに別れを告げる方法

に公開

はじめに

みなさん普段tmuxを使用しているでしょうか?

それともtmuxが気になっているけど、操作や概念が難しくてなかなか手を出せていないでしょうか?

昨今、Claude CodeなどのCLI型のエージェントコーディングツールにより、tmuxが話題に上がる機会が増えているように見受けられて、個人的には嬉しく思っています。

私自身、tmuxはツールの中で一番好きといえるほど愛用しているのですが、導入当初はキーバインドやコマンドに慣れるのに相当苦戦した経験があります。そのため、tmuxは初学者にとって扱いやすいツールとは言い難いと感じています。

tmuxを使っていて一番戸惑うのがCtrl+B prefixによる操作ではないでしょうか。

例えば、基本的な操作のキーバインドは以下になります。

  • 新しいタブを作成したいとき → Ctrl+Bc
  • タブを閉じたいとき → Ctrl+B&
  • ペインを分割したいとき → Ctrl+B% or "

一般的なターミナルアプリで慣れ親しんだCmd+Tでタブ作成、Cmd+Wでタブを閉じる、といった操作感とは大きく異なります。

そこで本記事では、ターミナルアプリのキーバインド設定を活用して、一般的なターミナルアプリと同じようなキーバインドでtmuxを操作する方法を紹介したいと思います。

tmuxのprefixキーでの操作が難しい理由

tmuxのCtrl+B prefixを伴う操作が難しい理由は、主に以下の点にあると思います

そもそもprefixキーを伴う操作が一般的ではない

tmuxでは基本的な操作を行う際にCtrl+Bを最初に押してから、もう1つのキーを押すことで所定の操作を行うことができます。

prefixキーを伴う操作として他には、Vim・GNU screenやVS CodeなどでCtrl+Kなどのprefixキーを使うシーンがありますが、
一般的なユーザーにとって、このようなprefixキーを伴う操作は馴染みが薄く、難しいと感じるのではないでしょうか。

tmuxのキー操作で覚えることが多い

tmuxの主要な操作だけでも、以下のようなキーバインドを覚える必要があります

  • Ctrl+Bc: 新しいウィンドウ
  • Ctrl+B&: ウィンドウを閉じる
  • Ctrl+B%: 垂直ペイン分割
  • Ctrl+B": 水平ペイン分割
  • Ctrl+B数字: ウィンドウ切り替え
  • Ctrl+Bp/n: ウィンドウ移動
  • Ctrl+B矢印: ペイン移動
  • Ctrl+B/: 検索

これらを覚えるのも大変ですし、慣れるまでに時間がかかってしまいます。

キー入力が2つ求められるのが煩わしい

そもそも論ですが、一般的な操作で2つのキー入力を求められるのが煩わしいと感じる人も一定数はいると思います。

解決策:ターミナルアプリでのキーバインド設定

この問題を解決する方法として、ターミナルアプリの設定でキーバインドをマッピングするという方法を紹介したいと思います。
一般的なターミナルアプリ(Alacritty、Wezterm、Ghosttyなど)には、特定のキーが押されたときに任意の文字列やキーシーケンスを送信する機能が備わっています。この機能を活用することで、馴染みのあるショートカットキーを任意のキーバインドにマッピングすることが可能になります。

この設定のいいところには以下があります。

  • tmux導入の障壁の一つであるキーボード操作の部分について、今までと同じような操作感を得られるため、操作慣れの部分のハードルを下げやすい
  • tmuxのキーバインドを覚える必要がない

実際に私はtmuxを愛用して2〜3年ほどになり、普段マウスは使わずキーボードで操作をしていますが、tmuxのデフォルトのキーバインドをほとんど覚えていないにも関わらず、それで困ったことはありません。

設定の段取り

例として、tmuxの新しいウィンドウ作成(Ctrl+Bc)のキーバインドをCmd+Tで操作できるようにすることを考えます。
今回、環境例は以下を前提に話していきます(他のソフトやOSでも設定ファイルやキーが少し変わるだけでメインは変わりません。)

  • ターミナルアプリ:Alacritty
  • OS: macOS

設定手順の流れは以下になります。

  1. 今回入力したいtmuxのキーバインド(Ctrl+B,c)のエスケープシーケンスを確認する
  2. ターミナルアプリの設定で、Cmd+Tが押されたときにCtrl+Bcのキーシーケンスを送信するように設定する

xxdコマンドでのエスケープシーケンスの確認

設定を行う前に、まずはtmuxのキー操作として送信したいエスケープシーケンスを確認する必要があります。

ここで、xxdコマンドを使うことで、キーの16進数表現を取得できます

実行後、実際にキーを押すとその16進数表現が表示されます

~ % xxd -psd
^Bc
02630a^C

上記はCtrl+BcEnterを順に押したときの結果です
それぞれ以下のように対応しています
02 → Ctrl+B
63 → c
0a → Enterキー
最後はCtrl+Cのキーでexitしたときのキーになります。

16進数の02は、ASCII制御文字のSTX(Start of Text)に対応しており、これはCtrl+Bのキーコードです。Unicodeエスケープシーケンスでは\u0002として表現されます。
一方、通常の文字c(16進数で63)については、Unicodeエスケープ(\u0063)を使う必要はありません。多くのターミナル設定では、印刷可能な文字はそのまま文字として記述できるためです。
上記から、新しいウィンドウを作成するCtrl+Bcのエスケープシーケンスは\u0002cとなります。

ターミナルでの設定方法

Alacritty

Alacrittyの設定ファイル(~/.config/alacritty/alacritty.toml)に以下の設定を追加します

# tmux用のキーバインド設定
[[keyboard.bindings]]
# Cmd+T: 新しいウィンドウ作成 (Ctrl+B → c)
chars = "\u0002c"
key = "T"
mods = "Command"

その他のキーバインド設定例

上記の基本的な設定に加えて、例えば以下のような追加のキーバインドを設定することで、より便利にtmuxを操作できます。

# Cmd+W: ウィンドウを閉じる (Ctrl+B → &)
[[keyboard.bindings]]
chars = "\u0002&"
key = "W"
mods = "Command"

# Cmd+D: 垂直ペイン分割 (Ctrl+B → %)
[[keyboard.bindings]]
chars = "\u0002%"
key = "D"
mods = "Command"

# Cmd+Shift+D: 水平ペイン分割 (Ctrl+B → ")
[[keyboard.bindings]]
chars = "\u0002\""
key = "D"
mods = "Command|Shift"

# タブ切り替え(Cmd+1〜3)
[[keyboard.bindings]]
chars = "\u00021"
key = "Key1"
mods = "Command"

[[keyboard.bindings]]
chars = "\u00022"
key = "Key2"
mods = "Command"

[[keyboard.bindings]]
chars = "\u00023"
key = "Key3"
mods = "Command"

# Cmd+F: 検索 (Ctrl+B → ctrl + f) ※カスタムコマンド
[[keyboard.bindings]]
chars = "\u0002/"
key = "F"
mods = "Command"

応用:ペイン内の検索について

tmuxのペイン内の検索するには、Ctrl+B[を押したときに入れるコピーモードと呼ばれるモードに入ったうえで、/ or ?を押すという、2回の操作を行う必要があります。
デフォルトでは、コピーモードに入る→検索を一連で行うキーバインドは設定されていません。

そこで、検索についてはtmux側でも設定を加えることで、一発で検索を行えるような設定を行っています。

流れは以下になります。

  1. tmux側(tmux.conf)で、コピーモードに入る→検索を一連で行うキーバインドをカスタムで設定する
    # tmux.confに以下を追加
    # prefix(`Ctrl+B`) → `Ctrl+F`のキーバインドに割り当てています
    bind c-f copy-mode \
      "\;" command-prompt -T search -p "(search up)" { send-keys -X search-backward "%%" }
    
    
  2. 上記のtmuxのキーバインドに割り当てたキーシークエンスをターミナルアプリの設定に追加する

今回は、Cmd+F(ターミナル) => Ctrl+BCtrl+F(tmux)とマッピングされるように設定することで、カスタムで設定したキーバインドを一発で検索できるようにしています。

主要操作のマッピング一覧

設定により実現できる主要な操作は以下の通りです

キーバインド tmuxコマンド 機能
Cmd+T Ctrl+Bc 新しいウィンドウ作成
Cmd+W Ctrl+B& ウィンドウを閉じる
Cmd+D Ctrl+B% 垂直ペイン分割
Cmd+Shift+D Ctrl+B" 水平ペイン分割
Cmd+1〜3 Ctrl+B1〜3 ウィンドウ切り替え
Cmd+[ Ctrl+Bp 前のウィンドウ
Cmd+] Ctrl+Bn 次のウィンドウ
Cmd+F Ctrl+BCtrl+F(※カスタム) 検索

この設定により、普段慣れ親しんだキーバインドでtmuxを操作できるようになります。

上記は代表例ですが、慣れると他のコマンドにも色々設定すると良いと思います。

注意点

以上のようにtmuxを扱いやすく設定手段を挙げましたが、少しだけ注意点があります。

注意点1: ターミナル固有の設定

各ターミナルアプリには独自のキーバインド設定があります。設定を追加する際は、既存の設定と重複しないよう注意が必要です。

注意点2: tmux以外での動作

この設定はターミナル全体に適用されているため、Cmd+Tなどのキーを押すと、対応するtmuxコマンドが送信されてしまいます。

特に困る例としては、tmux上でvimを起動する場合だと、キーバインドがバッティングしてしまうことがあるかもしれないです。(キーバインドが足りない・・・)

私自身はvimをメインエディタとして使用していないのですが、それでもvim使用時にバッティングしてしまうことがありキーバインド設定に悩むことが何回かあるため、vimなどのCLIエディタをメインで使用している方にとっては、少し注意かもしれないです。(なにかよいソリューションをあれば教えてほしいです。)

まとめ

本記事では、ターミナルアプリの設定を活用して、tmuxを慣れ親しんだキーバインドで操作する方法を紹介しました。

この設定により、Ctrl+B prefixを意識することなく、一般的なターミナルアプリと同じような操作感でtmuxを使用できるようになります。

tmuxのハードルが高いと感じている方や、prefix操作に慣れるまでが大変だと思っている方の参考になれば嬉しいです。

もし他にも便利な設定や改善点などありましたら、コメントいただけると嬉しいです!

GitHubで編集を提案

Discussion