Tmux 中“set-clipboard”选项的值“off”和“external”有什么区别?

Tmux 中“set-clipboard”选项的值“off”和“external”有什么区别?

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-clipboardon

$ 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-clipboardoff

$ 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-clipboardexternal

$ 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。

相关内容