来自man tmux
:
set-clipboard [on | external | off]
Attempt to set the terminal clipboard content using the xterm(1)
escape sequence, if there is an Ms entry in the terminfo(5)
description (see the TERMINFO EXTENSIONS section).
If set to on, tmux will both accept the escape sequence to create
a buffer and attempt to set the terminal clipboard. If set to
external, tmux will attempt to set the terminal clipboard but
ignore attempts by applications to set tmux buffers. If off,
tmux will neither accept the clipboard escape sequence nor
attempt to set the clipboard.
Note that this feature needs to be enabled in xterm(1) by setting
the resource:
disallowedWindowOps: 20,21,SetXprop
Or changing this property from the xterm(1) interactive menu when
required.
这就是我理解文档的方式;当 Tmux 接收到使用Ms
外部终端能力编码的序列时:
如果
set-clipboard
设置为on
,则序列用于设置终端剪贴板和Tmux 缓冲区如果
set-clipboard
设置为off
,则该序列既不用于设置终端剪贴板也不用于设置Tmux 缓冲区如果
set-clipboard
设置为external
,则该序列用于设置终端剪贴板,而不是Tmux 缓冲区
我正在使用 XTerm(补丁 322),$TERM
设置为xterm-256color
,这是它的terminfo 描述,由$ infocmp -1x xterm-256color
. 特别是,它的Ms
功能设置如下:
Ms=\E]52;%p1%s;%p2%s\007
我里面只有这 3 行~/.Xresources
:
XTerm*termName: xterm-256color
XTerm*disallowedWindowOps: 20,21,SetXprop
XTerm*selectToClipboard: true
我在没有配置的情况下启动 Tmux:
$ tmux -Lx -f/dev/null
我设置set-clipboard
为on
:
$ tmux set -s set-clipboard on
printf
我通过包含文本向 Tmux 发送一个 OSC 52 序列test on
:
$ printf '\e]52;c;%s\007' $(printf 'test on' | base64)
结果是 Tmux 创建了一个内部缓冲区,并将 OSC 52 序列发送到 XTerm,XTerm 填充了它的剪贴板test on
:
$ tmux lsb
buffer0: 7 bytes: "test on"
$ xsel -b
test on
现在我重置set-clipboard
为off
:
$ tmux set -s set-clipboard off
printf
我通过包含文本向 Tmux 发送一个 OSC 52 序列test off
:
$ printf '\e]52;c;%s\007' $(printf 'test off' | base64)
这一次,Tmux 没有创建新的内部缓冲区,也没有将 OSC 52 序列发送到 XTerm:
$ xsel -b
test on
$ tmux lsb
buffer0: 7 bytes: "test on"
否则,这 2 个 shell 命令的输出之一将包括test off
.
最后,我重置set-clipboard
为external
:
$ tmux set -s set-clipboard external
printf
我通过包含文本向 Tmux 发送一个 OSC 52 序列test external
:
$ printf '\e]52;c;%s\007' $(printf 'test external' | base64)
Tmux 没有创建新的内部缓冲区,也没有将 OSC 52 序列发送到 XTerm:
$ xsel -b
test on
$ tmux lsb
buffer0: 7 bytes: "test on"
否则,这 2 个 shell 命令的输出之一将包括test external
.
我理解设置set-clipboard
为on
和时的结果off
,但我不理解设置为 时的结果external
。基于 Tmux 手册页的这句话:
如果设置为 external,tmux 将尝试设置终端剪贴板,但忽略应用程序设置 tmux 缓冲区的尝试。
我本来希望 Tmux 将 OSC 52 序列发送到 XTerm,而不创建内部缓冲区。实际上,它不会创建内部缓冲区(预期),但也不会将 OSC 52 序列发送到 XTerm(意外)。
我一定误解了这句话。我可以进行哪个实验来观察值external
和之间的差异off
?
不,你不太正确。此选项控制两个操作:
1) tmux 是否将 X 剪贴板设置为 OSC 52(或 Ms 中的任何内容)?
2) tmux 中的应用程序是否允许使用 OSC 52 来创建 tmux 缓冲区?
所以三个 set-clipboard 选项值的意思是:
使用复制模式复制文本总是会创建一个 tmux 缓冲区,set-clipboard 对此没有影响。创建 tmux 缓冲区有以下三种方法: