urxvt 支持 OSC52 转义序列吗?

urxvt 支持 OSC52 转义序列吗?

OSC52 转义序列告诉终端将任意文本放入系统剪贴板中。我想利用这个事实能够通过 ssh 从远程 Vim 会话复制到本地剪贴板,如下所示这里。但是,关于我使用的终端 urxvt(也称为 rxvt-unicode)是否支持此转义序列,我收到了相互矛盾的信息。

我找到了一个名为 的 perl 脚本,它可能实现也可能不实现此功能clipboard-osc,并且我已将其添加到我的 urxvt 配置文件中,~/.Xdefaults并使用了行URxvt.perl-ext-common: clipboard-osc.我无法让它工作,并且有关此 perl 脚本(以及一般 urxvt 中的转义序列)的信息非常稀缺。

那么,urxvt 是否支持 OSC52 转义序列以进行剪贴板集成?如果是这样,我该如何使用它以及需要避免哪些可能的陷阱?

答案1

我找到了解决我的问题的办法。我将其发布在这里以供将来参考。

urxvt默认不支持OSC52转义序列,这是一个遗憾。然而,urxvt 通过 perl 脚本是高度可扩展的,因此有 perl 脚本添加了对 OSC52 的支持。一个例子是这个小脚本作者:GitHub 用户 parantapa。这样,您可以通过两个简单的步骤添加对 OSC52 的支持:

  • 将脚本复制到~/.urxvt/ext/52-osc
  • 通过将以下行添加到您的~/.Xdefaults配置文件中,在 urxvt 中获取它:URxvt.perl-ext-common: 52-osc

为了完整性和面向未来,这里是完整的脚本。

#! perl

=head1 NAME
52-osc - Implement OSC 32 ; Interact with X11 clipboard
=head1 SYNOPSIS
   urxvt -pe 52-osc
=head1 DESCRIPTION
This extension implements OSC 52 for interacting with system clipboard
Copied from GitHub user parantapa, who also reports most code came from:
http://ailin.tucana.uberspace.de/static/nei/*/Code/urxvt/
=cut

use MIME::Base64;
use Encode;

sub on_osc_seq {
    my ($term, $op, $args) = @_;
    return () unless $op eq 52;

    my ($clip, $data) = split ';', $args, 2;
    if ($data eq '?') {
        my $data_free = $term->selection();
        Encode::_utf8_off($data_free); # XXX
        $term->tt_write("\e]52;$clip;".encode_base64($data_free, '')."\a");
    }
    else {
        my $data_decoded = decode_base64($data);
        Encode::_utf8_on($data_decoded); # XXX
        $term->selection($data_decoded, $clip =~ /c/);
        $term->selection_grab(urxvt::CurrentTime, $clip =~ /c/);
    }

    ()
}

相关内容