Terminal
urxvt 是否支持 OSC52 轉義序列?
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/); } () }