|
- #!/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
|