4 điểm bởi GN⁺ 2024-06-08 | 1 bình luận | Chia sẻ qua WhatsApp
  • lsix là một script Bash hiển thị ảnh dưới dạng thumbnail ngay trong terminal cho thư mục hiện tại hoặc danh sách tệp được chỉ định, tương tự ls, và sử dụng đồ họa Sixel cho phần hiển thị
  • Dùng ImageMagick để xử lý nhiều định dạng ảnh; nếu chỉ định GIF hoặc tệp chứa nhiều ảnh trên dòng lệnh, nó sẽ bung các khung hình ra và hiển thị dưới dạng montage
  • Tự phát hiện terminal có hỗ trợ Sixel hay không, màu tiền cảnh/nền, khả năng mở rộng color register và chiều rộng cửa sổ để điều chỉnh chất lượng thumbnail và bố cục
  • Cài đặt bằng cách đặt tệp lsix vào trong PATH và chuẩn bị ImageMagick; trên macOS có thể dùng brew install lsix để cài luôn cả ImageMagick
  • XTerm mặc định tắt chế độ Sixel và một số terminal không tương thích, nên cần kiểm tra terminal có tương thích Sixel hay không trước khi sử dụng thực tế

Công cụ liệt kê ảnh trong terminal dùng như ls

  • lsix là công cụ gần giống ls dành cho ảnh, hiển thị thumbnail tệp inline trong terminal
  • Cách chạy cơ bản rất đơn giản
    • Chỉ cần nhập lsix là sẽ hiển thị ảnh trong thư mục làm việc hiện tại
    • Có thể chỉ định tên tệp theo dạng lsix [ FILES ... ]
    • Có thể dùng wildcard của shell, ví dụ lsix *jpg * png
  • Phần hiển thị sử dụng Sixel

Xử lý định dạng và cách hiển thị dựa trên ImageMagick

  • Vì dùng ImageMagick, công cụ hỗ trợ nhiều định dạng ảnh khác nhau
  • Những định dạng có thể render chậm như PDF sẽ không được hiển thị nếu không được yêu cầu rõ ràng
    • Muốn liệt kê cưỡng bức một định dạng cụ thể thì chỉ định trực tiếp tên tệp hoặc dùng wildcard như *.pdf
  • Nếu chỉ định GIF hoặc tệp chứa nhiều ảnh trên dòng lệnh, tất cả khung hình sẽ được bung ra và hiển thị thành montage
    • Với GIF, một số khung hình có thể chỉ lưu các pixel thay đổi so với khung trước
  • Cả đồ họa không phải bitmap cũng có thể hoạt động
    • Ví dụ: .svg, .eps, .pdf, .xcf

Tính năng phát hiện môi trường terminal

  • lsix dùng control sequence để phát hiện terminal có thể hiển thị đồ họa Sixel inline hay không
  • Kênh alpha của PNG và SVG được xử lý theo màu nền của terminal
    • lsix cố gắng lấy màu tiền cảnh và màu nền bằng terminal escape sequence
    • Màu tiền cảnh được dùng cho màu tô văn bản
  • Nếu phát hiện terminal như xterm có thể tăng số lượng color register, nó sẽ tự mở rộng để nâng chất lượng ảnh
  • Với terminal hỗ trợ dtterm WindowOps, số tile trên mỗi hàng sẽ được điều chỉnh theo chiều rộng cửa sổ
  • Khi thư mục có nhiều ảnh, công cụ xử lý để không phải chờ tạo xong toàn bộ montage
    • Nếu có hơn 21 ảnh, nó sẽ hiển thị theo từng hàng
  • Nếu tên tệp quá dài, văn bản sẽ được ngắt dòng trước khi chuyển cho ImageMagick montage
    • Nếu dùng montage trực tiếp không qua lsix, tên tệp dài có thể chồng lên nhau
  • Tên tệp Unicode sẽ hoạt động nếu font đang dùng có glyph tương ứng

