Tmux 如何绑定键以切换到最后一个窗格,或者如果没有窗格,则切换到最后一个窗口?

Tmux 如何绑定键以切换到最后一个窗格,或者如果没有窗格,则切换到最后一个窗口?,tmux,Tmux,如果我在宽屏显示器上工作,我喜欢主要使用两个窗格,并使用C-a Ca在它们之间切换 如果我在使用方形显示器,我会使用两个窗口。我希望能够使用C-a C-a在它们之间切换,而无需更改我的tmux.conf我建议如下(调整80以区分两个端子的宽度) 但是我不是弄乱了语法,就是相关的tmux环境中没有设置COLUMNS,因为上面的shell表达式对我来说总是计算为false。如果您总是希望C-a 当活动窗口有多个窗格时,在窗格之间切换,以及 当活动窗口只有一个窗格时,在窗口之间切换 然后,您可以使

如果我在宽屏显示器上工作,我喜欢主要使用两个窗格,并使用
C-a Ca
在它们之间切换


如果我在使用方形显示器,我会使用两个窗口。我希望能够使用
C-a C-a
在它们之间切换,而无需更改我的
tmux.conf

我建议如下(调整80以区分两个端子的宽度)


但是我不是弄乱了语法,就是相关的
tmux
环境中没有设置
COLUMNS
,因为上面的shell表达式对我来说总是计算为false。

如果您总是希望C-a

  • 当活动窗口有多个窗格时,在窗格之间切换,以及
  • 当活动窗口只有一个窗格时,在窗口之间切换
然后,您可以使用计算活动窗口中窗格数的
if shell
,在
最后一个窗格
最后一个窗口
之间做出决定:

bind-key C-a if-shell 'test $(tmux list-panes | wc -l) -gt 1' 'last-pane' 'last-window'
在“宽”和“方形”配置之间切换时,重新排列窗格仍将由“您决定”(例如,通过
断开窗格
连接窗格



在tmux 1.8
中,如果shell
运行shell
进行格式扩展,那么您可以简单地使用shell命令:

bind-key C-a if-shell 'test #{window_panes} -gt 1' 'last-pane' 'last-window'

如果shell
运行shell
都是在服务器(不是任何特定会话或客户端)的上下文中运行的,那么它们将没有列(甚至没有std{in,out,err}上的tty)。您可以通过以下方式获得最近活动的客户机的宽度:
tmux-list-clients-F'{client\u activity}{client\u-width}sort-rn | head-1 | cut-d'-F
IIRC,
$COLUMNS
是一个bash变量,而不是一个环境变量;因此,在运行测试时,您需要确保封闭的shell是bash。而且,即使是这样,它也不一定会连接到用户在按键绑定时正在查看的同一个pty(或任何pty)。我想知道是否有一种不那么麻烦的方法来测试当前窗口是否有多个窗格。它确实应该是那些tmux变量中的一个,比如
{pane\u count}
,然后我们可以使用它的
{?,}
构造,而不是分叉一个shell,另一个tmux在管道中执行IPC和
wc-l
。不幸的是,我找不到所有tmux变量的完整列表。我知道至少有一个未记录的是
{pane\u current\u command}
,它非常方便。更新我找到了它,它是
{window\u panes}
,它是“窗口中的窗格数”。perfectcrap,这些条件可能只适用于状态字符串构建,而不适用于确定要运行的shell命令。当然可以避免使用管道连接到
wc-l
。@StevenLu:tmux 1.8支持在
if shell
(和
run shell
)中进行格式扩展,所以你可以在1.8中做到这一点:
绑定C-a if shell“test”{window u panes}-gt 1“last pane last window
。真的吗?我可以发送窗口值,而无需从shell调用
tmux
,即
if shell
shell run
可以插入这些变量?那太棒了。我确实是这样做的,这将是一个很好的优化如果你在一个缩放的窗格中,你想切换到最后一个窗口而不是同一个窗口中的最后一个窗格,你可以使用:
bind C-a if shell'test{window#u zoomed_flag}-eq 1-o{window u panes}-eq 1''last window last pane'
bind-key C-a if-shell 'test #{window_panes} -gt 1' 'last-pane' 'last-window'