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

评论

C-b,使您可以重新编号窗口。

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

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

有关交换窗口-s号和交换窗口-t号以交换当前窗口的区别,请在此处查看我的答案。

@isomorphismes C-b。仅重编号为不存在的窗口编号。 :swap-window可以真正移动两个现有窗口

#1 楼

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)。默认情况下,命令move-window -t <NUMBER>绑定到Ctrl + B,..
通过将以下内容添加到~/.tmux.conf中,可以将该命令绑定到键(例如T表示“ top”):
bind-key T swap-window -t 0


评论


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

–马特莱曼
13年3月21日在15:32



是的,我会改善它。

– zakkak
2014年3月23日在23:31



您可能想看看movew。

– Marcello Romani
2015年2月19日在9:57



同样,绑定键L swap-window -t -1使其成为最后一个窗口。

–user373230
17年3月15日14:49在

对于swapw -s号和swapw -t号要交换当前窗口的区别,请在这里查看我的答案。

– qeatzy
17-10-7在8:45

#2 楼

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

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


按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


评论


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

–brianpeiris
13-10-10在13:29

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

– calvinf
2014年1月21日在20:09

很好的提示,更喜欢绑定键S-Left交换窗口-t -1,所以我可以执行 shift + arrow,因为我不喜欢弄乱程序的键绑定。

–娴静
2014年6月1日下午0:35

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

–马修·米切尔(Matthew Mitchell)
2014-12-19 15:28



我喜欢绑定键C-S-Left / Right的想法。但是,当我在使用tmux 2.3的Mac(10.12.4 Sierra)上尝试此操作时,它不起作用。我不确定Terminal.app或其他系统设置是否捕获了它。任何帮助,将不胜感激!

–梦想家
17年5月2日,0:26

#3 楼

相当于:number 42的tmux是:move-window -t 42

评论


这绑定到C-b。

–vedang
2011年6月30日12:59

谢谢!这比接受的答案imo好得多。

–阿什拉
2012年2月14日在22:27

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

– Victor Farazdagi
2012年3月20日在12:30

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

–engineerDave
2012年7月24日13:37

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

–piec
2013年1月29日23:28



#4 楼

我像这样对窗口重新编号:

.,222

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


相关:当我整理周围的东西时,我倾向于做

:new-session -d -s "reading"

,从那里我也可以使用Ctrl + b, .reading将当前窗口(一次所有窗格)移至阅读会话。您可以使用Ctrl + b,s在会话中浏览,就像使用Ctrl + b,w在会话中浏览方法一样。

HTH

#5 楼

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

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



~/.tmux.number.sh

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


评论


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

–haridsv
13年1月23日在9:33

#6 楼

使用swap-window移至任何id:[最靠近屏幕的:number]

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


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

评论


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

–nisc
2011-12-26 15:18

#7 楼

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

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


评论


tmux的窗口和窗格是不同的。

– Marcello Romani
2015年2月19日在10:00

这仍然帮助我获得了想要的东西

–lkraav
2015年5月24日12:00



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

–mbigras
18年8月2日在18:59

#8 楼

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


评论


在交换窗口中添加-d标志将重点放在要移动的当前窗口上

– Mosaaleb
9月11日上午10:05

#9 楼

对于那些使用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


评论


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

– Pablo A
17年7月15日在20:51

#10 楼

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

评论


在tmux 2.5中对我不起作用

–德米特里·弗兰克(Dmitry Frank)
18-3-24在17:17



@DmitryFrank操作,对,我不好。这是由于github.com/tmux-plugins/tmux-pain-control

–pepper_chico
18 Mar 24 '18 at 17:31

谢谢!设法手动设置了这两个,但是该插件在其他方面也看起来不错。

–德米特里·弗兰克(Dmitry Frank)
18年3月24日19:00

#11 楼

我使用的方法结合了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 -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'

可以轻松地将它与base-index和renumber-windows结合使用,以列出以任意数量开头并且没有任何间隔的窗口。
如果您像我一样使用base-index 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'

