Linux

有什麼辦法可以讓urxvt 支持sixel?

  • March 30, 2019

最近有一個流行的 github repo 叫做lsix,它使用Sixel圖形在終端內顯示圖像。目前我正在使用rxvt-unicode作為我的終端模擬器,但它似乎不適用於 Sixel。

有誰知道如何讓它支持sixel?

(我正在使用 Ubuntu 18.04 LTS 僅供參考)

除了使用rxvt-unicode-sixel fork 之外,還可以通過編寫 perl 擴展來實現 Sixel。相關文件在urxvtperl(3)聯機幫助頁中。我對 Sixel 了解不多,但我想這是一個問題:

  • 攔截 Sixel 轉義序列,解釋它們並且不讓它們傳遞給主轉義序列解釋器。您可以用換行符替換序列以替換正確的行數以適合圖像的高度,也可以縮放以適合寬度。
  • 繪製圖像。您可以通過 urxvt 為擴展提供的 API 獲取正確的視窗 ID,並在需要時使用正常 xlib 或 xcb 函式來繪製圖像。
  • 注意諸如滾動以根據需要重繪圖像之類的事件。

我在這裡看到了許多可以配置的可能性,儘管我不知道是否有關於 Sixel 實現的標準。例如,調整終端大小時圖像會發生什麼?剪裁了嗎?是否按比例縮放?僅在創建或每次調整大小時?當游標然後移動到圖像上並且一個人寫了足夠的文字來換行時會發生什麼?當您調整大小時,圖像和包裝文本會發生什麼?等等

我認為理想的情況是最初以終端寬度和圖像尺寸之間較小的比例繪製它,並將其設置為圖像的最大尺寸。在終端調整大小時重新縮放圖像,同時尊重最大尺寸集。關於在其上繪製的文本,在重繪圖像時將文本保留在圖像上可能會有點複雜……

抱歉,我似乎有點興奮,超出了您的回答範圍。真希望我有時間來做這件事。

編輯:為了回答關於使用 urxvt perl 擴展的像素的能力的評論中的懷疑,這裡是一個概念證明。它在左上角的座標 (10, 10) 上設置一個像素為白色:

use strict;
use warnings;
use X11::Protocol;

my $X = X11::Protocol->new;

sub on_refresh_end {
 my $term = shift(@_);
 my $gc = $X->new_rsrc;
 $X->CreateGC($gc, $term->vt,
   foreground => $X->white_pixel);
 $X->PolyPoint($term->vt, $gc, 0, (10,10));
 $X->flush;
}

要安裝此擴展,請將其放入 中~/.urxvt/ext/sixel-proof-of-concept,通過添加行將其添加到 ~/.Xresources(或 ~/.Xdefaults,如果你使用它),通過 doURxvt.perl-ext-common: sixel-proof-of-concept載入它xrdb ~/.Xresources,並確保X11::Protocol安裝了 perl 模組。

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