如何重新排序 tmux 窗口?

dan*_*dan 534 tmux

在 中screen,我只需键入C-a :number 0即可将窗口移动到窗口列表的顶部并将所有其他窗口向下推。的等效命令序列是tmux什么?我查看了手册页,但在这一点上我发现它令人困惑。

mat*_*ann 600

swap-window命令最接近您想要的。

“前缀:”(即Ctrl+ B:默认情况下)为您带来的TMUX-命令提示符。在那里你输入:

swap-window -s 3 -t 1
Run Code Online (Sandbox Code Playgroud)

让 3 号窗口和 1 号窗口交换位置。

要将当前窗口与顶部窗口交换,请执行以下操作:

swap-window -t 0
Run Code Online (Sandbox Code Playgroud)

在索引 0 处没有窗口的不太可能的情况下,请执行以下操作:

move-window -t 0
Run Code Online (Sandbox Code Playgroud)

(如果 base-index 为 0,默认情况下)。命令move-window -t <NUMBER>默认绑定到Ctrl+ B, .

您可以通过将以下内容添加到您的~/.tmux.conf:

bind-key T swap-window -t 0
Run Code Online (Sandbox Code Playgroud)

  • 感谢您的编辑,但 `move-window` 仅适用于给定索引处没有另一个窗口的情况。所以在大多数情况下,`move-window -t 0` 将不起作用,因为通常在那个位置已经有另一个窗口了。 (7认同)
  • 此外,`bind-key L swap-window -t -1` 使其成为最后一个窗口。 (4认同)
  • 你可能想看看 `movew`。 (2认同)

小智 340

添加到 Gareth 的答案,您可以使用以下键绑定

bind-key -n C-S-Left swap-window -t -1
bind-key -n C-S-Right swap-window -t +1
Run Code Online (Sandbox Code Playgroud)

按Ctrl+Shift+Left(将当前窗口向左移动。同样向右。不需要使用修饰符(Cb)。

对于 tmux 3.0 版本,您应该使用以下键绑定

bind-key -n C-S-Left swap-window -t -1\; select-window -t -1
bind-key -n C-S-Right swap-window -t +1\; select-window -t +1
Run Code Online (Sandbox Code Playgroud)

  • 很好的提示,更喜欢`bind-key S-Left swap-window -t -1`,所以我可以做 &lt;prefix&gt; shift+arrow,因为我不喜欢搞乱程序的键绑定。 (13认同)
  • 这种 `-1` 和 `+1` 语法有助于解决索引被占用的问题。tmux 将为您移动其他窗口,并将事件自动环绕到结束/开始。这是最好的答案。 (12认同)
  • 如果使用字母,则需要使用大写字母而不是 CS,例如:`bind-key -n CH swap-window -t -1` (5认同)
  • 我喜欢绑定键 CS-Left/Right 的想法。但是,当我在使用 tmux 2.3 的 Mac(10.12.4 Sierra)上尝试此操作时,它不起作用。我不确定它是否被 Terminal.app 或其他系统设置捕获。任何帮助,将不胜感激! (4认同)
  • 对于 tmux &gt;= 3.0,您可以使用 -d 标志。见 https://github.com/tmux/tmux/issues/2056 (3认同)
  • @brianpeiris “环绕结束/开始”位有点奇怪:之前的第一个选项卡变成了最后一个选项卡! (2认同)

Ran*_*rtz 77

相当于TMUX:number 42:move-window -t 42

  • 这与 Cb 绑定。 (9认同)
  • @ArlenCuss 其实这两个答案都很好也很有用。您看,使用 screen :number 您可以交换窗口,使用 tmux 的 :move-window 您只能在未使用目标索引的情况下重新定位窗口。因此,imo, :swap-window 和 :move-window 都是掌握对窗口位置的控制所必需的:) (6认同)
  • tmux 的 `:move-window` *不*等同于 screen 的 `:number`。`:number` 交换如果目的地存在,`:move-window` 在这种情况下失败。你必须在 `:move-window` 和 `:swap-window` 之间进行选择 (6认同)

iso*_*mes 23

我像这样重新编号窗口:

Ctrl+ b, .,222

将使当前tmux窗口(所有窗格)编号为 222。


相关地:当我在四处闲逛时,我往往想做

Ctrl+b :new-session -d -s "reading"

从那里我还可以使用Ctrl+ b, .,reading将当前窗口(一次所有窗格)移动到阅读会话。您可以使用Ctrl+在会话之间浏览bs就像您在会话中使用Ctrl+ b、浏览一样w

HTH


pie*_*iec 13

您可以使用在和之间进行选择的外部 shell 脚本来实现等效于screennumber命令。您可以通过这种方式将其绑定到一个键:swap-windowmove-window

bind < command-prompt -p index "run-shell '~/.tmux.number.sh %%'"
Run Code Online (Sandbox Code Playgroud)

~/.tmux.number.sh

