#!/usr/bin/env sh # Description: Text based file previewer # # Note: This plugin needs a "NNN_FIFO" to work. # # Dependencies: tmux (>=3.0) or xterm or $TERMINAL, less or $PAGER, # file, stat, tree, man, tar, unzip, ... # ... add you own! (see examples in code) # # Usage: # You need to set a NNN_FIFO path and set a key for the plugin, # then start `nnn`: # # $ nnn -a # # or # # $ NNN_FIFO=/tmp/nnn.fifo nnn # # Then in `nnn`, launch the `preview-tui` 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 (e.g. # with -a), they will be independent. # # Configure SPLIT to either "h" or "v" to set a 'h'orizontal split or a # 'v'ertical split # # Shell: POSIX compliant # Authors: Todd Yamakawa, Léo Villeveygoux, @Recidiviste TERMINAL="${TERMINAL:-xterm}" PAGER="${PAGER:-less -R}" fifo_pager() { cmd="$1" shift # We use a FIFO to access $PAGER PID in jobs control tmpfifopath="${TMPDIR:-/tmp}/nnn-preview-tui-fifo.$$" mkfifo "$tmpfifopath" || return $PAGER < "$tmpfifopath" & ( exec > "$tmpfifopath" "$cmd" "$@" & ) rm "$tmpfifopath" } preview_file () { kill %- %+ 2>/dev/null clear encoding="$(file -Lb --mime-encoding -- "$1")" # Detect mime type mimetype="$(file -Lb --mime-type -- "$1")" # Detect file extention - use if you need ext="${1##*.}" if [ -n "$ext" ]; then ext="$(printf "%s" "${ext}" | tr '[:upper:]' '[:lower:]')" fi if [ -d "$1" ]; then # Print directory tree cd "$1" || return fifo_pager tree #elif [ "${mimetype%%/*}" = "image" ] ; then # catimg "$1" elif [ "$mimetype" = "text/troff" ] ; then fifo_pager man -Pcat -l "$1" elif [ "$mimetype" = "application/zip" ] ; then fifo_pager unzip -l "$1" elif [ "$ext" = "gz" ] || [ "$ext" = "bz2" ] ; then fifo_pager tar -tvf "$1" elif [ "$encoding" = "binary" ] ; then # Binary file: just print filetype info echo "-------- binary file --------" file -b "$1" echo stat "$1" else # Text file: $PAGER "$1" & 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 if [ -e "${TMUX%%,*}" ] && [ "$(tmux -V | cut -c6)" -eq 3 ] ; then if [ -z "$SPLIT" ] && [ $(($(tput lines) * 2)) -gt "$(tput cols)" ] ; then SPLIT='v' elif [ "$SPLIT" != 'v' ] ; then SPLIT='h' fi tmux split-window -e "NNN_FIFO=$NNN_FIFO" -e "PREVIEW_MODE=1" -d"$SPLIT" "$0" "$1" else PREVIEW_MODE=1 $TERMINAL -e "$0" "$1" & fi