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/);
}
()
}