將終端機從另一個視窗載入到 tmux 中的目前分割窗格中

將終端機從另一個視窗載入到 tmux 中的目前分割窗格中

在 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-panetmux 指令交換兩個窗格。從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(預設prefixCtrl+ 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 "

  1. 標記您要移動的窗格。
  2. 分割要分割的窗格:

    • 要么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

但請注意,如果舊窗格確實位於%0at0:0.0且新窗格確實位於%2at 0:1.1,那麼它們現在分別位於%0at0:1.1%2at 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。

相關內容