Cách cài đặt và cấu hình

  • Có thể cài bằng cách đặt tệp lsix vào đường dẫn như /usr/local/bin rồi chạy
  • lsix là script shell Bash
  • Phần mềm bắt buộc duy nhất là ImageMagick
    • Ví dụ: apt-get install imagemagick
  • Người dùng macOS có thể dùng brew install lsix
    • Nếu cần, ImageMagick cũng sẽ được cài cùng
  • Thiết kế hiện tại rất tối giản
    • Không có cờ dòng lệnh
    • Không có tệp cấu hình
    • Không có nút tinh chỉnh
  • Các giá trị như độ rộng tile, font family, cỡ point có thể thay đổi bằng cách sửa biến ở đầu tệp
    • Có thể xem danh sách font đã cài bằng convert -list font

Yêu cầu terminal hỗ trợ Sixel

  • Terminal phải hỗ trợ đồ họa Sixel
  • Có thể kiểm tra terminal bằng cách xuất một ảnh đơn dưới dạng Sixel
convert foo.jpg -geometry 800x480 sixel:-
  • Quá trình phát triển dùng chế độ mô phỏng vt340 của xterm
  • XTerm mặc định không bật chế độ Sixel
    • Khi chạy có thể dùng xterm -ti vt340
    • Hoặc thêm xterm*decTerminalID : vt340 vào .Xresources rồi chạy xrdb -merge .Xresources
  • Một số bản phân phối như Fedora có thể biên dịch xterm mà không có hỗ trợ Sixel
    • Trong trường hợp đó có thể thử terminal thay thế như foot hoặc mlterm

Terminal tương thích và không tương thích

  • Các terminal đã được xác nhận hoặc báo cáo là tương thích Sixel
    • XTerm, MLterm, foot, Wezterm, Contour, iTerm2 for Apple MacOS, Yaft đã được kiểm thử
    • Konsole, yakuake, WSLtty for Microsoft Windows, MinTTY for Cygwin, VTE special compile, sixel-tmux, ttyd đã được báo cáo
  • Terminal không tương thích Sixel
    • MacOS Terminal, kitty
    • Terminal chuẩn dựa trên libvte
      • gnome-terminal
      • terminator
      • lxterm
    • Alacritty có thể hoạt động nếu áp dụng bản vá

Lỗi đã biết và giới hạn

  • Chế độ reverse video xterm -rv của XTerm khác với việc chỉ định rõ màu tiền cảnh và nền
    • Việc chỉ định tường minh có thể phát hiện được, nhưng không thể phát hiện tài nguyên reverseVideo nên màu nền có thể sai
  • Chiều rộng màn hình của XTerm hiện bị giới hạn ở 1000px
    • Giới hạn này sẽ được gỡ khi xterm có thể xử lý ảnh lớn hơn 1000x1000
    • Lần kiểm thử cuối cùng là với XTerm(344)
  • Tên tệp bắt đầu bằng @ được ImageMagick xử lý theo cách đặc biệt
    • Cần thêm thư mục phía trước như lsix ./@foo.png
    • Đây là lỗi của ImageMagick chứ không phải lsix
  • Nếu chỉ định chuỗi rỗng "" làm tên tệp, ImageMagick sẽ treo
    • Có vẻ là lỗi hoặc hành vi sai của ImageMagick
  • Việc ngắt dòng tên tệp dài có hoạt động nhưng chưa thông minh
    • Chưa hỗ trợ ngắt theo khoảng trắng, dấu gạch nối, dấu gạch dưới hoặc dấu chấm
  • Nếu chỉ định thư mục trên dòng lệnh, công cụ sẽ xử lý như thể người dùng đã cd vào thư mục đó
    • Xử lý đệ quy không khó, nhưng tác giả ngần ngại thêm cờ dòng lệnh vào một script đơn giản
  • Chạy lsix foo.avi có thể gây sự cố

Chuẩn Sixel và các giới hạn trong triển khai

  • Có vẻ chuẩn Sixel không có cách truy vấn kích thước màn hình đồ họa
  • Theo tài liệu VT340, chương trình phải biết trước độ phân giải của thiết bị render
  • XTerm 344 bổ sung control sequence CSI ? Pi ; Pa ; Pv S để giải quyết vấn đề này
    • Một số terminal như mlterm vẫn chưa triển khai
  • Có một cách thay thế là đọc kích thước cửa sổ bằng phần mở rộng dtterm WindowOps
    • Kích thước màn hình đồ họa Sixel và kích thước cửa sổ không nhất thiết giống nhau nên đây không phải lời giải chính xác
    • Ví dụ, xterm giới hạn hình học đồ họa ở 1000x1000 dù cửa sổ lớn hơn
  • Nếu cả hai cách đều thất bại, lsix sẽ giả định đang ở môi trường VT340
    • Độ phân giải là 800x480
    • Mỗi hàng chỉ chứa được 6 tile
  • Chuẩn Sixel cũng không cung cấp cách truy vấn số lượng color register khả dụng
    • lsix dùng phần mở rộng của xterm
    • Nếu terminal không phản hồi, nó sẽ giả định VT340 gốc và chỉ dùng 16 color register

