#!/bin/sh -e # Display images directly in terminal. # Tested with xterm v361. Depends on magick(1). [ "$LC_TERMINAL" = iTerm2 ] && [ -x "$HOME/.iterm2/imgcat" ] && exec "$HOME/.iterm2/imgcat" "$@" # maxsize prints the geomtry size of terminal window, with # a maximum value of 1000 pixels for width and height, or # 640x480 if terminal size can not be probed. maxsize() { [ "$WINDOWID" ] || { echo "640x480>"; return; } xwininfo -id "$WINDOWID" | { w=1000 h=1000 while read -r a b; do case $a in (Width:) [ $((b < w)) = 1 ] && w=$b ;; (Height:) [ $((b < h)) = 1 ] && h=$b ;; esac done echo "${w}x$h" } } clearline() { printf "\r \r"; } ms=$(maxsize) # Use magick(1) from imagemagick to output sixel format. # -flatten uses the terminal background color as transparent layer # -resize use the terminal size as bounding box, with a limit of 1000 pixels # image is not resized if smaller than limit #exec convert -resize "$(maxsize)>" -transparent-color white -flatten -- ${1:--} sixel:- # color #rrrrggggbbbb #exec convert -resize "$(maxsize)>" -- ${1:--} sixel:${2:--} put=: while getopts :cpv opt; do case $opt in (c) clear=1 ;; (p) pause=1 put=printf ;; (v) put=printf ;; (*) echo "Usage: icat [-cpv] [image_file ...]"; exit 1 ;; esac done shift $((OPTIND - 1)) [ "$#" = 0 -o "$#" = 1 -a "$1" = - ] && { magick - -resize "$ms>" sixel:- exit } for f; do $put "Next: %s" "$f" [ "$pause" ] && { read -sr [ "$REPLY" = s ] && clearline && continue } [ "$clear" ] && clear clearline $put "%s\n" "$f" magick "$f" -resize "$ms>" sixel:- done