从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
,这是它的术语信息描述据 报道$ infocmp -1x xterm-256color
。具体来说,它的Ms
能力设置如下:
Ms=\E]52;%p1%s;%p2%s\007
我里面只有这三行~/.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
我通过包含文本将 OSC 52 序列发送到 Tmux 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
我通过包含文本将 OSC 52 序列发送到 Tmux 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"
否则,这两个 shell 命令的输出之一将包括test off
.
最后,我重置set-clipboard
为external
:
$ tmux set -s set-clipboard external
printf
我通过包含文本将 OSC 52 序列发送到 Tmux 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"
否则,这两个 shell 命令的输出之一将包括test external
.
set-clipboard
当我设置为on
和 to时,我理解结果off
,但当我设置为 时,我不明白结果external
。基于 Tmux 手册页的这句话:
如果设置为外部,tmux 将尝试设置终端剪贴板,但忽略应用程序设置 tmux 缓冲区的尝试。
我希望 Tmux 将 OSC 52 序列发送到 XTerm,而不创建内部缓冲区。实际上,它不会创建内部缓冲区(预期),但也不将 OSC 52 序列发送到 XTerm(意外)。
我一定是误解了这句话。我可以执行哪个实验来观察值external
和之间的差异off
?
答案1
不,你不太正确。该选项控制两个操作:
1)tmux是否使用OSC 52(或Ms中的任何内容)设置X剪贴板?
2) tmux 内的应用程序是否允许使用 OSC 52 创建 tmux 缓冲区?
所以三个 set-clipboard 选项值的含义是:
- off:1、2均为no;
- external:1为是,2为否(这是默认值);
- on:1和2都是yes。
使用复制模式复制文本总是创建一个 tmux 缓冲区,set-clipboard 对此没有影响。有三种方法可以创建 tmux 缓冲区:
- 在复制模式下复制文本(send -X copy-selection/copy-pipe/etc):总是创建一个 tmux 缓冲区;如果 set-clipboard 是,则设置 X 剪贴板不是离开;
- set-buffer/load-buffer:总是创建一个 tmux 缓冲区;永远不要设置 X 剪贴板;
- 来自 tmux 内部应用程序的 OSC 52:创建 tmux 缓冲区和设置 X 剪贴板,但前提是 set-clipboard 设置为 on。