題 如何重新排序tmux窗口?


screen,我可以打字 C-a :number 0 將窗口移動到窗口列表的頂部並將所有其他窗口向下推一個窗口。什麼是等效的命令序列 tmux?我查看了手冊頁,但我發現這一點令人困惑。


374
2018-02-02 19:53


起源


C-b, . 讓你重新編號窗口。 - isomorphismes
閱讀所有許多答案,我仍然看不到OP問題的簡單解決方案:如何將給定窗口移動到位置0並將所有其餘窗口移到右側。我是否真的必須手動移動每一個才能做到這一點?我只想撤消我錯誤地做的一個動作(我不確定是什麼)我認為將窗口0移動到窗口8並將所有其他移動到左邊。 - nealmcb
@nealmcb我能想到的最簡單的方法是將base-index設置為1,重新編號,然後將窗口移動到空的0插槽中: superuser.com/a/1155999/674549 - eMBee
對於差異 swap-window -s number 和 swap-window -t number 交換當前窗口,請參閱 我的答案在這裡。 - qeatzy
看到 這個答案 用於bash函數來移動tmux窗口的範圍,例如[0-6]窗口的[2-5]。 - qeatzy


答案:


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

“前綴:”(默認情況下為“Ctrl-B:”)將您帶到tmux-command提示符。你輸入:

swap-window -s 3 -t 1

讓窗口編號3和窗口編號1交換位置。

要將當前窗口與頂部窗口交換,請執行以下操作:

swap-window -t 0

在索引0處沒有窗口的不太可能的情況下,執行:

move-window -t 0

(如果base-index為0,則默認情況下為)。

您可以將該命令綁定到一個鍵(例如T代表“top”),方法是將以下內容添加到您的 ~/.tmux.conf

bind-key T swap-window -t 0

418
2018-03-01 09:39



謝謝你的編輯,但是 move-window 只有在給定索引處沒有其他窗口時才有效。所以在大多數情況下, move-window -t 0 不起作用,因為通常在那個位置會有另一個窗口。 - matlehmann
沒錯,我會改進它。 - zakkak
你可能想看看 movew。 - Marcello Romani
也, bind-key L swap-window -t -1 使它成為最後一個窗口。 - w17t
對於差異 swapw -s number 和 swapw -t number 交換當前窗口,請參閱 我的答案在這裡。 - qeatzy


添加到Gareth的答案,您可以使用以下鍵綁定

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

按Ctrl + Shift + Left(將當前窗口向左移動。同樣正確。無需使用修改器(C-b)。


225
2018-02-15 11:18



這個 -1 和 +1 語法有助於解決佔用索引的問題。 tmux將為您移動其他窗口,並將事件自動換行到結束/開始。這是最好的答案。 - brianpeiris
這是敬虔的!謝謝。 - Bruno Buccolo
我無法輕易移動tmux窗口已經困擾了我幾個星期。這使得處理窗口變得更加容易!非常感謝最近的tmux轉換。 - calvinf
很棒的提示,更喜歡 bind-key S-Left swap-window -t -1,所以我可以做<prefix> shift + arrow,因為我不喜歡弄亂程序的關鍵綁定。 - demure
如果使用字母,您需要使用大寫字母而不是C-S,如下所示: bind-key -n C-H swap-window -t -1 - Matthew Mitchell


tmux相當於 :number 42 是 :move-window -t 42


60
2018-04-05 22:12



這與C-b綁定。 - vedang
謝謝!這比接受的答案imo要好得多。 - Ashe
@ArlenCuss實際上這兩個答案都很好而有用。你看,使用screen:number你可以交換窗口,使用tmux:move-window如果目標索引沒有被使用,你只能重新定位窗口。所以,imo,兩者:swap-window和:move-window是掌握窗口位置控制權所必需的:) - Victor Farazdagi
獲得編程大師答案的+1(也是正確的)。這是我可以讓它在活動窗口上工作的唯一方法 - engineerDave
TMUX的 :move-window 是 不 相當於屏幕 :number。 :number 如果目的地存在,交換, :move-window 在那種情況下失敗了。你必須在之間做出選擇 :move-window 和 :swap-window - piec


您可以實現等效的 screennumber 命令使用在其間選擇的外部shell腳本 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

12
2018-04-16 15:42



很好的解決方案,工作得很好!我只是做了一些小編輯來清理並刪除了 -F 我的tmux版本不接受的選項。 - haridsv


我重新編號這樣的窗口:

按Ctrl+b.222

會成為當前的 tmux 窗口(所有窗格)編號222。


相關:當我在洗牌時,我傾向於想做

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

從那裡我也可以使用 按Ctrl+b.reading 將當前窗口(所有窗格一次)移動到讀取會話。您可以在會話中瀏覽 按Ctrl+bs 你在會話中瀏覽的方式 按Ctrl+bw

HTH


10
2017-07-09 22:16





使用swap-window移動到任何id:[最接近屏幕:數字]

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

[m for move - > hit prefix-m並輸入say 3。 。將窗口重新編號為3]


8
2017-12-12 03:13



這已經很好了,但更好的是:執行交換窗口,如果失敗,則回到移動窗口 - nisc


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

5
2018-03-18 17:08





對於那些使用的人 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

3
2018-01-26 00:48



移動分裂將是一個很好的捷徑 在 某個窗口。 - Pablo Bianchi


我使用的方法結合了Ashish的回答和piec的一些;我有一個alt-left和右箭頭綁定到一個快速的小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'

這很容易結合起來 基索引 和 重新編排窗口 有一個從任意數字開始的窗口列表,從來沒有任何差距。

如果你正在使用 基數指數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然後調用來工作 移動窗口-r 從1開始重新編號。當第一個窗口移動到最後時,它的工作方式類似;通過挑選一個你永遠不會使用的巨大數字,它確保了什麼時候 移動窗口-r 再次發射一切都會像你期望的那樣編號。如果你想知道的話 刷新客戶端-S,這是必要的,因為有時候,從重新排序 移動窗口 將正常工作,狀態欄將不會更新,直到進行進一步的更改。通過強制刷新狀態欄(-S),可以避免這種情況。

我能用這種方法找到的唯一問題是 交換窗口 將隱含地將最後使用的窗口更改為您交換的窗口。因此,如果您在窗口#1上,切換到窗口4並將其移回一個窗口,您會發現最後使用的窗口是新的#4(以前是#3)而不是#1。似乎沒有辦法解決這個問題。


2
2018-06-24 20:29