答案1
有什么方法可以强制按顺时针方向编号吗?
我现在知道有这样的方法。
我的主要目标是以prefix o顺时针方式循环浏览窗格。
这可以通过识别所需窗格并选择它的脚本来完成。将以下代码保存在您指向的_tmux-cycle-clockwise
某个目录中的名称下。PATH
#!/bin/sh
countercl=0
[ "$1" = '-c' ] && countercl=1
# This function reads geometry from tmux and sets variables.
read_geometry () {
geometry="$(tmux display-message -p -F '#{window_width} #{window_height} #{pane_left} #{pane_right} #{pane_top} #{pane_bottom}')" || return 1
ww="${geometry%% *}"
geometry="${geometry#* }"
wh="${geometry%% *}"
geometry="${geometry#* }"
pl="${geometry%% *}"
geometry="${geometry#* }"
pr="${geometry%% *}"
geometry="${geometry#* }"
pt="${geometry%% *}"
pb="${geometry#* }"
}
# This function finds neighbor pane
find_neighbor () {
panes="$(tmux list-panes -F '#{pane_left} #{pane_right} #{pane_top} #{pane_bottom} #{pane_id}')"
if [ "$countercl" -eq 0 ]; then
if [ "$pt" -eq 0 ] && [ "$pr" -ne "$((ww-1))" ]; then
pattern="^$((pr+2)) .* 0 .* .*$"
elif [ "$pr" -eq "$((ww-1))" ] && [ "$pb" -ne "$((wh-1))" ]; then
pattern="^.* $((ww-1)) $((pb+2)) .* .*$"
elif [ "$pb" -eq "$((wh-1))" ] && [ "$pl" -ne 0 ]; then
pattern="^.* $((pl-2)) .* $((wh-1)) .*$"
elif [ "$pl" -eq 0 ] && [ "$pt" -ne 0 ]; then
pattern="^0 .* .* $((pt-2)) .*$"
else
printf ':.+'
return
fi
else
if [ "$pr" -eq "$((ww-1))" ] && [ "$pt" -ne 0 ]; then
pattern="^.* $((ww-1)) .* $((pt-2)) .*$"
elif [ "$pt" -eq 0 ] && [ "$pl" -ne 0 ]; then
pattern="^.* $((pl-2)) 0 .* .*$"
elif [ "$pl" -eq 0 ] && [ "$pb" -ne "$((wh-1))" ]; then
pattern="^0 .* $((pb+2)) .* .*$"
elif [ "$pb" -eq "$((wh-1))" ] && [ "$pr" -ne "$((ww-1))" ]; then
pattern="^$((pr+2)) .* .* $((wh-1)) .*$"
else
printf ':.-'
return
fi
fi
printf '%s\n' "$panes" | grep "$pattern" | cut -d ' ' -f 5
}
main () {
newp=""
read_geometry
newp="$(find_neighbor)"
tmux select-pane -t "$newp" || exit 1
}
main
接下来将这些行添加到您的~/.tmux.conf
:
bind-key -T prefix o run-shell '_tmux-cycle-clockwise'
bind-key -T prefix a run-shell '_tmux-cycle-clockwise -c'
重新启动你的 tmux 服务器(或者重新加载文件:)prefix : source-file ~/.tmux.conf
Enter。
现在prefix o将以顺时针方式循环窗格;prefix a将逆时针循环。
笔记:
- 脚本调用
tmux
几次。如果当前窗口或窗格在此期间发生变化,脚本可能会出错。 “逆时针”不会取消“顺时针”;“顺时针”不会取消“逆时针”。至少有两个原因:
- 通常,脚本不会循环遍历所有窗格,而是循环遍历边框窗格。它可以离开非边框窗格进入边框或非边框窗格;但是从边框窗格永远不会进入非边框窗格。
循环中的下一个窗格仅由当前窗格决定,而不是由其边缘决定。例如,这与此布局相关:
0 | | 3 --| 2 |-- 1 | | 4
理论上,你可以从
2
顺时针到3
沿着顶部边缘或顺时针到1
沿着底部边缘。脚本总是转到3
,所以它的顺时针循环是2-3-4-2-3-4-…
。但是它的逆时针循环是2-0-1-2-0-1-…
。这是设计使然。这样,你就可以以某种方式仅使用脚本访问更多边框窗格。仍然有一些布局,其中某些边框窗格对于脚本来说是无法访问的。示例:0 | | 3 | | 6 --| 2 |---| 5 |-- 1 | | 4 | | 7
仅靠脚本
2
你是无法实现的。4
如果 tmux 可以为我识别最后一个窗格(就像它可以识别最后一个窗口一样),则可以修复此问题。我认为它不能。另一种方法是将信息从一次脚本调用存储到下一次脚本调用,每个 tmux 窗口。我选择不实现这一点。