Vì sao không dùng libsixel

  • libsixel là dự án xuất ra các lệnh đồ họa Sixel đã được tối ưu hóa
  • lsix dùng Bash và ImageMagick thay vì libsixel
    • Đây là lựa chọn để Bash và ImageMagick, vốn phổ biến rộng rãi, có thể giúp công cụ chạy dễ dàng ở nhiều nơi
    • Giữ script đơn giản để người dùng dễ sửa đổi và mở rộng
    • ImageMagick có thể đọc nhiều định dạng đầu vào hơn stb_imageimg2sixel của libsixel sử dụng
      • Ví dụ: xpm, svg, 16-bit png, tệp sixel
    • ImageMagick có thể đọc đầu vào và trực tiếp ghi ra đầu ra Sixel
    • libsixel có thể nhanh hơn, nhưng với việc hiển thị danh sách thư mục đơn giản thì ImageMagick cũng đủ nhanh

Tài liệu tham khảo

1 bình luận

 
GN⁺ 2024-06-08
Ý kiến trên Hacker News
  • Nếu giống tôi, khó mà dùng terminal nếu không có tmux, thì nhánh Sixel từng ở mức thử nghiệm cuối cùng đã được hợp nhất khoảng 10 tháng trước
    Giờ có thể build tmux mainline với --enable-sixel để dùng các công cụ như lsix ngay trong tmux
    Nếu muốn biết terminal hay terminal multiplexer bạn thích có hỗ trợ Sixel hay không, hãy xem trang "Are We Sixel Yet"
    https://github.com/tmux/tmux/commit/dfbc6b1888c110cf0ade66f2...
    https://www.arewesixelyet.com

    • Tôi đã chuyển sang Zellij vài năm trước, và dùng khá tốt hỗ trợ Sixel từ một thời điểm nào đó trong năm 2022
      Nếu muốn thay đổi workflow, theo tôi trải nghiệm mặc định của nó tốt hơn tmux rất nhiều
      Nhiều tính năng vốn phải thêm bằng plugin ngoài và script cấu hình phức tạp thì nay đã có sẵn, độ ổn định và hiệu năng cũng tốt hơn hẳn
      https://zellij.dev/
    • Tôi không thực sự hiểu rõ tmux dùng để làm gì
      Có thể giải thích vì sao nó trở thành công cụ thiết yếu trong workflow, và vì sao nó có thể cũng là thứ thiết yếu với công việc của tôi không?
    • Nhưng tại sao lại cần nó? Tại sao phải cố nhét đồ họa pixel vào một lưới độ phân giải thấp dựa trên văn bản? Sao không dùng đồ họa pixel luôn cho rồi?
    • Tôi đã dùng tmux từ rất lâu, và trước đó là screen, nhưng không rõ Sixel tạo ra khác biệt lớn ở điểm nào
      So với kiểu chia ô hiện tại, đây có phải là mức thay đổi như mang window manager dạng ngăn xếp vào tmux không? Hay chỉ đơn giản là đồ họa terminal đẹp hơn thôi? Hay là tôi đang hiểu sai hoàn toàn?
      Nếu chỉ là đồ họa đẹp hơn thì tôi không hiểu vì sao tmux phải hỗ trợ, mà có vẻ phía terminal emulator như Gnome Terminal mới là chỗ quan trọng. Có thể cả hai đều cần, nhưng tôi từng nghĩ tmux chỉ cần chuyển tiếp là đủ
    • Có ai biết cài tmux bằng brew thì Sixel có được bật hay không không?
  • Tính năng tôi thích nhất trong repo này là thư mục README.md.d
    Ý tưởng khá hay, và có lẽ thậm chí không cần phải có phần .md

    • Nước đi thật sự cao tay là nhúng ảnh trực tiếp dưới dạng Sixel vào trong file README
      Khi đó chỉ cần cat README là cũng có thể thấy ảnh hiện ra nguyên vẹn
  • Dùng "\e[c" để tự động phát hiện hỗ trợ Sixel
    https://github.com/hackerb9/lsix/blob/3a431793a747df3f934051...
    "\e[c" là "send device attributes"
    https://invisible-island.net/xterm/ctlseqs/ctlseqs.html#h3-F...

  • Ý tưởng rất hay nhưng không chạy trên PuTTY/KiTTY
    Khi chạy $ lsix, terminal báo lỗi rằng không hỗ trợ đồ họa Sixel, và bảo hãy dùng terminal có hỗ trợ Sixel như xterm -ti vt340 hoặc yêu cầu nhà phát triển terminal thêm hỗ trợ
    Có thể thử một ảnh đơn bằng convert foo.jpg -geometry 800x480 sixel:-, và nếu terminal thực sự có hỗ trợ thì được hướng dẫn báo lỗi tại http://github.com/hackerb9/lsix/issues
    Mã thuộc tính thiết bị được hiển thị là ^[[?6c
    Tiếc thật. Trông nó đã có thể rất ấn tượng. Có terminal Windows mã nguồn mở nào hỗ trợ Sixel không? Phần lớn tôi chỉ thấy phía Cygwin hay WSL, chứ terminal thuần Windows thì khó thấy

    • Gần đây tôi bắt đầu dùng wezterm và khá thích nó
      Nó đa nền tảng và hỗ trợ đồ họa Sixel
      https://github.com/wez/wezterm
    • Mintty là một terminal Windows rất tốt có hỗ trợ Sixel
  • Cùng nhóm tương tự còn có timg: https://github.com/hzeller/timg

  • iTerm2 trên MacOS có sẵn tính năng tương tự, và gánh nặng phía server còn nhẹ hơn
    Thay vì render ảnh thành Sixel trên server bằng nhiều thư viện ảnh, nó chỉ mã hóa toàn bộ ảnh thành base64 rồi gửi cho client, sau đó client tự xác định định dạng ảnh và render cục bộ trong terminal
    https://iterm2.com/documentation-images.html

    • konsole cũng đã triển khai cùng giao thức đó
      Tôi đang dùng nguyên xi script imgcat không chỉnh sửa trên Linux
      Rõ ràng là nhanh hơn rất nhiều so với việc chuyển đổi bằng ImageMagick, nhưng dù vậy tôi vẫn thêm lsix vào thư mục bin
  • Nên cẩn thận khi chạy trong thư mục không đáng tin cậy
    Đặc biệt các thứ phải parse ảnh như PDF có thể nguy hiểm giống như nhiều công cụ khác, và càng phải cẩn thận hơn khi dùng ImageMagick

    • Việc parse ảnh không đáng tin cậy về bản chất có phải là vấn đề không?
      Nếu tôi mở một thư mục tải xuống không đáng tin bằng Gnome Files, và nó hiển thị rồi do đó parse các ảnh bên trong, thì đó có phải là vấn đề bảo mật cần lo không?
      Tôi nghĩ những thứ như JavaScript trong PDF có thể là vấn đề, nhưng chưa từng nghĩ ngay cả việc xem preview đơn giản cũng có thể nguy hiểm
  • Terminal đang dùng phải hỗ trợ đồ họa Sixel

    • Tôi đã tạo một thư viện đồ họa cho terminal không hỗ trợ Sixel
      https://github.com/dheera/python-termgraphics
      Có thể sẽ thú vị nếu chỉnh sửa thư viện này để hỗ trợ như một đường dự phòng
    • xterm có hỗ trợ Sixel, nên đặt giá trị như TERM=xterm256-color thì chắc đều tương thích cả thôi nhỉ… đúng không? ho gnome-terminal ho
    • mlterm chạy được
  • fzf từ bản 0.44.0 cung cấp hỗ trợ ảnh Sixel thử nghiệm trong cửa sổ preview
    Không dùng được trên Windows
    https://github.com/junegunn/fzf/releases/tag/0.44.0
    fzf --preview='fzf-preview.sh {}'

    • Có thể dùng thay thế fzf --preview 'convert {} -geometry 800x480 sixel:-'
      Cách này cũng cần cài ImageMagick