1つのサーバでtmuxを起動して、そこからいろんなサーバにsshする形でtmuxを使用しているが、ssh先で新たにペインがほしい時に、split-windowして、sshするのが面倒なので一発で行えるようにした。

まず、.zshrcに以下の設定をする。

autoload -Uz add-zsh-hook
function tmux_ssh_preexec() {
    local command=$1
    if [[ "$command" = *ssh* ]]; then
        tmux setenv TMUX_SSH_CMD_$(tmux display -p "#I") $command
    fi
}
add-zsh-hook preexec tmux_ssh_preexec

ssh を含むコマンドが実行された時に、tmux固有の環境変数にそのコマンドをTMUX_SSH_CMD_<ウィンドウ番号>という名前で保存する。

.tmux.confには以下の設定をする。

bind C-s run-shell 'tmux split-window -v "eval $(tmux display -p "$TMUX_SSH_CMD_#I"); exec $SHELL"'
bind C-v run-shell 'tmux split-window -h "eval $(tmux display -p "$TMUX_SSH_CMD_#I"); exec $SHELL"'
bind C-c run-shell 'tmux neww            "eval $(tmux display -p "$TMUX_SSH_CMD_#I"); exec $SHELL"'

これで例えばprefix C-sでウィンドウを横分割して、環境編集TMUX_SSH_CMD_<ウィンドウ番号>に保存されたsshコマンドを実行する。

ウィンドウ番号で環境変数を区別しているので、ウィンドウ内で複数のホストに接続している場合は最後のsshコマンドが実行されることになる。

ペイン番号で指定すれば、ペインごとに管理できそうだが、prefix C-sしてできたペインでもう一度prefix C-sしようとすると環境変数が空っぽでうまくいかないのでやめた。

run-shellで実行するとpreexecが呼ばれないためと思われる。

以下を参考にした。