JavaScriptを有効にしてください

【tmux + zsh】Ctrl-Dでセッションをdetachする

 ·  ☕ 2 min read

はじめに

  • 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を見てくだされ
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 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
共有

YuWd (Yuiga Wada)
著者
YuWd (Yuiga Wada)
機械学習・競プロ・iOS・Web