4 poin oleh GN⁺ 2024-06-08 | 1 komentar | Bagikan ke WhatsApp
  • lsix adalah skrip Bash yang menampilkan gambar sebagai thumbnail di dalam terminal untuk direktori saat ini atau daftar file yang ditentukan, seperti ls, dan outputnya menggunakan grafik Sixel
  • Menggunakan ImageMagick untuk menangani berbagai format gambar, dan jika GIF atau file yang berisi banyak gambar ditentukan di baris perintah, frame-frame-nya akan dibentangkan dan ditampilkan sebagai montase
  • Mendeteksi apakah terminal mendukung Sixel, warna latar depan dan latar belakang, apakah register warna bisa diperluas, serta lebar jendela untuk menyesuaikan kualitas dan tata letak thumbnail
  • Instalasi cukup dengan menempatkan file lsix di path dan menyiapkan ImageMagick; di macOS, ImageMagick juga bisa dipasang bersamaan dengan brew install lsix
  • XTerm secara default mematikan mode Sixel dan beberapa terminal tidak kompatibel, jadi sebelum dipakai perlu memastikan terminal tersebut memang kompatibel dengan Sixel

Alat daftar gambar terminal yang dipakai seperti ls

  • lsix adalah alat yang mirip ls untuk gambar, menampilkan thumbnail file secara inline di terminal
  • Cara menjalankannya sangat sederhana
    • Cukup ketik lsix untuk menampilkan gambar di direktori kerja saat ini
    • Nama file bisa ditentukan dalam bentuk lsix [ FILES ... ]
    • Wildcard shell dapat digunakan, jadi perintah seperti lsix *jpg * png bisa dijalankan
  • Output menggunakan grafik Sixel

Penanganan format dan cara tampilan berbasis ImageMagick

  • Karena menggunakan ImageMagick, berbagai format gambar didukung
  • Format seperti PDF yang bisa lambat dirender tidak akan ditampilkan kecuali diminta secara eksplisit
    • Untuk memaksa format tertentu agar ikut ditampilkan, tentukan nama file secara langsung atau gunakan wildcard seperti *.pdf
  • Jika GIF atau file yang berisi banyak gambar ditentukan di baris perintah, semua frame akan dibentangkan dan ditampilkan sebagai montase
    • Sebagian frame GIF dapat menyimpan hanya piksel yang berubah dibanding frame sebelumnya
  • Grafik non-bitmap juga bisa berfungsi
    • Contoh: .svg, .eps, .pdf, .xcf

Fitur deteksi lingkungan terminal

  • lsix menggunakan control sequence untuk mendeteksi apakah terminal dapat menampilkan grafik Sixel secara inline
  • Kanal alfa pada PNG dan SVG diproses agar sesuai dengan warna latar belakang terminal
    • lsix mencoba mengetahui warna latar depan dan latar belakang lewat escape sequence terminal
    • Warna latar depan digunakan sebagai warna isi teks
  • Jika mendeteksi terminal seperti xterm yang dapat menambah jumlah register warna, lsix akan memperluasnya secara otomatis untuk meningkatkan kualitas gambar
  • Pada terminal yang mendukung dtterm WindowOps, jumlah tile per baris disesuaikan dengan lebar jendela
  • Saat ada banyak gambar dalam direktori, pemrosesan dilakukan agar tidak perlu menunggu pembuatan seluruh montase selesai
    • Jika jumlah gambar lebih dari 21, gambar akan ditampilkan per baris
  • Jika nama file terlalu panjang, teks akan dibungkus sebelum dikirim ke ImageMagick montage
    • Jika memakai montage tanpa lsix, nama file yang panjang bisa saling bertumpuk
  • Nama file Unicode akan berfungsi jika font yang dipakai memiliki glif yang sesuai

