如何不切换到 tmux 中窗格的边缘

如何不切换到 tmux 中窗格的边缘

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

答案1

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

mytmux您可以从 shell 脚本运行大多数 tmux 命令,因此在 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

然后在您的中设置以下绑定~/.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'

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

答案2

默认情况下,键PrefixArrow的绑定方式如下

bind-key -r -T prefix       Up                select-pane -U
bind-key -r -T prefix       Down              select-pane -D
bind-key -r -T prefix       Left              select-pane -L
bind-key -r -T prefix       Right             select-pane -R

select-pane函数没有一个选项告诉它“当您到达该方向的最后一个窗格时不要循环”。

查看执行的源代码select-pane,看起来循环左/右和上/下是硬编码的,这意味着不太容易阻止它以这种方式运行。

相关内容