这可以通过将最后一个窗口临时移至未使用的窗口来进行index-0,然后调用move-window -r重新编号,从1开始。将第一个窗口移到末尾时,其工作原理类似。通过选择一个您永远不会使用的巨大数字,它可以确保在move-window -r再次触发时,所有内容都将按照您的期望进行编号。如果您想知道refresh-client -S,这是必要的,因为有时从移动窗口重新排序会正常进行,但是状态栏将不会更新,直到进行了进一步的更改。通过仅刷新状态栏(-S),就可以避免这种情况。
我可以用这种方法找到的唯一问题是,交换窗口将隐式地将最后使用的窗口更改为与之交换的窗口。因此,如果您在#1窗口上,切换到第四窗口并将其移回一个窗口,您会发现最后使用的窗口是新的#4(以前为#3)而不是#1。似乎没有办法解决。
2020年修改:最新的tmux版本要求-d保持移动当前窗口并将其保持在新位置的旧行为。

评论


这很好用,我有一个外部脚本可以在20行代码中实现相同的目的,您的绑定键调用更加简单和高效。 2020年仅需注意-当前的tmux版本不会自动选择交换窗口,因此在swap-window -t -1之后;我需要添加tmux上一个窗口;在交换窗口之后-t +1;我必须在下一个窗口中添加tmux。

–拉法格(RafałG.)
9月10日20:54

感谢您的更新,但是当窗户碰到边缘时,此解决方案会循环播放。最好使用swap-window -d获得旧的行为,我将更新我的答案。

–阿拉斯加
11月30日18:11

#12 楼

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

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


完成后,如果以后要使用base-index,可以将0重置为move-window -r,而无需在0上移动窗口。

#13 楼


swap-window -s 5swap-window -t 5都将当前窗口与窗口5交换,但是具有不同的语义。

swap-window -s 5



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

swap-window -t 5number中的swap-window -s number可以是绝对值(例如5),也可以是相对值(例如-1,+ 2)。

PS
下面是tmux状态栏的摘录,说明了-t number的效果

最新消息: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:vimswapw -s 5

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

评论


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

– qeatzy
17-10-7在13:08

#14 楼

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

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

#15 楼

不需要命令行(先按Ctrl + b,然后按:)
,只需使用
,然后输入新的(免费)窗口编号并按Enter键
如果没有可用的窗口编号,请使用Ctrl + b +。重新编号窗口。
(提示:如果您不知道哪个是哪个,请使用Ctrl + b +命名窗口)

#16 楼

我想您想将新的组合键绑定到'choose-window'命令。

我知道您说您已经阅读了手册页,但是您应该回头参考它。
您需要修改〜/ .tmux.conf文件以添加绑定键命令。

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

tmux man页面

评论


选择窗口似乎没有将当前窗口移到新位置。

– dan
2011年2月2日在20:20

同样,选择窗口已经绑定到C-B w。

– kynan
2013年6月10日18:10

#17 楼

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

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

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

评论


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

– Jan Doggen
2014年10月31日下午16:17

#18 楼

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

Ctrl + b 


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

}


将实际窗口向左更改:

{



别忘了在以下情况下使用SHIFT}{


评论


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

–尾随斜杠
16-10-17在22:30

#19 楼

为了它的价值:

我一起砍了这个脚本,以便能够在“ 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 "  " -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


可能可以进行很多改进,特别是:

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

它的gif效果(github)

#20 楼

这里没有一个答案令我满意,因此我写了一个脚本,模仿了screentmux窗口移动行为。
它检测目标窗口号是小于最小窗口号还是大于最小窗口号。最大窗口号,如果是,则将所有其他窗口分别向右或向左微移,然后将它们从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  ]]; then
    echo "Error: No window specified."
elif ! [[  =~ ^-?[0-9]+$ ]]; then
    echo "Error: Bad window number specified."

# Bigger than everything; slide it to the far right, then renumber
elif [[  -gt $maxwin ]]; then
    i=0
    tmux move-window -t:$((maxwin + 1))
    winlist=($(tmux list-windows | cut -d: -f1 | xargs))
    for n in ${winlist[@]}; do
      i=$((i + 1))
      tmux move-window -s:$n -t:$i
    done

# Smaller than everything; slide it to the far left, then renumber
elif [[  -lt $minwin ]]; then
    tmux move-window -t:0
    winlist=($(tmux list-windows | cut -d: -f1 | xargs | rev))
    i=${#winlist[@]}  # start at highest indexed window
    for n in ${winlist[@]}; do
      tmux move-window -s:$n -t:$i
      i=$((i - 1))
    done

# In-between; just a simple swap
else
    tmux swap-window -t:
fi
 

然后,只需将此简单的键绑定添加到您的.tmux.conf中:
bind m command -p "Send window to:"  "run -b '~/tmux-windowswap #I %1'"

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