在 GNU Screen 中,我可以切換到給定分割內的任何視窗號碼。例如:
- 輸入
screen
以啟動它。 - 按Ctrl+a c建立一個新視窗。現在有兩個視窗:視窗 0 和視窗 1。
- 按Ctrl+ a Shift+s建立新的分割。
- 按Ctrl+a Tab轉到新的拆分。
- 按Ctrl+0載入此新分割中的視窗 0。
我們如何在 Tmux 中做類似的事情?這是我到目前為止所擁有的:
- 輸入
tmux
以啟動它。 - 按Ctrl+b c建立一個新視窗。現在有兩個視窗:視窗0和視窗1。
- 按Ctrl+b "建立新的分割窗格。目前窗格現在是新的分割窗格。
- 現在如何將視窗 0 中的 shell 載入到這個新的分割窗格中?
有沒有辦法在 tmux 中模擬螢幕的這種行為?
答案1
Tmux 不支援在兩個不同的視窗中顯示相同窗格,也不支援在同一視窗中顯示相同窗格兩次。您可以將整個視窗連結到會話,而無需取消其與原始會話的連結。或者,您可以將窗格放置在另一個視窗中,但這會將該窗格從其原始視窗中刪除。
在您的範例中,您已經建立了一個窗格來儲存所需窗格的位置。在這種情況下,您可以使用swap-pane
tmux 指令交換兩個窗格。從man 1 tmux
:
swap-pane [-dDU] [-s src-pane] [-t dst-pane]
(別名swapp
:)交換兩個窗格。 [...]
-d
指示 tmux 不要變更活動窗格。如果
-s
省略且存在標記窗格(請參閱select-pane -m
),則使用標記窗格而不是目前窗格。
更好的是:如果-s
和-t
都被省略並且存在標記窗格,則標記窗格和當前窗格將被交換。在任何給定時間,整個 tmux 伺服器中最多可以有一個標記窗格。
現在如何將視窗 0 中的 shell 載入到這個新的分割窗格中?
導覽至視窗 0 並標記要移動的窗格(在您的範例中,它是那裡唯一的窗格)。您可以使用人民幣(如果支援滑鼠)或prefix m(預設prefix為Ctrl+ b)來完成此操作。導航回新窗格並呼叫:
tmux swapp
您所呼叫的 shelltmux swapp
不會自動銷毀,它現在位於視窗 0 中,即標記窗格曾經所在的位置。在您的範例中,您似乎不需要這個外殼本身,您只需要新的窗格;如果是這樣,請考慮tmux swapp && exit
一下。請記住,如果沒有標記的窗格(或如果當前的窗格已標記),則tmux swapp
實際上不會執行任何操作。在這種情況下,tmux swapp && exit
只會退出 shell。
或者,反而建立新的分割窗格時,您可以一步驟將所需的窗格移至目前視窗中。
join-pane [-bdhv] [-l size | -p percentage] [-s src-pane] [-t dst-pane]
(別名joinp
:)與 類似
split-window
,但不是分割dst-pane
並建立新窗格,而是將其分割並移入src-pane
空間。 […]如果
-s
省略且存在標記窗格(請參閱 select-pane-m
),則使用標記窗格而不是目前窗格。
所以代替prefix ":
- 標記您要移動的窗格。
分割要分割的窗格:
- 要么
tmux joinp -v
在 shell 中呼叫; - 或與prefix :
joinp -v
Enter;特別是當您想要分割的窗格中沒有空閒 shell 時,這非常有用(但不要忘記先讓窗格成為目前窗格)。
- 要么
with 方法prefix :可用來呼叫 tmuxswapp
或任何其他 tmux 指令。
以下有一些關於從 tmux 外部操作窗格的註解。這些範例使用tmux swapp
但您可以tmux joinp
類似地調用。
swap-pane
允許你交換任何tmux 伺服器內的兩個窗格。你甚至可以tmux swapp
從外部如果您知道如何定址要交換的兩個窗格,則無需手動標記和變更窗格即可使用 tmux。它可能是:
tmux swapp -s 0:1.1 -t 0:0.0
格式為session:window.pane
,請參閱手冊中的說明target-pane
。請注意,這些裸數字是「相對的」(至少是部分:window.pane
,我不確定這個session
數字)。0:0.0
交換後的第一個窗格0:1.1
變為0:1.1
。另一方面,tmux 會話、視窗和窗格都有它們的獨特的標識符(分別以$
,@
和為前綴%
)。在你的情況下,命令可能是這樣的:
tmux swapp -s %2 -t %0
但請注意,如果舊窗格確實位於%0
at0:0.0
且新窗格確實位於%2
at 0:1.1
,那麼它們現在分別位於%0
at0:1.1
和%2
at 0:0.0
。每個窗格的唯一識別碼「附加」到該窗格的內容(進程)並與其一起「旅行」。窗格的無前綴標識符取決於窗格的總數及其在視窗中的位置。
您可以命名會話 ( rename-session
) 和視窗 ( rename-window
)。這使得識別窗格變得更加session:window.pane
容易。
您可以運行多個 tmux 伺服器。伺服器透過它們的套接字路徑(-L
選項)或套接字名稱( )來標識-S
。預設名稱是default
.如果您tmux
在 tmux 中不使用這些選項進行調用,那麼它將找到正確的伺服器(TMUX
我認為是透過環境變數)。如果您tmux
從 tmux 外部呼叫而不使用這些選項,那麼它將像tmux -S default
.您可能想要交換屬於非預設 tmux 伺服器的兩個窗格,例如:
tmux -S other swapp -s 0:1.1 -t 0:0.0
Tmux 不支援在伺服器之間交換窗格。擁有兩台伺服器的全部意義在於它們是獨立的。如果您需要在兩個半獨立的 tmux 實體之間交換窗格,這些實體應該是單一 tmux 伺服器中的會話。您可以在不同會話之間交換窗格。
如果您確實需要「劫持」另一個 tmux 伺服器下執行的進程,請使用reptyr
。該工具完全獨立於 tmux。