如何将转义序列从嵌套 tmux 会话发送到 iTerm2?

如何将转义序列从嵌套 tmux 会话发送到 iTerm2?

这仅在 iTerm 中有效(将日期和时间放入剪贴板):

printf "\e]1337;Copy=:$(date | base64)\a"; echo $(pbpaste)

这适用于本地运行的 tmux(使用 DCS 直通):

printf "\ePtmux;\e\e]1337;Copy=:$(date | base64)\a\e\\"; echo $(pbpaste)

这适用于远程运行的 tmux:

printf "\ePtmux;\e\e]1337;Copy=:$(date | base64)\a\e\\"; echo $(ssh -p 2222 -qt localhost pbpaste)

我唯一的问题是在本地 tmux 下远程运行 tmux:

printf "\ePtmux;\e\ePtmux;\e\e]1337;Copy=:$(date | base64)\a\e\\\e\\"; echo $(ssh -p 2222 -qt localhost pbpaste)

我认为问题在于内部\e\\被解释为外部\e\\

是否有某种方法可以逃脱内部\e\\,使其正确成为外部 tmux?

答案1

您需要将每个 tmux 的每个 \e 加倍,包括终止 \e\\ 中的 \e,因此:

printf "\ePtmux;\e\ePtmux;\e\e]1337;Copy=:$(date | base64)\a\e\e\\\e\\"

或者,如果您将 tmux 配置为使用 OSC 52,然后在 iTerm2 中将其打开(通过快速搜索“终端中的应用程序可以访问剪贴板”),它将通过每个 tmux(在每个 tmux 中创建粘贴缓冲区)传递到主机剪贴板。对于 tmux 你将需要类似的东西:

set -as terminal-overrides ',tmux*:Ms=\\E]52;%p1%s;%p2%s\\007'
set -as terminal-overrides ',screen*:Ms=\\E]52;%p1%s;%p2%s\\007'
set -s set-clipboard on

然后你可以在最里面的 tmux 中执行此操作:

printf "\033]52;$(date)\007"

当然,这意味着您在 tmux 中复制的任何内容也会进入您可能不想要的主机剪贴板。

相关内容