#!/usr/bin/env sh # Description: File previewer for kitty term using NNN_FIFO # # Dependencies: # - kitty (https://sw.kovidgoyal.net/kitty/) with allow_remote_control on # - file # - exa (https://github.com/ogham/exa) (fallback: ls) # - bat (https://github.com/sharkdp/bat) (fallback: cat) # - mediainfo (fallback: file) # # Usage: # This plugin only works in kitty (https://sw.kovidgoyal.net/kitty/), # and with kitty's 'allow_remote_control' option turned on. # You need to set a NNN_FIFO path and set a key for the plugin, # then start `nnn`: # # $ NNN_FIFO=/tmp/nnn.fifo nnn # # Then in `nnn`, launch the `preview-kitty` plugin. # # If you provide the same NNN_FIFO to all nnn instances, there will be a # single common preview window. I you provide different FIFO path, they # will be independent. # # Shell: POSIX compliant # Authors: Léo Villeveygoux preview_file () { kill %% 2>/dev/null clear lines=$(($(tput lines)-1)) cols=$(tput cols) mime="$(file -b --mime-type "$1")" encoding="$(file -b --mime-encoding "$1")" if [ -d "$1" ]; then # Print directory tree # shellcheck disable=SC2015 cd "$1" && \ (COLUMNS=$cols exa -G --colour=always 2>/dev/null ||\ ls --color=alway) | head -n $lines & # remove second clause to preview SVG files (but this is slow) elif [ "${mime%%/*}" = "image" ] && [ "$encoding" = "binary" ] ; then kitty +kitten icat --silent --transfer-mode=stream --stdin=no "$1" & elif [ "$encoding" = "binary" ] ; then # Binary file: show file info printf -- "-------- \033[1;31mBinary file\033[0m --------\n" (mediainfo "$1" 2>/dev/null || file -b "$1") | head -n $((lines - 1)) & else # Text file: print colored file content (bat --terminal-width="$cols" --paging=never --decorations=always \ --color=always "$1" 2>/dev/null || cat) | head -n $lines & fi } if [ "$PREVIEW_MODE" ] ; then if [ ! -r "$NNN_FIFO" ] ; then echo "No FIFO available! (\$NNN_FIFO='$NNN_FIFO')" >&2 read -r exit 1 fi preview_file "$1" exec < "$NNN_FIFO" while read -r selection ; do preview_file "$selection" done exit 0 fi kitty @ launch --no-response --title "nnn preview" --keep-focus \ --cwd="$PWD" --env "NNN_FIFO=$NNN_FIFO" --env "PREVIEW_MODE=1" \ "$0" "$1" > /dev/null