是否有更优雅的方法来取消链接两个 tmux 客户端从 tmux 内部共享会话?

Cal*_*leb 5 tmux configuration dot-files

这几乎是一个代码审查问题,但非常*牛逼,更多的是关于配置而不是代码。自从我转行以来的几年里tmux,screen我遇到了一些烦人的问题,我无法按照我希望的方式工作。由于我将 shell 设置为 exec 进入 tmux 会话,因此我最终决定是时候修复这个问题了。

默认情况下,当您将两个 tmux 客户端附加到同一个会话时,它们会被锁定在一起。一个切换窗格,两个同步切换。这与默认行为是一组共享窗格但客户端本身是独立的屏幕不同。

我想要的是一种解除绑定到同一会话的两个 tmux 客户端的方法。如果您在 tmux 之外并启动新客户端,这很容易做到。只需使用对父会话的引用开始一个新会话:

tmux new-session -t original_session -s new_session
Run Code Online (Sandbox Code Playgroud)

但是,在您进入客户端并希望将其与共享该会话的任何其他客户端断开链接后,尝试执行此操作,事情会变得更加复杂。我尝试了几十种方法,但从未找到一种效果很好的方法。我得到的最接近的是bind <key> prompt-command ...用来提示旧的和新的会话名称。无论出于何种原因,tmux 都不会#{session_name}在 anew-session或 的参数中扩展变量prompt-command。它在许多其他命令的参数中起作用(例如我在run下面使用它)但没有这种扩展,这个特定的任务突然变得复杂。即使手动输入值,它也只能正常工作。

今天我终于让它工作了。然而,结果比我想要的更丑陋。它需要一个 shell 函数来完成大部分的魔法。为了在不涉及外部脚本的情况下将其包含在配置文件中(为了 dotfile 可移植性),我正在使用 hack。如果去掉前两列,配置实际上可以作为 shell 脚本执行。将所有内容都封装在函数中后,您可以从任何键绑定中调用所需的脚本部分。shell 脚本位是配置中的注释,而在 shell 脚本中,配置位与 here-doc 一起被丢弃。

今天的解决方案是这样的(我的完整.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
# }
# $@
Run Code Online (Sandbox Code Playgroud)

请注意,这是有效的。从运行的客户端TMUX,Ctrl+ B Ctrl+C创建具有追加到当前一个的名称的数的新的会话,使用当前一个作为用于窗格的目标,并切换到它。

我对此很满意,只是有一个唠叨的想法,即我只是将一些简单的东西变得比需要的复杂得多。有没有更简单的方法来实现这一目标?

小智 1

这就是我所做的:

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

其作用是从名为“0”的会话(如果未指定,第一个会话的名称)创建一个新会话,命名为唯一随机的内容(使用 uuidgen),然后在分离时杀死它。

请注意,我使用的是 zsh。“ta”是“tmux Attach”的缩写