如何重新排序tmux窗口?


413

在中screen,我可以键入C-a :number 0将一个窗口移动到窗口列表的顶部,然后将所有其他窗口向下推。等价的命令序列是tmux什么?我看了手册页,但在这一点上我感到困惑。


95
C-b.可让您重新编号窗口。
同构2014年

7
阅读所有答案,我仍然看不到OP问题的简单解决方案:如何将给定窗口移动到位置0,然后将其余所有窗口右移。我真的需要手动移动每个人吗?我只想撤消我错误执行的移动(我不确定是什么),我认为将窗口0移至窗口8并将所有其他窗口移至左侧。
nealmcb 2014年

1
@nealmcb我能想到的最简单的方法是将base-index设置为1,重新编号,然后将窗口移至空0插槽:superuser.com/a/1155999/674549
eMBee

有关swap-window -s numberswap-window -t number交换当前窗口的区别,请参见此处的答案
qeatzy

请参阅此答案以获取bash函数以移动tmux窗口的范围,例如[0-6]窗口的[2-5]。
qeatzy

Answers:


467

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

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

swap-window -s 3 -t 1

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

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

swap-window -t 0

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

move-window -t 0

(如果base-index为0,默认情况下为0)。

通过将以下内容添加到您的命令中,可以将该命令绑定到键(例如T表示“ top”)~/.tmux.conf

bind-key T swap-window -t 0

6
感谢您的编辑,但move-window仅在给定索引处没有其他窗口时才有效。因此,在大多数情况下,move-window -t 0它将不起作用,因为通常在该位置已经有另一个窗口。
matlehmann

是的,我会改善它。
zakkak 2014年

2
您可能想看看movew
Marcello Romani 2015年

3
另外,bind-key L swap-window -t -1使其成为最后一个窗口。

有关swapw -s numberswapw -t number交换当前窗口的区别,请参见此处的答案
qeatzy

257

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

bind-key -n C-S-Left swap-window -t -1
bind-key -n C-S-Right swap-window -t +1

按Ctrl + Shift +左键(会将当前窗口向左移动。向右类似。无需使用修饰符(Cb)。


9
-1+1语法有助于解决索引占用问题。tmux将为您移动其他窗口,并将事件自动回绕到结束/开始。这是最好的答案。
brianpeiris

1
我无法轻松移动tmux窗口困扰了我数周。这使得处理窗户变得如此容易!非常感谢最近的tmux转换。
calvinf 2014年

8
很好的提示,bind-key S-Left swap-window -t -1而不是,所以我可以做<prefix> shift + arrow,因为我不喜欢弄乱程序的键绑定。
娴静的

4
如果使用字母,则需要使用大写字母而不是CS,例如:bind-key -n C-H swap-window -t -1
Matthew Mitchell

1
使用Ashish Ariga时,我在1.9a上也存在一些问题,bind-key -n C-S-Left swap-window -t -1但是按@MatthewMitchell的建议使用前缀时它可以正常工作
Rho Phi

63

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


9
这绑定到Cb。
吠陀2011年

1
谢谢!这比接受的答案imo好得多。
阿什2012年

5
@ArlenCuss实际上,两个答案都是有用的。您会看到,使用screen:number可以交换窗口,使用tmux的:move-window只能在未使用目标索引的情况下重新定位窗口。因此,imo既需要:swap-window和:move-window来掌握对窗口位置的控制:)
Victor Farazdagi 2012年

1
+1可从编程专家那里获取答案(也是正确的)。这是我可以使它在活动窗口上工作的唯一方法
EngineerDave

4
TMUX的:move-window不是等同于屏幕的:number:number如果目标存在则交换,:move-window在这种情况下将失败。您必须在:move-window和之间选择:swap-window
Piec 2013年

15

我这样重新编号窗口:

Ctrl+ b.222

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


相关内容:当我在拖拉东西时,我倾向于做

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

并从那里我也可以用Ctrl+ b.reading到到读取时段移动当前窗口(所有窗格一次)。您可以使用Ctrl+ 来浏览会话bs就像使用Ctrl+ b,来浏览会话一样w

高温超导


12

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

bind < command-prompt -p index "run-shell '~/.tmux.number.sh %%'"

