이미지 파일 목록 프로그램 ‘lsix’ 출시
(github.com/hackerb9)- lsix는
ls처럼 현재 디렉터리나 지정한 파일 목록을 대상으로 이미지를 터미널 안에 썸네일로 보여주는 Bash 스크립트이며, 출력에는 Sixel 그래픽을 사용함 - ImageMagick을 사용해 여러 이미지 형식을 처리하며, GIF나 여러 이미지를 담은 파일을 명령줄에 지정하면 프레임을 펼쳐 몽타주로 표시함
- 터미널의 Sixel 지원 여부, 전경색·배경색, 색상 레지스터 확장 가능 여부, 창 너비를 감지해 썸네일 품질과 배치를 조정함
- 설치는
lsix파일을 경로에 넣고 ImageMagick을 준비하면 되며, macOS에서는brew install lsix로 ImageMagick까지 함께 설치할 수 있음 - XTerm은 기본적으로 Sixel 모드가 꺼져 있고 일부 터미널은 호환되지 않으므로, 실제 사용 전 Sixel 호환 터미널인지 확인해야 함
ls처럼 쓰는 터미널 이미지 목록 도구
- lsix는 이미지용
ls에 가까운 도구로, 터미널에서 파일 썸네일을 인라인으로 보여줌 - 기본 실행 방식은 단순함
lsix만 입력하면 현재 작업 디렉터리의 이미지를 표시함lsix [ FILES ... ]형태로 파일명을 지정할 수 있음- 셸 와일드카드를 사용할 수 있어
lsix *jpg * png같은 실행이 가능함
- 출력에는 Sixel 그래픽을 사용함
ImageMagick 기반 형식 처리와 표시 방식
- ImageMagick을 사용하므로 다양한 이미지 형식을 지원함
- PDF처럼 렌더링이 느릴 수 있는 형식은 명시적으로 요청하지 않으면 표시하지 않음
- 특정 형식을 강제로 나열하려면 파일명을 직접 지정하거나
*.pdf같은 와일드카드를 사용함
- 특정 형식을 강제로 나열하려면 파일명을 직접 지정하거나
- GIF 또는 여러 이미지를 포함한 파일을 명령줄에 지정하면 모든 프레임을 펼쳐 몽타주로 보여줌
- GIF는 일부 프레임을 이전 프레임과 달라진 픽셀만 저장할 수 있음
- 비트맵이 아닌 그래픽도 동작할 수 있음
- 예:
.svg,.eps,.pdf,.xcf
- 예:
터미널 환경 감지 기능
- lsix는 제어 시퀀스를 사용해 터미널이 Sixel 그래픽을 인라인으로 표시할 수 있는지 감지함
- PNG와 SVG의 알파 채널은 터미널 배경색에 맞춰 처리됨
- lsix는 터미널 이스케이프 시퀀스로 전경색과 배경색을 알아내려 함
- 전경색은 텍스트 채움 색상에 사용됨
- xterm처럼 색상 레지스터 수를 늘릴 수 있는 터미널을 감지하면 이미지 품질을 높이기 위해 자동으로 확장함
- dtterm WindowOps를 지원하는 터미널에서는 창 너비에 맞춰 한 줄의 타일 수를 조정함
- 디렉터리에 이미지가 많을 때는 전체 몽타주 생성을 기다리지 않도록 처리함
- 이미지가 21개 초과이면 한 줄씩 표시함
- 파일명이 너무 길면 ImageMagick
montage에 넘기기 전에 텍스트를 줄바꿈함- lsix 없이
montage를 쓰면 긴 파일명이 서로 겹칠 수 있음
- lsix 없이
- Unicode 파일명은 사용하는 폰트에 글리프가 있으면 동작함
설치와 설정 방식
- 설치는
lsix파일을/usr/local/bin같은 경로에 넣고 실행하면 됨 - lsix는 Bash 셸 스크립트임
- 필수 소프트웨어는 ImageMagick뿐임
- 예:
apt-get install imagemagick
- 예:
- macOS 사용자는
brew install lsix를 사용할 수 있음- 필요한 경우 ImageMagick도 함께 설치됨
- 현재 설계는 매우 단순함
- 명령줄 플래그 없음
- 설정 파일 없음
- 조정용 노브 없음
- 타일 너비, 폰트 패밀리, 포인트 크기 같은 값은 파일 상단의 변수 수정으로 바꿀 수 있음
- 설치된 폰트 목록은
convert -list font로 확인할 수 있음
- 설치된 폰트 목록은
Sixel 지원 터미널 요구사항
- 터미널은 Sixel 그래픽을 지원해야 함
- 단일 이미지를 Sixel로 출력해 터미널을 테스트할 수 있음
convert foo.jpg -geometry 800x480 sixel:-
- 개발에는 xterm의 vt340 에뮬레이션 모드가 사용됨
- XTerm은 기본적으로 Sixel 모드가 켜져 있지 않음
- 실행 시
xterm -ti vt340을 사용할 수 있음 - 또는
.Xresources에xterm*decTerminalID : vt340을 추가하고xrdb -merge .Xresources를 실행할 수 있음
- 실행 시
- Fedora 같은 일부 배포판은
xterm을 Sixel 지원 없이 컴파일할 수 있음- 이 경우
foot또는mlterm같은 대체 터미널을 시도할 수 있음
- 이 경우
호환 터미널과 비호환 터미널
- Sixel 호환 터미널로 확인되거나 보고된 항목
- XTerm, MLterm, foot, Wezterm, Contour, iTerm2 for Apple MacOS, Yaft는 테스트됨
- Konsole, yakuake, WSLtty for Microsoft Windows, MinTTY for Cygwin, VTE 특수 컴파일, sixel-tmux, ttyd는 보고됨
- Sixel 비호환 터미널
- MacOS Terminal, kitty
- 표준 libvte 기반 터미널
- gnome-terminal
- terminator
- lxterm
- Alacritty는 패치를 적용하면 동작할 수 있음
알려진 버그와 제약
- XTerm의 reverse video 모드인
xterm -rv는 전경색과 배경색을 명시적으로 지정하는 것과 다름- 명시 지정은 감지할 방법이 있지만 reverseVideo 리소스는 감지할 수 없어 배경색이 틀릴 수 있음
- XTerm의 화면 너비는 현재 1000px로 제한됨
- 1000x1000보다 큰 이미지를 xterm이 처리할 수 있게 되면 제한을 제거할 예정임
- 마지막 테스트는 XTerm(344) 기준임
@로 시작하는 파일명은 ImageMagick에서 특별하게 취급됨lsix ./@foo.png처럼 디렉터리를 앞에 붙여야 함- 이는 lsix가 아니라 ImageMagick 버그임
- 빈 문자열
""을 파일명으로 지정하면 ImageMagick이 멈춤- ImageMagick 버그 또는 잘못된 동작으로 보임
- 긴 파일명 줄바꿈은 동작하지만 지능적이지 않음
- 공백, 대시, 언더스코어, 마침표 기준 줄바꿈은 아직 구현되지 않음
- 명령줄에 디렉터리를 지정하면 사용자가 그 디렉터리로
cd한 것처럼 처리함- 재귀 처리는 어렵지 않지만 단순한 스크립트에 명령줄 플래그를 추가하는 점을 꺼림
lsix foo.avi실행은 문제를 일으킬 수 있음
Sixel 표준과 구현상의 한계
- Sixel 표준에는 그래픽 화면 크기를 질의하는 방법이 없는 것으로 보임
- VT340 문서를 기준으로 보면 렌더링 대상 장치의 해상도를 프로그램이 이미 알고 있어야 함
- XTerm 344는 이 문제를 해결하는 제어 시퀀스
CSI ? Pi ; Pa ; Pv S를 추가함mlterm같은 일부 터미널은 아직 구현하지 않음
- dtterm WindowOps 확장으로 창 크기를 읽는 대안이 있음
- Sixel 그래픽 화면의 기하와 창 크기가 반드시 같지는 않아 정확한 해법은 아님
- 예를 들어 xterm은 창이 더 커도 그래픽 기하를 1000x1000으로 제한함
- 두 방법이 모두 실패하면 lsix는 VT340 환경으로 가정함
- 해상도는 800x480
- 한 줄에 타일 6개만 들어간다고 봄
- Sixel 표준은 사용 가능한 색상 레지스터 수를 질의하는 방법도 제공하지 않음
- lsix는 xterm 확장을 사용함
- 터미널이 응답하지 않으면 원래 VT340으로 가정하고 16개 색상 레지스터만 사용함
libsixel을 쓰지 않는 이유
- libsixel은 최적화된 Sixel 그래픽 명령을 출력하는 프로젝트임
- lsix는 libsixel 대신 Bash와 ImageMagick을 사용함
- Bash와 ImageMagick이 널리 있어 어디서나 쉽게 동작하게 하려는 선택임
- 스크립트를 단순하게 유지해 사용자가 쉽게 수정하고 확장할 수 있게 함
- ImageMagick은 libsixel의
img2sixel이 사용하는stb_image보다 더 다양한 입력 형식을 읽을 수 있음- 예: xpm, svg, 16-bit png, sixel 파일
- ImageMagick은 입력을 읽고 Sixel 출력을 직접 쓸 수 있음
- libsixel은 더 빠를 수 있지만 단순한 디렉터리 목록 표시에는 ImageMagick도 충분히 빠름
참고 자료
- XTerm Control Sequences
- ImageMagick
- VT340 Programmer's Reference
- Chapter 14: Sixel Graphics
- Chapter 16: Level 1과 Level 2 Sixel 구현 차이
- DEC STD 070 Video Systems Reference Manual
- VT340 Test
- Digital ANSI-Compliant Printing Protocol: Level 2 Programming Reference Manual
댓글과 토론
Hacker News 의견들
-
나처럼 tmux 없이는 터미널을 쓰기 어렵다면, 실험적이던 Sixel 브랜치가 약 10개월 전에 드디어 병합됐음
이제 메인라인 tmux를--enable-sixel로 빌드해서 tmux 안에서lsix같은 도구를 쓸 수 있음
좋아하는 터미널이나 터미널 멀티플렉서가 Sixel을 지원하는지 궁금하면 "Are We Sixel Yet" 사이트를 보면 됨
https://github.com/tmux/tmux/commit/dfbc6b1888c110cf0ade66f2...
https://www.arewesixelyet.com- 몇 년 전에 Zellij로 갈아탔고, 2022년 어느 시점부터 Sixel 지원을 잘 쓰고 있음
작업 흐름에 변화를 주고 싶다면 기본 상태에서 tmux보다 훨씬 나은 경험이라고 봄
원래 외부 플러그인과 복잡한 설정 스크립트로 추가했을 기능들이 기본으로 들어 있고, 안정성과 성능도 훨씬 좋았음
https://zellij.dev/ - tmux의 용도를 잘 이해하지 못하겠음
왜 작업 흐름에 필수 도구가 되는지, 내 작업에도 왜 필수가 될 수 있는지 설명해 줄 수 있나? - 그런데 왜 필요한가? 픽셀 그래픽을 굳이 텍스트 기반 저해상도 격자에 밀어 넣을 이유가 있나? 그냥 픽셀 그래픽을 쓰면 되지 않나?
- 오래전부터 tmux를 써 왔고 그 전에는 screen을 썼지만, Sixel이 왜 큰 차이를 만드는지는 잘 모르겠음
현재의 타일링 방식에 비해 tmux에 스택형 창 관리자를 들여오는 정도의 변화인가? 아니면 그냥 터미널 그래픽이 좋아지는 건가? 내가 완전히 잘못 이해한 건가?
단순히 그래픽이 좋아지는 것이라면 왜 tmux가 지원해야 하는지 잘 모르겠고, Gnome Terminal 같은 터미널 에뮬레이터 쪽이 중요할 것 같음. 둘 다 필요할 수도 있지만 tmux는 그냥 통과시켜 주면 된다고 생각했음 brew로 tmux를 설치하면 Sixel이 활성화되는지 혹시 아나?
- 몇 년 전에 Zellij로 갈아탔고, 2022년 어느 시점부터 Sixel 지원을 잘 쓰고 있음
-
이 저장소에서 가장 마음에 드는 기능은
README.md.d디렉터리임
꽤 좋은 아이디어이고, 굳이.md는 빼도 될 것 같음- 진짜 강한 한 수는 README 파일 안에 이미지를 그대로 Sixel로 임베드하는 것임
그러면cat README만 해도 이미지가 그대로 보일 수 있음
- 진짜 강한 한 수는 README 파일 안에 이미지를 그대로 Sixel로 임베드하는 것임
-
"\e[c"를 써서 Sixel 지원 여부를 자동 감지함
https://github.com/hackerb9/lsix/blob/3a431793a747df3f934051...
"\e[c"는 "send device attributes"임
https://invisible-island.net/xterm/ctlseqs/ctlseqs.html#h3-F... -
아이디어는 멋진데 PuTTY/KiTTY에서는 동작하지 않음
$ lsix를 실행하면 터미널이 Sixel 그래픽 지원을 보고하지 않는다는 오류가 나고,xterm -ti vt340같은 Sixel 지원 터미널을 쓰거나 터미널 제작자에게 지원을 요청하라고 함
단일 이미지는convert foo.jpg -geometry 800x480 sixel:-로 테스트할 수 있고, 실제로 지원하는 터미널이라면 http://github.com/hackerb9/lsix/issues 에 버그를 보고하라고 안내함
장치 속성 코드는^[[?6c라고 표시됨
아쉽다. 꽤 근사했을 텐데. Sixel을 지원하는 오픈소스 Windows 터미널이 있나? 대부분 Cygwin이나 WSL 쪽만 보이고, 순수 Windows용은 잘 안 보임- 최근 wezterm을 쓰기 시작했는데 꽤 마음에 듦
크로스 플랫폼이고 Sixel 그래픽을 지원함
https://github.com/wez/wezterm - Mintty는 Sixel을 지원하는 훌륭한 Windows 터미널임
- 최근 wezterm을 쓰기 시작했는데 꽤 마음에 듦
-
비슷한 계열로 timg도 있음: https://github.com/hzeller/timg
- 내가 써 본 다른 도구로는 https://github.com/posva/catimg도 있음
-
MacOS용 iTerm2에는 비슷한 기능이 내장돼 있고, 서버 쪽 부담은 더 적음
서버에서 많은 이미지 라이브러리로 이미지를 Sixel로 렌더링하는 대신, 전체 이미지를 base64로 인코딩해서 클라이언트로 보내고 클라이언트가 이미지 형식을 판단해 터미널에 로컬로 렌더링함
https://iterm2.com/documentation-images.html- konsole도 같은 프로토콜을 구현했음
Linux에서 수정하지 않은imgcat스크립트를 그대로 쓰고 있음
ImageMagick으로 변환하는 것보다 당연히 훨씬 빠르지만, 일단lsix도bin디렉터리에 추가해 둠
- konsole도 같은 프로토콜을 구현했음
-
신뢰할 수 없는 디렉터리에서 실행할 때는 조심해야 함
특히 PDF처럼 이미지를 파싱하는 것들은 다른 도구와 마찬가지로 위험할 수 있고, ImageMagick을 쓸 때는 더 주의가 필요함- 신뢰할 수 없는 이미지를 파싱하는 것이 본질적으로 문제가 되나?
신뢰할 수 없는 다운로드 폴더를 Gnome Files로 열었을 때 내부 이미지들을 표시하고 따라서 파싱한다면, 신경 써야 할 보안 이슈인가?
PDF 안의 JavaScript 같은 것은 문제가 될 수 있다고 생각했지만, 단순 미리보기까지 위험하다고는 생각하지 않았음
- 신뢰할 수 없는 이미지를 파싱하는 것이 본질적으로 문제가 되나?
-
사용하는 터미널이 Sixel 그래픽을 지원해야 함
- Sixel을 지원하지 않는 터미널용 그래픽 라이브러리를 만들었음
https://github.com/dheera/python-termgraphics
이 라이브러리를 수정해서 대체 경로로 지원하게 만들면 흥미로울 수 있음 - xterm은 Sixel을 지원하니,
TERM=xterm256-color같은 값을 설정하는 건 전부 호환되겠지… 맞지? 기침 gnome-terminal 기침 - mlterm은 동작함
- Sixel을 지원하지 않는 터미널용 그래픽 라이브러리를 만들었음
-
fzf는 0.44.0부터 미리보기 창에서 실험적 Sixel 이미지 지원을 제공함
Windows에서는 사용할 수 없음
https://github.com/junegunn/fzf/releases/tag/0.44.0
fzf --preview='fzf-preview.sh {}'- 대안으로
fzf --preview 'convert {} -geometry 800x480 sixel:-'를 쓸 수 있음
이것도 ImageMagick 설치가 필요함
- 대안으로