概要
tmuxのセッション切り替えをfzfでサクッとやりたくて、fzfを直接使う1行の設定で実現した。
fzfとは
fzfは汎用のコマンドラインファジーファインダー。実行するとターミナル上にモーダルダイアログのようなUIが表示され、標準入力から受け取った行のリストをインタラクティブに絞り込んで選択できる。名前の通りファジー検索に対応しており、完全一致でなくても部分的な文字列で候補が絞り込まれる。シェルのパイプと組み合わせて使うのが基本で、ファイル選択、コマンド履歴検索、プロセス選択など、「一覧から1つ選ぶ」操作ならなんでも使える。
インストールはapt install fzf(Ubuntu)やbrew install fzf(macOS)で入る。
fzfワンライナーで解決
最終的にたどり着いたのがこれ。
# Session switcher with fzf (prefix + o)
bind-key o display-popup -E "tmux list-sessions -F '#{session_name}' | fzf --reverse --header='Switch session' | xargs -r tmux switch-client -t"1行。これだけでセッション切り替えが実現できる。
実際の動作はこんな感じ。prefix + oを押すとポップアップが開き、fzfでセッションを選んで切り替えられる。

ワンライナーの仕組み
パイプで4つのコマンドをつないでいる。
display-popup -Eはtmuxのポップアップウィンドウを表示するコマンド。-Eオプションでコマンド終了時にポップアップが閉じる。
tmux list-sessions -F '#{session_name}'でセッション名の一覧を取得する。-Fでフォーマットを指定して、セッション名だけを1行1セッションで出力させている。
fzf --reverse --header='Switch session'でインタラクティブに選択する。--reverseはリストを上から表示するオプション。--headerで見出しテキストを表示している。
xargs -r tmux switch-client -tで選択したセッションに切り替える。-rオプションは、fzfでEscを押して何も選ばなかった場合にtmux switch-clientを実行しないようにするためのもの。
最終的な.tmux.conf
set-window-option -g mode-keys vi
set -g set-clipboard on
set -g allow-passthrough on
# Session switcher with fzf (prefix + o)
bind-key o display-popup -E "tmux list-sessions -F '#{session_name}' | fzf --reverse --header='Switch session' | xargs -r tmux switch-client -t"使い方はCtrl+b → oでセッション一覧がfzfで表示され、選んでEnterで切り替え。Escでキャンセル。
余談
tmux-sessionxはSSH経由のWSL2環境で試して動かなかった。ローカルのターミナルで直接tmuxを使っている環境なら普通に動くのかもしれないが、自分の環境はmacOSからSSH/mosh経由でWSL2に接続してtmuxを使っているので、そのあたりが影響していた可能性がある。原因の切り分けに時間をかけるよりfzfワンライナーで解決できたので、tmux-sessionxの調査はそこで打ち切った。