]> Sergey Matveev's repositories - nnn.git/commitdiff
preview-tui: simplify, add generic fifo_pager() (#625)
authorlvgx <l@vgx.fr>
Tue, 2 Jun 2020 08:56:50 +0000 (10:56 +0200)
committerGitHub <noreply@github.com>
Tue, 2 Jun 2020 08:56:50 +0000 (14:26 +0530)
* preview-tui: simplify, add generic fifo_pager()

I've commented new filetype checks for now, as we need to discuss which ones
should be included by default, keeping in mind that this is supposed to be a
minimal, adaptable plugin.

* preview-tui: preview with man, tar, unzip by default

plugins/preview-tui

index 13c5639ae3a84b3f5c523eb15d92c16d14334083..fe130330423a6a408ca4ebf1e84fead891ba5693 100755 (executable)
@@ -4,19 +4,25 @@
 #
 # Note: This plugin needs a "NNN_FIFO" to work.
 #
-# Dependencies: tmux (>=3.0) or xterm or $TERMINAL, less or $PAGER, file, tree
+# 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, they
-#   will be independent.
+#   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
 # Authors: Todd Yamakawa, Léo Villeveygoux, @Recidiviste
 
 TERMINAL="${TERMINAL:-xterm}"
-PAGER="${PAGER:-less}"
-SPLIT=
+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
 
-lines=$(($(tput lines)-1))
-cols=$(tput cols)
+    $PAGER < "$tmpfifopath" &
 
-beginswith() {
-    case $1 in "$2"*) true;; *) false;; esac;
+    (
+        exec > "$tmpfifopath"
+        "$cmd" "$@" &
+    )
+
+    rm "$tmpfifopath"
 }
 
 preview_file () {
-    kill "$(jobs -p)" 2>/dev/null
+    kill %- %+ 2>/dev/null
     clear
 
-    encoding="$(file -b --mime-encoding "$1")"
+    encoding="$(file -Lb --mime-encoding -- "$1")"
 
     # Detect mime type
-    mimetype="$(file --dereference --brief --mime-type -- "$1")"
+    mimetype="$(file -Lb --mime-type -- "$1")"
 
-    # Detect file extention
+    # Detect file extention - use if you need
     ext="${1##*.}"
-    if ! [ -z "$ext" ]; then
+    if [ -n "$ext" ]; then
         ext="$(printf "%s" "${ext}" | tr '[:upper:]' '[:lower:]')"
     fi
 
     if [ -d "$1" ]; then
         # Print directory tree
-
         cd "$1" || return
-
-        # We use a FIFO to access less PID
-        tmpfifopath="${TMPDIR:-/tmp}/nnn-preview-tui-fifo.$$"
-        mkfifo "$tmpfifopath" || return
-
-        $PAGER < "$tmpfifopath" &
-
-        (
-            exec > "$tmpfifopath"
-            tree&
-        )
-
-        rm "$tmpfifopath"
-    #elif beginswith "$mimetype" "image/" ; then
-    #    viu "$1" | head -n "$lines"
-    #elif beginswith "$mimetype" "text/troff" ; then
-    #    man -l "$1" &
-    elif beginswith "$mimetype" "application/zip" ; then
-        #$PAGER "$(zip -sf "$1")" &
-        $PAGER "$(unzip -l "$1")" &
+        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
-        $PAGER "$(tar -tvf "$1")" &
+        fifo_pager tar -tvf "$1"
     elif [ "$encoding" = "binary" ] ; then
         # Binary file: just print filetype info
         echo "-------- binary file --------"
         file -b "$1"
-        echo ''
+        echo
         stat "$1"
     else
         # Text file:
@@ -105,13 +107,9 @@ if [ "$PREVIEW_MODE" ] ; then
 fi
 
 if [ -e "${TMUX%%,*}" ] && [ "$(tmux -V | cut -c6)" -eq 3 ] ; then
-    if [ -z "$SPLIT" ]; then
-        if [ "$(( lines * 2 ))" -gt "$cols" ]; then
-            SPLIT='v'
-        else
-            SPLIT='h'
-        fi
-    elif [ "$SPLIT" != "h" ] && [ "$SPLIT" != "v" ] ; then
+    if [ -z "$SPLIT" ] && [ $(($(tput lines) * 2)) -gt "$(tput cols)" ] ; then
+        SPLIT='v'
+    elif [ "$SPLIT" != 'v' ] ; then
         SPLIT='h'
     fi