如何不越过 tmux 中的窗格边缘

kla*_*aus 6 tmux

默认情况下,tmux 通过窗格的边缘。例如,假设有两个窗格,pane 1并且pane 2。假设您在pane 1并且您确实Ctrl+b ?pane 2。如果你再次这样做Ctrl+b ?,你会再次在pane 1。如何禁用该功能,以便当我从最后一个窗格导航时,哪儿也去不了?

meu*_*euh 6

这有点黑客,但可能对你来说已经足够了。从 2.3 版开始,您可以找到每个窗格边框的 x 和 y 坐标。例如,display -p #{pane_right}对于 80 列终端右侧边缘的窗格将是 79。如果您发出向右移动到下一个窗格的命令,而新窗格的pane_right例如是 39,那么您已向左移动,因此您需要使用 移回上一个窗格select-pane -l

您可以从 shell 脚本运行大多数 tmux 命令,因此mytmux在您的 PATH 中创建以下文件并使其可执行 ( chmod +x mytmux):

#!/bin/bash
# https://unix.stackexchange.com/a/451473/119298
restrict(){
        case $1 in
        U)  d=-U p=pane_top    cmp=-gt ;;
        D)  d=-D p=pane_bottom cmp=-lt ;;
        L)  d=-L p=pane_left   cmp=-gt ;;
        R)  d=-R p=pane_right  cmp=-lt ;;
        *)  exit 1 ;;
        esac
        old=$(tmux display -p "#{$p}")
        tmux select-pane "$d"
        new=$(tmux display -p "#{$p}")
        [ "$new" "$cmp" "$old" ] && tmux select-pane -l
        exit 0
}
case $1 in
-restrict)shift
        restrict "${1?direction}" ;;
esac
Run Code Online (Sandbox Code Playgroud)

然后在您的 中设置以下绑定~/.tmux.conf

bind-key -r -T prefix Up    run-shell 'mytmux -restrict U'
bind-key -r -T prefix Down  run-shell 'mytmux -restrict D'
bind-key -r -T prefix Left  run-shell 'mytmux -restrict L'
bind-key -r -T prefix Right run-shell 'mytmux -restrict R'
Run Code Online (Sandbox Code Playgroud)

例如,如果您想处理多个会话,则需要扩展它。