~/.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

2
非常好的解决方案,效果很好!我只是进行了少量编辑以清理并删除了-F我的tmux版本不接受的选项。
haridsv

8

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

# window movement / renumbering like in screen's :number
bind-key m command-prompt -p "move window to:"  "swap-window -t '%%'"

[m for move->按下前缀-m并输入say 3。。将窗口重新编号为3]


1
这已经很不错了,但更好的是:做交换窗口,如果失败,退回到移动窗口
nisc 2011年

5

由于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

4

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

{           Swap the current pane with the previous pane.
}           Swap the current pane with the next pane.

6
tmux的窗口和窗格是不同的。
Marcello Romani 2015年

4
这仍然帮助我获得了想要的东西
lkraav 2015年

这个问题是关于窗户而不是窗格的
mbigras

3

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

Ctrl-Shift-F3
Ctrl-Shift-F4

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

bind-key -n    C-S-F3 swap-window -t :-1
bind-key -n    C-S-F4 swap-window -t :+1

特定窗口中移动拆分的捷径非常有用。
巴勃罗

2

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

0:one 1:two 2:three 3:zero*

成为

0:zero* 1:two 2:three 3:one

代替

0:zero* 1:one 2:two 3:three

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

bind-key -n M-Left run-shell 'tmux list-windows | head -n 1 | grep -q active || tmux swap-window -t -1'
bind-key -n M-Right run-shell 'tmux list-windows | tail -n 1 | grep -q active || tmux swap-window -t +1'

可以轻松地将其与base-indexrenumber-windows结合使用,以列出以任意数量开头且没有任何间隔的窗口列表。

如果您像我一样使用基本索引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 -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 -t +1 ; fi'

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

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


2

您可以base-index用来更改窗口的起始编号。如果设置base-index1move-window -r则将重新编号所有以开头的窗口1,从而释放出0将窗口移入其插槽的空间:

set base-index 1
move-window -r
move-window -t 0

完成后,您可以重置base-index0如果move-window -r以后要使用而无需移动窗口0



1

双方swap-window -s 5swap-window -t 5交换当前窗口与窗口5,但有不同的语义。

swap-window -s 5

  • 窗口5程序有效,当前获胜号码。
  • 最近的窗口号保持不变。
  • 重复相同的命令将回滚到以前的状态。

swap-window -t 5

  • 当前程序编号为5。
  • 最近覆盖当前窗口号。

numberswap-window -s number-t number可以既是绝对,例如,图5和相对的,例如,-1,+ 2。

以下 PS 是tmux statusline的摘录,说明了swap-window -s 5

最近:
[0] 0:vim- 1:mpl 2:py2* 3:numpy 4:plot 5:mc

现在,之后last-window
[0] 0:vim* 1:mpl 2:py2- 3:numpy 4:plot 5:mc

之后swapw -s 5
[0] 0:mc* 1:mpl 2:py2- 3:numpy 4:plot 5:vim

另一个swapw -s 5
[0] 0:vim* 1:mpl 2:py2- 3:numpy 4:plot 5:mc

另一个last-window
[0] 0:vim- 1:mpl 2:py2* 3:numpy 4:plot 5:mc


请参阅此答案以获取bash函数以移动tmux窗口的范围,例如[0-6]窗口的[2-5]。
qeatzy

1

在tmux窗口中,尝试以下操作将窗口0与1交换:

$ tmux swap-window -d -s 0 -t 1


0

我认为您想将新的组合键绑定到“ choose-window”命令。

我知道您说您已经阅读了手册页,但是您应该重新参考它。您需要修改〜/ .tmux.conf文件以添加bind-key命令。

具体来说,请看下面的第4页。

tmux手册页


choose-window似乎没有将当前窗口移到新位置。

另外,choose-window已经绑定到C-B w
kynan 2013年

0

这是我使用的方法。您仍然不能将窗口移至已占用的索引,但是可以将窗口移至较高的索引(未使用的索引)并在上一个索引所在的间隙中重新排列。

假设您有3个窗口,并且想添加第四个窗口,但是要在以前3个窗口的位置添加。

在添加新窗口之前:Tmux前缀,然后。将打开移动命令。输入4,索引3现在将变为4,然后简单地添加另一个窗口,它将位于索引3,而您的旧窗口仍将位于索引4。