Cara instalasi dan konfigurasi

  • Instalasi cukup dengan menempatkan file lsix ke path seperti /usr/local/bin lalu menjalankannya
  • lsix adalah skrip shell Bash
  • Perangkat lunak yang wajib hanya ImageMagick
    • Contoh: apt-get install imagemagick
  • Pengguna macOS dapat memakai brew install lsix
    • Jika diperlukan, ImageMagick juga akan dipasang bersamaan
  • Desain saat ini sangat sederhana
    • Tidak ada flag baris perintah
    • Tidak ada file konfigurasi
    • Tidak ada knob penyesuaian
  • Nilai seperti lebar tile, keluarga font, dan ukuran point bisa diubah dengan mengedit variabel di bagian atas file
    • Daftar font yang terpasang bisa dilihat dengan convert -list font

Persyaratan terminal dengan dukungan Sixel

  • Terminal harus mendukung grafik Sixel
  • Anda bisa menguji terminal dengan mengeluarkan satu gambar sebagai Sixel
convert foo.jpg -geometry 800x480 sixel:-
  • Pengembangan dilakukan dengan mode emulasi vt340 milik xterm
  • Secara default, mode Sixel pada XTerm tidak aktif
    • Saat menjalankan, Anda dapat memakai xterm -ti vt340
    • Atau tambahkan xterm*decTerminalID : vt340 ke .Xresources lalu jalankan xrdb -merge .Xresources
  • Beberapa distribusi seperti Fedora dapat mengompilasi xterm tanpa dukungan Sixel
    • Dalam kasus ini, Anda bisa mencoba terminal alternatif seperti foot atau mlterm

Terminal yang kompatibel dan tidak kompatibel

  • Terminal yang dikonfirmasi atau dilaporkan kompatibel dengan Sixel
    • XTerm, MLterm, foot, Wezterm, Contour, iTerm2 for Apple MacOS, dan Yaft telah diuji
    • Konsole, yakuake, WSLtty for Microsoft Windows, MinTTY for Cygwin, kompilasi khusus VTE, sixel-tmux, dan ttyd telah dilaporkan
  • Terminal yang tidak kompatibel dengan Sixel
    • MacOS Terminal, kitty
    • Terminal berbasis libvte standar
      • gnome-terminal
      • terminator
      • lxterm
    • Alacritty dapat berfungsi jika patch ini diterapkan

Bug dan batasan yang diketahui

  • Mode reverse video XTerm xterm -rv berbeda dari menentukan warna latar depan dan latar belakang secara eksplisit
    • Penentuan eksplisit bisa dideteksi, tetapi resource reverseVideo tidak bisa dideteksi sehingga warna latar belakang bisa salah
  • Lebar layar XTerm saat ini dibatasi hingga 1000px
    • Batas ini akan dihapus jika xterm sudah bisa menangani gambar lebih besar dari 1000x1000
    • Pengujian terakhir dilakukan pada XTerm(344)
  • Nama file yang diawali @ diperlakukan secara khusus oleh ImageMagick
    • Harus diberi awalan direktori seperti lsix ./@foo.png
    • Ini bukan bug lsix, melainkan bug ImageMagick
  • Jika string kosong "" diberikan sebagai nama file, ImageMagick akan macet
    • Ini tampak seperti bug atau perilaku yang salah pada ImageMagick
  • Pembungkusan baris untuk nama file panjang berfungsi, tetapi tidak cerdas
    • Pembungkusan berdasarkan spasi, tanda hubung, underscore, atau titik belum diterapkan
  • Jika direktori ditentukan di baris perintah, perilakunya diperlakukan seolah pengguna melakukan cd ke direktori tersebut
    • Pemrosesan rekursif sebenarnya tidak sulit, tetapi penulis enggan menambah flag baris perintah pada skrip yang sederhana ini
  • Menjalankan lsix foo.avi dapat menimbulkan masalah

