有沒有更優雅的方法來取消從 tmux 內部共享會話的兩個 tmux 用戶端的連結?

有沒有更優雅的方法來取消從 tmux 內部共享會話的兩個 tmux 用戶端的連結?

這幾乎是一個程式碼審查問題,但非常*nixy,更多的是關於配置而不是程式碼。自從我tmux轉而使用以來,多年來screen我一直遇到一些棘手的問題,這些問題使我無法按照我想要的方式工作。由於我將 shell 設定為在 tmux 會話中執行,我最終決定是時候修復這個問題了。

預設情況下,當您將兩個 tmux 用戶端附加到相同會話時,它們會被鎖定在一起。在其中一個窗格中切換,並且兩個窗格同步切換。這與螢幕不同,螢幕的預設行為是一組共享的窗格,但客戶端本身是獨立的。

我想要的是一種解除綁定到同一會話的兩個 tmux 用戶端的方法。如果您在 tmux 之外並啟動新客戶端,那麼這很容易做到。只需引用父會話即可開始一個新會話:

tmux new-session -t original_session -s new_session

不過嘗試這樣做您位於客戶端中,並且想要將其與共享該會話的任何其他客戶端取消鏈接,事情會變得更加複雜。我嘗試了幾十種方法,但從未找到一種行之有效的方法。我得到的最接近的是使用bind <key> prompt-command ...提示輸入舊的和新的會話名稱。無論出於何種原因, tmux 都不會擴展a或 的#{session_name}參數內的變數。new-sessionprompt-command它在許多其他命令的參數中起作用(例如我在run下面使用它),但如果沒有這種擴展,這個特定的任務就會突然變得複雜。即使手動輸入數值,它也只能起到一定的作用。

今天我終於開始工作了。然而,結果比我想要的更醜。它需要一個 shell 函數來完成大部分的工作。為了將其包含在設定檔中而不涉及外部腳本(為了點檔案的可移植性),我使用了一種 hack。如果去掉前兩列,該配置實際上可以作為 shell 腳本執行。將所有內容封裝在函數中,您可以從任何鍵綁定中僅呼叫所需的腳本部分。 shell 腳本位元是配置中的註釋,而在 shell 腳本中,配置位元會被此處文件丟棄。

今天的解決方案出來了這樣的東西(我的完整.tmux.conf文件):

# : << ENDOFCONF

# Clear the default binding
unbind C-c
# Pass the name of the current session to a function to clone it
bind C-c run "cut -c3- ~/.tmux.conf | sh -s clone #S"

# ENDOFCONF
# clone () {
#   orig=${1%-*}
#   copy="$orig-$(($( tmux list-sessions -F '#S' | sed -nE "/^${orig}-[0-9]+$/{s/[^0-9]//g;p}" | tail -n1 )+1))"
#   TMUX= tmux new-session -d -t $orig -s $copy
#   tmux switch-client -t $copy
#   tmux set -q -t $copy destroy-unattached on
# }
# $@

請注意,這有效。從正在執行的 tmux 用戶端,++Ctrl建立一個新會話,並在目前會話的名稱後面附加一個數字,使用目前會話作為窗格的目標,然後切換到它。B CtrlC

我對此感到滿意,除了一個揮之不去的想法:我剛剛把一些簡單的事情變得比它需要的複雜得多。有沒有更簡單的方法來實現這個目標?

答案1

這就是我所做的:

alias ta='export NEW_SESSION=\$(uuidgen) ; tmux new-session -t 0 -s \$NEW_SESSION ; tmux kill-session -t \$NEW_SESSION'

其作用是從名為“0”的會話(如果未指定,第一個會話的名稱)創建一個新會話,命名為唯一隨機的內容(使用 uuidgen),然後在分離時殺死它。

請注意,我使用的是 zsh。 「ta」是「tmux Attach」的縮寫

相關內容