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

Cha*_*ens 3 tmux escape-characters 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?

Nic*_*ott 5

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

printf "\ePtmux;\e\ePtmux;\e\e]1337;Copy=:$(date | base64)\a\e\e\\\e\\"
Run Code Online (Sandbox Code Playgroud)

或者,如果您将 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
Run Code Online (Sandbox Code Playgroud)

然后你可以在最里面的 tmux 中做到这一点:

printf "\033]52;$(date)\007"
Run Code Online (Sandbox Code Playgroud)

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