Terminal

urxvt 是否支持 OSC52 轉義序列?

  • April 16, 2022

OSC52 轉義序列告訴終端將任意文本放入系統剪貼板。我想利用這個事實能夠通過 ssh 從遠端 Vim 會話複製到本地剪貼板,如此處所述。但是,關於我使用的終端 urxvt(也稱為 rxvt-unicode)是否支持此轉義序列,我得到了相互矛盾的資訊。

我找到了一個可能實現也可能不實現此功能的 perl腳本clipboard-osc~/.Xdefaults稱為 URxvt.perl-ext-common: clipboard-osc我無法讓它工作,關於這個 perl 腳本(以及一般 urxvt 中的轉義序列)的資訊非常稀缺。

那麼,urxvt 是否支持用於剪貼板集成的 OSC52 轉義序列?如果是這樣,我該如何使用它以及要避免哪些可能的陷阱?

我想出了一個解決我的問題的方法。我將在此處發布以供將來參考。

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

   ()
}

引用自:https://unix.stackexchange.com/questions/629398