【tmux + zsh】Ctrl-Dでセッションをdetachする
はじめに
tmuxとは俗に言うターミナルマルチプレクサ(Terminal Multiplexer) のこと.
terminalを複数のセッション, ウィンドウ, ペインに分割して使用することができる代物である.
ターミナルを終了してもセッションは維持されるので, sshで学習を回す際に便利である.
tmuxでは通常のC-dでセッションがexitされてしまうのだが, これがあまり気に食わない.
そこで, C-dはセッションをdetachするようにして, 代わりのキー(例えばC-w)でexitするようにしたい
実はzshなら簡単にできるんです
前提
zshにはZsh Line Editor(ZLE)というキーバインドをイジれる機能がある
キーバインドに登録するものをWidgetと呼び, shell scriptの関数と紐付けることができる
つまり, Key-Binding ← ZLE Widget ← function
このZLE Widgetを使って, キーバインドをいじっていきましょう!
本題
tmuxはセッションを立ち上げると, 当然~/.zshrcを読みに行く.
そこで~/.zshrcにキーバインドの設定を記述していく.
tmuxのセッション上では環境変数$TMUXが格納されるので, コイツの有無でtmux内部かどうかを判別する
C-dをdetachに切り替える
zle -N _delete_or_detach で関数 _delete_or_detach をZLE Widgetに登録
bindkey "^D" _delete_or_detach でキーバインド"Ctrl-d"を _delete_or_detachと紐付けることができる
セッションのdetachはtmux detach-clientでOK
C-wをexitに切り替える
上と同じ流れで記述すれば良い.
セッションの終了をどう処理するかがやや難点だが, tmux display-message -p '#S'でセッション名が取ってこれるので, これを $sid として, tmux kill-session -t $sid すれば良い
まとめ
以下のスニペットを~/.zshrcに追記すればOK
具体例は私のドットファイルをまとめたdotzshを見てくだされ code:sample.sh
# for tmux
function _delete_or_detach() {
if -n "${BUFFER}"
then
zle delete-char-or-list
else
tmux detach-client
fi
}
function _kill_current_session() {
sid=tmux display-message -p '#S'
tmux kill-session -t $sid
}
# makes C-d to detach tmux
if -n "$TMUX"
then
setopt ignoreeof
zle -N _delete_or_detach
zle -N _kill_current_session
bindkey "^D" _delete_or_detach
bindkey "^W" _kill_current_session
fi