拆分时顺时针窗格编号

拆分时顺时针窗格编号

tmux 对窗格进行编号的行为似乎遵循最左边和最上面的窗格获得最少的数字,并分别具有该优先级

例如,如果我按照以下配置垂直分割左侧窗口:

前

我明白了

后

有什么方法可以强制我按顺时针方向编号吗?即

0   1
3   2

我的主要目标是以prefix o顺时针方式循环显示窗格。以顺时针方式对窗格进行编号似乎是实现此目的的一种方法。

答案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 窗口。我选择不实现这一点。

相关内容