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?
您需要将每个 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 中复制的任何内容也将进入您可能不想要的主机剪贴板。