Standar Sixel dan keterbatasan implementasi

  • Tampaknya standar Sixel tidak memiliki cara untuk melakukan query ukuran layar grafis
  • Berdasarkan dokumentasi VT340, program harus sudah mengetahui resolusi perangkat target render
  • XTerm 344 menambahkan control sequence CSI ? Pi ; Pa ; Pv S untuk mengatasi masalah ini
    • Beberapa terminal seperti mlterm belum mengimplementasikannya
  • Ada alternatif membaca ukuran jendela lewat ekstensi dtterm WindowOps
    • Geometri layar grafis Sixel dan ukuran jendela tidak harus sama, jadi ini bukan solusi yang benar-benar akurat
    • Misalnya xterm membatasi geometri grafis ke 1000x1000 walaupun jendelanya lebih besar
  • Jika kedua metode gagal, lsix mengasumsikan lingkungan VT340
    • Resolusinya 800x480
    • Diasumsikan hanya muat 6 tile per baris
  • Standar Sixel juga tidak menyediakan cara untuk melakukan query jumlah register warna yang tersedia
    • lsix menggunakan ekstensi xterm
    • Jika terminal tidak merespons, lsix mengasumsikan VT340 asli dan hanya memakai 16 register warna

Alasan tidak memakai libsixel

  • libsixel adalah proyek yang menghasilkan perintah grafik Sixel yang dioptimalkan
  • lsix memakai Bash dan ImageMagick, bukan libsixel
    • Bash dan ImageMagick tersedia luas sehingga lebih mudah berjalan di mana saja
    • Skrip dijaga tetap sederhana agar pengguna mudah memodifikasi dan memperluasnya
    • ImageMagick dapat membaca lebih banyak format input dibanding stb_image yang dipakai img2sixel dari libsixel
      • Contoh: xpm, svg, 16-bit png, file sixel
    • ImageMagick dapat membaca input dan langsung menulis output Sixel
    • libsixel mungkin lebih cepat, tetapi untuk menampilkan daftar direktori sederhana, ImageMagick juga sudah cukup cepat

Referensi

