在中screen
,我可以键入C-a :number 0
将一个窗口移动到窗口列表的顶部,然后将所有其他窗口向下推。等价的命令序列是tmux
什么?我看了手册页,但在这一点上我感到困惑。
在中screen
,我可以键入C-a :number 0
将一个窗口移动到窗口列表的顶部,然后将所有其他窗口向下推。等价的命令序列是tmux
什么?我看了手册页,但在这一点上我感到困惑。
Answers:
该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
move-window
仅在给定索引处没有其他窗口时才有效。因此,在大多数情况下,move-window -t 0
它将不起作用,因为通常在该位置已经有另一个窗口。
movew
。
添加到Gareth的答案中,您可以使用以下按键绑定
bind-key -n C-S-Left swap-window -t -1
bind-key -n C-S-Right swap-window -t +1
按Ctrl + Shift +左键(会将当前窗口向左移动。向右类似。无需使用修饰符(Cb)。
-1
和+1
语法有助于解决索引占用问题。tmux将为您移动其他窗口,并将事件自动回绕到结束/开始。这是最好的答案。
bind-key S-Left swap-window -t -1
而不是,所以我可以做<prefix> shift + arrow,因为我不喜欢弄乱程序的键绑定。
bind-key -n C-H swap-window -t -1
bind-key -n C-S-Left swap-window -t -1
但是按@MatthewMitchell的建议使用前缀时它可以正常工作
该TMUX相当于:number 42
是:move-window -t 42
。
:move-window
是不是等同于屏幕的:number
。:number
如果目标存在则交换,:move-window
在这种情况下将失败。您必须在:move-window
和之间选择:swap-window
您可以使用在和之间选择的外部shell脚本来实现与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 "$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
-F
我的tmux版本不接受的选项。
使用交换窗口移动到任何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]
来自的最简单的解决方案man
是使用默认绑定:
{ Swap the current pane with the previous pane.
} Swap the current pane with the next pane.
我使用的方法结合了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-index和renumber-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。似乎没有办法解决这个问题。
tmux-pain-control提供ctrl-b >
并ctrl-b <
向左和向右移动聚焦的窗口。
双方swap-window -s 5
并swap-window -t 5
交换当前窗口与窗口5,但有不同的语义。
swap-window -s 5
swap-window -t 5
的number
在swap-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
我认为您想将新的组合键绑定到“ choose-window”命令。
我知道您说您已经阅读了手册页,但是您应该重新参考它。您需要修改〜/ .tmux.conf文件以添加bind-key命令。
具体来说,请看下面的第4页。
choose-window
似乎没有将当前窗口移到新位置。
choose-window
已经绑定到C-B w
。
这是我使用的方法。您仍然不能将窗口移至已占用的索引,但是可以将窗口移至较高的索引(未使用的索引)并在上一个索引所在的间隙中重新排列。
假设您有3个窗口,并且想添加第四个窗口,但是要在以前3个窗口的位置添加。
在添加新窗口之前:Tmux前缀,然后。将打开移动命令。输入4,索引3现在将变为4,然后简单地添加另一个窗口,它将位于索引3,而您的旧窗口仍将位于索引4。
首先,打开tmux命令并释放:
Ctrl + b
并将实际窗口更改为右窗口(按循环顺序),只需执行以下操作:
}
要将实际窗口更改为左:
{
SHIFT
按}
或时不要忘记使用{
。物有所值:
我一起砍掉了这个脚本,以便能够在“ 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
可能会在很多方面进行改进,尤其是:
注意:运行命令后,您可能会移动到另一个窗口。
这里的答案都没有一个令我满意,因此我编写了一个脚本,(模仿)模仿的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
窗口交换行为,我相信将窗口移至现有窗口编号时,它应该占据该窗口的位置,而所有其他窗口都向右微移。修改该脚本来这样做非常简单。
C-b
,.
可让您重新编号窗口。