尽管这是一个有用的提示,但这不能回答问题。
Jan Doggen

0

首先,打开tmux命令并释放:

Ctrl + b 

并将实际窗口更改为右窗口(按循环顺序),只需执行以下操作:

}

要将实际窗口更改为左:

{
  • SHIFT}或时不要忘记使用{

2
在某些情况下绝对有用,但这会重新排列窗口内的窗格(而不是重新排列窗口)。
斜线

0

物有所值:

我一起砍掉了这个脚本,以便能够在“ TUI”中订购所有窗户。它会在一个临时文件中列出所有窗口,并使用默认编辑器将其打开(假设您已设置$ EDITOR)。此后,您可以对行进行重新排序,并且在保存并关闭文件后,窗口将相应地重新排序。(这类似于在执行时订购提交git rebase -i

#!/bin/bash

# Usage: tmux-mv    
#   Move your tmux windows around in an editor

tmpfile=$(mktemp)
tmux list-windows > $tmpfile
$EDITOR $tmpfile

# Move all windows to 50..x in the order you just specified
# Assumes you don't have 50 windows already(!)
cat $tmpfile | awk -F ":" '{ print " -s " $1 " -t 5" NR-1 }' |\
  xargs -I {} sh -c 'tmux move-window -d {}'

# Move them back down, retaining the order
tmux move-window -d -r
rm $tmpfile

可能会在很多方面进行改进,尤其是:

注意:运行命令后,您可能会移动到另一个窗口。

它的动态效果(github)


0

这里的答案都没有一个令我满意,因此我编写了一个脚本,(模仿)模仿的screen窗口移动行为tmux

它检测目标窗口号是小于最小窗口号还是大于最大窗口号,如果是,则将其他所有窗口分别向右或向左推,然后将它们从1-N递增地重新编号。 。这是通过move-window命令完成的。

如果窗口编号最小/最大编号之间(即,大概与现有的窗口编号匹配),则仅将其与swap-window命令交换。

这是脚本:

#!/usr/bin/env bash
# Filename: ~/tmux-windowswap
# Function that provides improved window-swapping functionality for tmux
maxwin="$(tmux list-windows | cut -d: -f1 | sort -nr | head -n1)"
minwin="$(tmux list-windows | cut -d: -f1 | sort -n | head -n1)"
# Error checking
if [[ -z $2 ]]; then
  echo "Error: No window specified."
elif [[ ! $2 =~ ^-?[0-9]+$ ]]; then
  echo "Error: Bad window number specified."
# Bigger than everything; slide it to the far right, then renumber
elif [[ $2 -gt $maxwin ]]; then
  i=0 # intialize
  tmux move-window -t:$(($maxwin+1))
  winlist="$(tmux list-windows | cut -d: -f1 | xargs)"
  for n in $winlist; do
    i=$(($i+1)) # increment
    tmux move-window -s:$n -t:$i
  done
# Smaller than everything; slide it to the far left, then renumber
elif [[ $2 -lt $minwin ]]; then
  tmux move-window -t:0
  winlist=($(tmux list-windows | cut -d: -f1 | xargs | rev))
  i=${#winlist[@]} # initialize; start at highest indexed window
  for n in ${winlist[@]}; do
    tmux move-window -s:$n -t:$i
    i=$(($i-1)) # decrement
  done
# In-between; just a simple swap
else
  tmux swap-window -t:$2
fi

然后,只需将此简单的键绑定添加到您的.tmux.conf

bind m command -p "Send window to:"  "run -b '~/tmux-windowswap #I %1'"

注意:为了完美地模仿screen窗口交换行为,我相信将窗口移至现有窗口编号时,它应该占据该窗口的位置,而所有其他窗口都向右微移。修改该脚本来这样做非常简单。


0

不需要命令行(即Ctrl+ b,然后是:

只需移动您的窗户

Ctrl+ b+:

然后输入新的(免费)窗口编号并点击 Enter

如果现在有可用的窗口编号,请使用Ctrl+ b+ .对窗口重新编号。

(提示:如果您不了解哪个是哪个窗口,请使用Ctrl+ b+ 命名窗口,

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.