1 komentar

 
GN⁺ 2024-06-08
Komentar di Hacker News
  • Jika, seperti saya, sulit memakai terminal tanpa tmux, branch Sixel yang sebelumnya eksperimental akhirnya digabung sekitar 10 bulan lalu
    Sekarang Anda bisa membangun tmux mainline dengan --enable-sixel dan memakai tool seperti lsix di dalam tmux
    Kalau penasaran apakah terminal atau terminal multiplexer favorit Anda mendukung Sixel, lihat situs "Are We Sixel Yet"
    https://github.com/tmux/tmux/commit/dfbc6b1888c110cf0ade66f2...
    https://www.arewesixelyet.com

    • Saya beralih ke Zellij beberapa tahun lalu, dan sejak sekitar 2022 saya memakai dukungan Sixel dengan baik
      Jika ingin mengubah workflow, menurut saya pengalaman default-nya jauh lebih baik daripada tmux
      Fitur-fitur yang biasanya harus ditambahkan dengan plugin eksternal dan skrip konfigurasi rumit sudah tersedia secara default, dan stabilitas serta performanya juga jauh lebih baik
      https://zellij.dev/
    • Saya belum terlalu paham kegunaan tmux
      Bisa jelaskan kenapa itu menjadi tool wajib dalam workflow, dan kenapa bisa juga wajib untuk pekerjaan saya?
    • Tapi kenapa dibutuhkan? Apakah ada alasan untuk memaksakan grafis piksel masuk ke grid resolusi rendah berbasis teks? Bukankah cukup memakai grafis piksel saja?
    • Saya sudah lama memakai tmux dan sebelumnya memakai screen, tetapi saya belum begitu paham kenapa Sixel membuat perbedaan besar
      Apakah ini perubahan semacam membawa window manager bertipe stacking ke tmux dibanding pendekatan tiling saat ini? Atau sekadar membuat grafis terminal menjadi lebih baik? Apakah saya benar-benar salah paham?
      Kalau hanya membuat grafis lebih baik, saya kurang paham kenapa tmux harus mendukungnya; sepertinya sisi terminal emulator seperti Gnome Terminal yang lebih penting. Mungkin keduanya memang diperlukan, tapi saya kira tmux cukup meneruskannya saja
    • Ada yang tahu apakah Sixel aktif jika memasang tmux lewat brew?
  • Fitur yang paling saya suka di repositori ini adalah direktori README.md.d
    Ini ide yang cukup bagus, dan sepertinya .md bisa dihilangkan saja

    • Langkah yang benar-benar kuat adalah menyematkan gambar langsung sebagai Sixel di dalam file README
      Dengan begitu, cukup cat README saja gambarnya bisa tampil apa adanya
  • Menggunakan "\e[c" untuk mendeteksi dukungan Sixel secara otomatis
    https://github.com/hackerb9/lsix/blob/3a431793a747df3f934051...
    "\e[c" adalah "send device attributes"
    https://invisible-island.net/xterm/ctlseqs/ctlseqs.html#h3-F...

  • Idenya keren, tapi tidak berfungsi di PuTTY/KiTTY
    Saat menjalankan $ lsix, muncul error bahwa terminal tidak melaporkan dukungan grafis Sixel, dan menyarankan memakai terminal yang mendukung Sixel seperti xterm -ti vt340 atau meminta pembuat terminal menambahkan dukungan
    Gambar tunggal bisa diuji dengan convert foo.jpg -geometry 800x480 sixel:-, dan jika terminal benar-benar mendukungnya, diminta melaporkan bug ke http://github.com/hackerb9/lsix/issues
    Kode atribut perangkat ditampilkan sebagai ^[[?6c
    Sayang sekali. Padahal pasti cukup keren. Apakah ada terminal Windows open-source yang mendukung Sixel? Kebanyakan yang terlihat hanya untuk Cygwin atau WSL, dan sulit menemukan yang murni untuk Windows

    • Belakangan saya mulai memakai wezterm dan cukup menyukainya
      Cross-platform dan mendukung grafis Sixel
      https://github.com/wez/wezterm
    • Mintty adalah terminal Windows yang bagus dan mendukung Sixel
  • Di keluarga yang mirip, ada juga timg: https://github.com/hzeller/timg

  • iTerm2 untuk MacOS punya fitur serupa bawaan, dan bebannya di sisi server lebih kecil
    Alih-alih merender gambar menjadi Sixel di server dengan banyak library gambar, seluruh gambar di-encode sebagai base64 dan dikirim ke klien, lalu klien menentukan format gambar dan merendernya secara lokal di terminal
    https://iterm2.com/documentation-images.html

    • konsole juga mengimplementasikan protokol yang sama
      Di Linux, saya memakai skrip imgcat tanpa modifikasi apa pun
      Tentu jauh lebih cepat daripada konversi dengan ImageMagick, tetapi untuk sementara saya juga menambahkan lsix ke direktori bin
  • Perlu berhati-hati saat menjalankannya di direktori yang tidak tepercaya
    Terutama hal-hal yang mem-parsing gambar seperti PDF bisa berbahaya seperti tool lain, dan saat memakai ImageMagick perlu lebih waspada

    • Apakah mem-parsing gambar yang tidak tepercaya memang pada dasarnya bermasalah?
      Jika saya membuka folder unduhan yang tidak tepercaya dengan Gnome Files, lalu ia menampilkan dan karena itu mem-parsing gambar-gambar di dalamnya, apakah itu isu keamanan yang perlu diperhatikan?
      Saya mengira hal seperti JavaScript di dalam PDF bisa menjadi masalah, tetapi tidak menyangka pratinjau sederhana pun berbahaya
  • Terminal yang dipakai harus mendukung grafis Sixel

    • Saya membuat library grafis untuk terminal yang tidak mendukung Sixel
      https://github.com/dheera/python-termgraphics
      Akan menarik jika library ini dimodifikasi agar mendukungnya sebagai jalur fallback
    • xterm mendukung Sixel, jadi semua yang menetapkan nilai seperti TERM=xterm256-color pasti kompatibel… benar, kan? batuk gnome-terminal batuk
    • mlterm berfungsi
  • fzf menyediakan dukungan gambar Sixel eksperimental di panel pratinjau sejak 0.44.0
    Tidak dapat digunakan di Windows
    https://github.com/junegunn/fzf/releases/tag/0.44.0
    fzf --preview='fzf-preview.sh {}'

    • Sebagai alternatif, bisa memakai fzf --preview 'convert {} -geometry 800x480 sixel:-'
      Ini juga memerlukan instalasi ImageMagick