这个问题(据我所知)以前没有被问过,但会让使用 tmux 的任何人受益!我也尝试在 github 上搜索插件等,但还没有成功。
我想实现的目标:
- 在同名窗口之间循环。
为什么?
假设您有 6 个 tmux 窗口,按以下顺序排列,状态栏看起来与此类似:
[0:zsh][1:vim][2:zsh][3:vim][4:zsh][5:vim]
如果我当前位于窗口 0 (zsh):
- 我想在 3 个“zsh”窗口 (0,2,4) 之间循环
如果我当前位于窗口 1 (vim):
- 我想在 3 个“vim”窗口 (1,3,5) 之间循环
这将允许您循环相同类型的窗口,而不必先重新排序所有窗口(vim 紧挨着 vim,zsh 紧挨着 zsh 等)。幸福!
我自己尝试过,但没有成功:(
答案1
我创建了一个基本的解决方案。
将以下脚本另存为
_tmux-cycle-samename
并使其可执行 (chmod +x _tmux-cycle-samename
)。#!/bin/sh if [ "$1" = "-r" ]; then filter=tac; else filter=cat; fi name="$(tmux display-message -p '#W' | sed 's|\(.\)|[\\\1]|g')" tmux select-window -t "$( tmux list-windows -F '#{window_active} #{window_id} #W' \ | grep '^[01] @[0123456789]* '"$name"'$' | "$filter" \ | awk ' NR==1 {result=$2} { if (seen==1) {result=$2; exit} seen=$1 } END {print result} ' )"
该脚本检索正确的名称 (
tmux display-message …
) 并准备字符串 (sed …
),因此当稍后解释为正则表达式时,名称将按字面匹配。然后该脚本列出窗口 (tmux list-windows …
),选择匹配的窗口 (grep …
),保留或反转顺序(cat
或tac
根据 的展开$filter
)并查找下一个非活动窗口 (awk …
)。最后找到的窗口被选中(tmux select-window …
)。将这些添加到您的
~/.tmux.conf
:bind-key -T prefix > run-shell '/full/path/to/_tmux-cycle-samename' bind-key -T prefix < run-shell '/full/path/to/_tmux-cycle-samename -r'
如果
_tmux-cycle-samename
可以通过解决PATH
,则无需指定完整路径。如果已经在里面了
tmux
就跑tmux source-file ~/.tmux.conf
。tmux
重新启动的服务器将自动获取该文件。尝试prefix>在prefix<您的中
tmux
测试解决方案(默认prefix为Ctrl+ b)。
答案2
有一个命令可以切换到上次访问的窗格:ctrl-b
+;
您可以绑定#
键(或您喜欢的任何内容)以切换到上次访问的 tmux 窗格。我选择它#
是因为它就像如何:b#
切换到 vim 中的最后一个缓冲区:
# go to last pane (like b# in vim)
bind '#' select-pane -l
因此,您只需按 tmux 前缀(默认情况下ctrl-b
),然后按#
.