#!/bin/bash
if [ $# -ne 1 -o -z "$1" ]; then
    exit 1
fi
if tmux list-windows | grep -q "^$1:"; then
    tmux swap-window -t $1
else
    tmux move-window -t $1
fi
Run Code Online (Sandbox Code Playgroud)

  • 非常好的解决方案,效果很好!我只是做了一些小的编辑来清理并删除了我的 tmux 版本不接受的 `-F` 选项。 (2认同)

小智 9

使用交换窗口移动到任何 id: [最接近屏幕的 :number]

# window movement / renumbering like in screen's :number
bind-key m command-prompt -p "move window to:"  "swap-window -t '%%'"
Run Code Online (Sandbox Code Playgroud)

[m 表示移动 --> 打前缀-m 并输入 say 3 。.将窗口重新编号为 3]

  • 这已经很好了,但更好的是:执行交换窗口,如果失败,则退回到移动窗口 (2认同)

小智 9

由于 Ashish Ariga 的答案不适用于 1.9a 及以下版本。我用<>来交换窗口,左侧和右侧,分别加入下面的线.tmux.conf

# swap window to left or right
bind-key -r < swap-window -t -1
bind-key -r > swap-window -t +1
Run Code Online (Sandbox Code Playgroud)


小智 7

最简单的解决方案man是使用默认绑定:

{           Swap the current pane with the previous pane.
}           Swap the current pane with the next pane.
Run Code Online (Sandbox Code Playgroud)

  • tmux 窗口和窗格是不同的。 (8认同)
  • 这仍然帮助我得到了我想要的 (6认同)

git*_*rik 7

为了理智和简单的窗口交换:

# Bind P and N (capitals) to moving the current window around.
bind-key N swap-window -t +1 \; next-window
bind-key P swap-window -t -1 \; previous-window
Run Code Online (Sandbox Code Playgroud)

\;您可以将两个命令组合到一个键绑定中。因此,我们首先交换窗口,然后将焦点移动到该(原始)窗口。

因此,当您这样做时prefix -> Shift + N,它将当前窗口向前移动一位,并将焦点保持在该窗口上。

我很困惑为什么 tmux 中没有直接的命令。为什么你想要更复杂的东西?无论如何,这解决了。它。


Flo*_*man 6

我使用的方法结合了 Ashish 的一些答案和 Piec 的答案;我将 alt-left 和 right 箭头绑定到一个快速的小 shell 标注,该标注将窗口向左或向右移动,除非它是第一个或最后一个窗口。我这样做是因为,当您在最后一个窗口发出交换+1(或在第一个窗口发出交换-1)时,它仍然会交换,而不是像您期望的那样再次循环:

0:one 1:two 2:three 3:zero*
Run Code Online (Sandbox Code Playgroud)

成为

0:zero* 1:two 2:three 3:one
Run Code Online (Sandbox Code Playgroud)

代替

0:zero* 1:one 2:two 3:three
Run Code Online (Sandbox Code Playgroud)

因此,当窗口到达列表边缘时,我使用的命令停止工作:

bind-key -n M-Left run-shell 'tmux list-windows | head -n 1 | grep -q active || tmux swap-window -d -t -1'
bind-key -n M-Right run-shell 'tmux list-windows | tail -n 1 | grep -q active || tmux swap-window -d -t +1'
Run Code Online (Sandbox Code Playgroud)

这可以很容易地与基索引重新编号窗口结合使用,以获得以任意编号开始且没有任何间隙的窗口列表。

如果你像我一样使用基本索引 1并且你认为你不会超过 999 个窗口,你可以使用一个小技巧让它正常滚动,尽管命令有点膨胀:

set -g base-index 1
set -g renumber-windows on
bind-key -n M-Left run-shell 'if tmux list-windows | head -n 1 | grep -q active ; then tmux move-window -t 999 \; move-window -r \; refresh-client -S ; else tmux swap-window -d -t -1 ; fi'
bind-key -n M-Right run-shell 'if tmux list-windows | tail -n 1 | grep -q active ; then tmux move-window -t 0 \; move-window -r \; refresh-client -S ; else tmux swap-window -d -t +1 ; fi'
Run Code Online (Sandbox Code Playgroud)

其工作原理是暂时将最后一个窗口移动到未使用的索引 0,然后调用move-window -r再次从 1 开始重新编号。将第一个窗口移动到末尾时,其工作原理类似;通过选择一个您永远不会使用的巨大数字,它可以确保当move-window -r再次触发时,所有内容都会按照您的预期进行编号。如果您想知道刷新客户端 -S ,这是必要的,因为有时,虽然移动窗口的重新排序可以正常工作,但状态栏不会更新,直到进行进一步的更改。通过强制刷新状态栏 (-S),可以避免这种情况。

我发现这种方法的唯一问题是交换窗口会隐式地将上次使用的窗口更改为您交换的窗口。因此,如果您位于窗口#1,切换到窗口四并将其移回窗口一,您会发现上次使用的窗口是新的#4(以前是#3)而不是#1。似乎没有办法解决这个问题。

2020 年编辑:最近的 tmux 版本需要-d保留移动当前窗口并将其保留在新位置的旧行为。


pep*_*ico 6

tmux-pain-control提供ctrl-b >ctrl-b <左右移动聚焦窗口,环绕。


小智 5

对于那些byobu用作 tmux 包装器的人,您可以将当前窗口与上一个或下一个窗口交换:

Ctrl-Shift-F3
Ctrl-Shift-F4
Run Code Online (Sandbox Code Playgroud)

byobu为这些键定义的键绑定可能很有趣:

bind-key -n    C-S-F3 swap-window -t :-1
bind-key -n    C-S-F4 swap-window -t :+1
Run Code Online (Sandbox Code Playgroud)


Wil*_*Hou 5

我很惊讶没有人发现这一点,但是在深入研究 tmux 手册页后,您可以使用

move-window -b -t <target-window>
Run Code Online (Sandbox Code Playgroud)

移动到当前窗口到目标窗口之前。

因此,要完全按照OP的要求,执行以下操作:

move-window -b -t 0
Run Code Online (Sandbox Code Playgroud)