screen
中,我只需键入C-a :number 0
即可将一个窗口移至窗口列表的顶部,并将所有其他窗口向下推。 tmux
的等效命令序列是什么?我看了手册页,但在这一点上我感到困惑。#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,所以我可以执行
–娴静
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 楼
您可以使用在screen
和number
之间进行选择的外部外壳脚本来实现与swap-window
的move-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 5
和swap-window -t 5
都将当前窗口与窗口5交换,但是具有不同的语义。swap-window -s 5
窗口5程序有效,具有当前获胜编号。
最近的窗口号保持不变。
重复相同的命令将回滚到以前的状态。
对当前窗口号的最新覆盖。
swap-window -t 5
和number
中的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:vim
:swapw -s 5
另一个
[0] 0:vim* 1:mpl 2:py2- 3:numpy 4:plot 5:mc
:last-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 楼
这里没有一个答案令我满意,因此我写了一个脚本,模仿了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 ]]; 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
的窗口交换行为,我相信将窗口移至现有窗口编号时,应取代该窗口的位置,并将所有其他窗口向右微移。修改此脚本来这样做非常简单。
评论
C-b,使您可以重新编号窗口。阅读所有答案,我仍然看不到OP的问题的简单解决方案:如何将给定窗口移动到位置0,然后将其余所有窗口右移。我真的必须手动移动每个人吗?我只想撤消我错误执行的移动(我不确定该怎么做),我认为将窗口0移至窗口8并将所有其他窗口移至左侧。
@nealmcb我能想到的最简单的方法是将base-index设置为1,重新编号,然后将窗口移至空0插槽:superuser.com/a/1155999/674549
有关交换窗口-s号和交换窗口-t号以交换当前窗口的区别,请在此处查看我的答案。
@isomorphismes C-b。仅重编号为不存在的窗口编号。 :swap-window可以真正移动两个现有窗口