diff options
author | leo-arch <leonardoabramovich2@gmail.com> | 2021-06-06 23:10:48 -0300 |
---|---|---|
committer | leo-arch <leonardoabramovich2@gmail.com> | 2021-06-06 23:10:48 -0300 |
commit | 6e62dc92f4122d16772444bdcf108767835761f5 (patch) | |
tree | f143b1bcc9097ab5e1c9861f9e42387f527c7ba2 | |
parent | fd3311c28528484388ec8277e6f57bc555025e05 (diff) |
Cache hashes and config file for BFG
-rw-r--r-- | plugins/BFG.cfg | 99 | ||||
-rwxr-xr-x | plugins/BFG.sh | 204 | ||||
-rwxr-xr-x | plugins/fzfnav.sh | 495 |
3 files changed, 636 insertions, 162 deletions
diff --git a/plugins/BFG.cfg b/plugins/BFG.cfg new file mode 100644 index 00000000..6d928f70 --- /dev/null +++ b/plugins/BFG.cfg @@ -0,0 +1,99 @@ +############################################ +# Configuration file CliFM's BFG previewer # +############################################ + +# Commented and blank lines are omitted + +# GENERAL OPTIONS + +# Location of the previwer script. Defaults to +# "${XDG_CONFIG_HOME:-$HOME/.config}/clifm/plugins/BFG.sh" +BFG_FILE="" + +# Resource opener to use. Defaults to Lira, CliFM's built-in opener +OPENER="clifm" + +# BFG caches images to speed up the previewing process (only files +# that need to be converted into images are cached). Specify where +# to store these cached images. Defaults to +# "${XDG_CACHE_HOME:-$HOME/.cache}/clifm/previews" +PREVIEWDIR="" + +# Set to 1 to use Ranger's scope.sh file instead of BFG +USE_SCOPE=0 +# Location of the scope.sh file. Defaults to +# "${XDG_CONFIG_HOME:-$HOME/.config}/ranger/scope.sh" +SCOPE_FILE="" + +# Set to 1 to use pistol instead of BFG +USE_PISTOL=0 + +PREVIEW_IMAGES=1 +PLAY_MUSIC=1 +ANIMATE_GIFS=1 +# Try to print file information if no previwing application is found +FALLBACK_INFO=0 + +# FILETYPE DEFINITIONS + +# Choose previewing applications for file types. Available options +# are provided as comments above each line. + +# Use 'none' to prevent previews of the corresponding file type. + +# Leave blank to let BFG check for available applications and use +# the first one found (the order of this check is the same as the +# order in the comments below). Ex: for archives, atool will be +# checked first, then bsdtar, and finally tar. + +# atool (recommended), bsdtar, tar +ARCHIVES="atool" + +# w3m, linx, elinks, cat +BROWSER="elinks" + +# ddjvu (image preview), ddjvutxt (text preview) +DDJVU="" + +# tree, ls +DIR="tree" + +# libreoffice (image preview), text (text preview) +# NOTE: 'text' is not iteself an application. It instructs BFG to +# look for an application able to print documents as text. Checks +# are made for the following applications: catdoc, odt2txt, xls2csv, +# xls2xcsv, and pandoc +DOC="text" + +# epub-thumbnailer +EPUB="" + +# exitool +FILEINFO="none" + +# fontpreview, fontimage +FONTS="" + +# ueberzug (recommended), viu, catimg, img2txt +IMG="" + +# python, jq, cat +JSON="" + +# glow +MARKDOWN="" + +# mediainfo +MEDIAINFO="" + +# ffplay, mplayer, mpv +MUSIC="" + +# pdftoppm (image preview), pdftotext (text preview), mutool +PDF="" + +# bat, highlight, pygmentize, cat +TEXT="highlight" + +# ffmpegthumbailer +VIDEO="" diff --git a/plugins/BFG.sh b/plugins/BFG.sh index 30b5950c..f3fb6adb 100755 --- a/plugins/BFG.sh +++ b/plugins/BFG.sh @@ -1,8 +1,9 @@ #!/bin/sh # BFG: This is CliFM's file previewer script. It is called by the fzfnav.sh -# plugin for each hovered file. Variables for applications are exported by fzfnav -# to prevent this script from checking the same applications once and again +# plugin for each hovered file. Variables for available applications are +# exported by fzfnav to prevent this script from checking the same +# applications once and again # Written by L. Abramovich # License: GPL3 @@ -11,7 +12,7 @@ # atool or bsdtar or tar: archives # convert (imagemagick), and ueberzug (recommended) or viu or catimg or img2txt: images # fontpreview or fontimage (fontforge): fonts -# libreoffice, catdoc, odt2txt, pandoc: office documents +# libreoffice, catdoc, odt2txt, xls2csv, xls2xcsv, pandoc: office documents # pdftoppm or pdftotext or mutool: PDF files # epub-thumbnailer: epub files # ddjvu (djvulibre) or djvutxt: DjVu files @@ -25,20 +26,10 @@ # transmission-cli: torrent files # exiftool or mediainfo or file: file information -CACHEDIR="${XDG_CACHE_HOME:-$HOME/.cache}/clifm" -PREVIEWDIR="$CACHEDIR/previews" - -! [ -d "$PREVIEWDIR" ] && mkdir -p "$PREVIEWDIR" - # Default size for images WIDTH=1920 HEIGHT=1080 -USE_SCOPE=0 -SCOPE_FILE="${XDG_CONFIG_HOME:-$HOME/.config}/ranger/scope.sh" - -USE_PISTOL=0 - calculate_position() { # shellcheck disable=SC2034 @@ -60,11 +51,13 @@ uz_clear() { } file_info() { + [ "$FALLBACK_INFO" = 0 ] && exit 0 + [ -z "$1" ] && exit 1 entry="$1" - if [ "$(file -bL --mime-encoding "$entry")" = "binary" ]; then + if [ "$FILE_OK" = 1 ] && [ "$(file -bL --mime-encoding "$entry")" = "binary" ]; then printf -- "--- \e[0;30;47mBinary file\e[0m ---\n" fi @@ -72,7 +65,7 @@ file_info() { exiftool "$PWD/$entry" 2>/dev/null && exit 0 elif [ "$MEDIAINFO_OK" = 1 ]; then mediainfo "$PWD/$entry" 2>/dev/null && exit 0 - else + elif [ "$FILE_OK" = 1 ]; then file -b "$entry" && exit 0 fi exit 1 @@ -90,15 +83,15 @@ handle_ext() { case "$ext" in # Direct Stream Digital/Transfer (DSDIFF) and wavpack aren not # detected by file(1). - dff|dsf|wv|wvc) - file_info "$entry" && exit 0 - ;; +# dff|dsf|wv|wvc) +# file_info "$entry" && exit 0 +# ;; # Markdown files md) if [ "$GLOW_OK" = 1 ]; then glow -s dark "$PWD/$entry" && exit 0 - else + elif [ "$CAT_OK" = 1 ]; then cat "$entry" && exit 0 fi ;; @@ -107,8 +100,6 @@ handle_ext() { xz) if [ -n "$ARCHIVER_CMD" ]; then "$ARCHIVER_CMD" "$ARCHIVER_OPTS" "$entry" && exit 0 - else - file_info "$entry" && exit 0 fi ;; @@ -116,32 +107,36 @@ handle_ext() { html|xhtml|htm) if [ -n "$BROWSER" ]; then "$BROWSER" -dump "$entry" && exit 0 - else + elif [ "$CAT_OK" = 1 ]; then cat "$entry" && exit 0 fi ;; json) - if [ "$(which python 2>/dev/null)" ]; then + if [ "$PYTHON_OK" = 1 ]; then python -m json.tool -- "$entry" && exit 0 - elif [ "$(which jq 2>/dev/null)" ]; then + elif [ "$JQ_OK" = 1 ]; then jq --color-output . "$PWD/$entry" && exit 0 - else + elif [ "$CAT_OK" = 1 ]; then cat "$entry" && exit 0 fi ;; svg) + [ -z "$IMG_VIEWER" ] && return + if [ -f "$PREVIEWDIR/${entryhash}.png" ]; then + "$IMG_VIEWER" "$PREVIEWDIR/${entryhash}.png" && exit 0 + fi + + [ -z "$CONVERT_OK" ] && return convert -background none -size "$WIDTH"x"$HEIGHT" "$entry" \ - "$PREVIEWDIR/${entry}.png" - "$IMG_VIEWER" "${PREVIEWDIR}/${entry}.png" && exit 0 + "$PREVIEWDIR/${entryhash}.png" + "$IMG_VIEWER" "${PREVIEWDIR}/${entryhash}.png" && exit 0 ;; torrent) - if [ "$(which transmission-show 2>/dev/null)" ]; then + if [ "$TRANSMISSION_OK" = 1 ]; then transmission-show -- "$PWD/$entry" && exit 0 - else - file_info "$entry" && exit 0 fi ;; @@ -158,6 +153,9 @@ handle_ext() { } handle_mime() { + + [ -z "$FILE_OK" ] && return + entry="$1" mimetype="$(file --brief --dereference --mime-type "$entry")" @@ -167,35 +165,42 @@ handle_mime() { # Office documents *officedocument*|*msword|*ms-excel|text/rtf|*.opendocument.*) - if [ -n "$IMG_VIEWER" ] && [ "$LIBREOFFICE_OK" = 1 ]; then - libreoffice --headless --convert-to jpg "$entry" \ - --outdir "$PREVIEWDIR" > /dev/null 2>&1 && \ + if [ -n "$IMG_VIEWER" ] && [ -z "$DOCASTEXT" ]; then + + if [ -f "$PREVIEWDIR/${entryhash}.jpg" ]; then + "$IMG_VIEWER" "$PREVIEWDIR/${entryhash}.jpg" && exit 0 + fi - mv "$PREVIEWDIR/${entry%.*}.jpg" "$PREVIEWDIR/${entry}.jpg" && \ + if [ "$LIBREOFFICE_OK" = 1 ]; then - "$IMG_VIEWER" "${PREVIEWDIR}/${entry}.jpg" && exit 0 + libreoffice --headless --convert-to jpg "$entry" \ + --outdir "$PREVIEWDIR" > /dev/null 2>&1 && \ + + mv "$PREVIEWDIR/${entry%.*}.jpg" "$PREVIEWDIR/${entryhash}.jpg" && \ + "$IMG_VIEWER" "${PREVIEWDIR}/${entryhash}.jpg" && exit 0 + fi fi case "$ext" in odt|ods|odp|sxw) - if [ "$(which odt2txt 2>/dev/null)" ]; then + if [ "$ODT2TXT_OK" = 1 ]; then odt2txt "$PWD/$entry" && exit 0 - elif [ "$(which pandoc 2>/dev/null)" ]; then + elif [ "$PANDOC_OK" = 1 ]; then pandoc -s -t markdown -- "$PWD/$entry" && exit 0 fi ;; xlsx) - if [ "$(which xlsx2csv 2>/dev/null)" ]; then + if [ "$XLSX2CSV_OK" = 1 ]; then xlsx2csv -- "$PWD/$entry" && exit 0 fi ;; xls) - if [ "$(which xlsx2csv 2>/dev/null)" ]; then + if [ "$XLSX2CSV_OK" = 1 ]; then xls2csv -- "$PWD/$entry" && exit 0 fi ;; docx) - if [ "$(which unzip 2>/dev/null)" ]; then + if [ "$UNZIP_OK" = 1 ]; then unzip -p "$entry" | grep --text '<w:r' | \ sed 's/<w:p[^<\/]*>/ /g' | sed 's/<[^<]*>//g' | \ grep -v '^[[:space:]]*$' | sed G && \ @@ -203,7 +208,7 @@ handle_mime() { fi ;; *) - if [ "$(which catdoc 2>/dev/null)" ]; then + if [ -n "$CATDOC_OK" ]; then catdoc "$entry" && exit 0 fi ;; @@ -221,7 +226,7 @@ handle_mime() { "$BROWSER" -dump "$entry" && exit 0 elif [ "$PANDOC_OK" = 1 ]; then pandoc -s -t markdown -- "$entry" && exit 0 - else + elif [ "$CAT_OK" = 1 ]; then cat "$entry" && exit 0 fi ;; @@ -242,7 +247,7 @@ handle_mime() { else pigmentize -f terminal "$entry" && exit 0 fi - else + elif [ "$CAT_OK" = 1 ]; then cat "$entry" && exit 0 fi ;; @@ -250,8 +255,11 @@ handle_mime() { # DjVu */vnd.djvu) if [ -n "$IMAGE_VIEWER" ] && [ "$DDJVU_OK" = 1 ]; then - ddjvu --format=tiff --page=1 "$entry" "$PREVIEWDIR/${entry}.jpg" - "$IMG_VIEWER" "$PREVIEWDIR/${entry}.jpg" && exit 0 + if [ -f "$PREVIEWDIR/${entryhash}.jpg" ]; then + "$IMG_VIEWER" "$PREVIEWDIR/${entryhash}.jpg" && exit 0 + fi + ddjvu --format=tiff --page=1 "$entry" "$PREVIEWDIR/${entryhash}.jpg" + "$IMG_VIEWER" "$PREVIEWDIR/${entryhash}.jpg" && exit 0 elif [ "$DJVUTXT_OK" = 1 ]; then djvutxt "$PWD/entry" && exit 0 fi @@ -260,18 +268,30 @@ handle_mime() { # GIF files */gif) if [ -z "$IMG_VIEWER" ] || [ -z "$CONVERT_OK" ]; then - file_info "$entry" && exit 0 + return + fi + + if [ "$ANIMATE_GIFS" = 0 ]; then + if [ -f "$PREVIEWDIR/${entryhash}.jpg" ]; then + "$IMG_VIEWER" "$PREVIEWDIR/${entryhash}.jpg" && exit 0 + fi + + convert -coalesce -resize "$WIDTH"x"$HEIGHT"\> "$entry"[0] \ + "$PREVIEWDIR/$entryhash.jpg" + "$IMG_VIEWER" "$PREVIEWDIR/${entryhash}.jpg" + exit 0 fi + # Break down the gif into frames and show each frame, one each 0.1 secs # printf "\n" filename="$(printf "%s" "$entry" | tr ' ' '_')" - if [ ! -d "$PREVIEWDIR/$filename" ]; then - mkdir -p "$PREVIEWDIR/$filename" && \ + if [ ! -d "$PREVIEWDIR/$entryhash" ]; then + mkdir -p "$PREVIEWDIR/$entryhash" && \ convert -coalesce -resize "$WIDTH"x"$HEIGHT"\> "$entry" \ - "$PREVIEWDIR/$filename/${filename%.*}.jpg" + "$PREVIEWDIR/$entryhash/${filename%.*}.jpg" fi while true; do - for frame in $(find "$PREVIEWDIR/$filename"/*.jpg 2>/dev/null \ + for frame in $(find "$PREVIEWDIR/$entryhash"/*.jpg 2>/dev/null \ | sort -V); do "$IMG_VIEWER" "$frame" sleep 0.1 @@ -287,27 +307,46 @@ handle_mime() { # Postscript application/postscript) - if [ -n "$IMG_VIEWER" ] && [ "$(which gs 2>/dev/null)" ]; then + [ -z "$IMG_VIEWER" ] && return + + if [ -f "$PREVIEWDIR/${entryhash}.jpg" ]; then + "$IMG_VIEWER" "$PREVIEWDIR/${entryhash}.jpg" && exit 0 + fi + + if [ "$(which gs 2>/dev/null)" ]; then gs -sDEVICE=jpeg -dJPEGQ=100 -dNOPAUSE -dBATCH -dSAFER -r300 \ - -sOutputFile="$PREVIEWDIR/${entry}.jpg" "$entry" > /dev/null 2>&1 && \ - "$IMG_VIEWER" "$PREVIEWDIR/${entry}.jpg" && exit 0 + -sOutputFile="$PREVIEWDIR/${entryhash}.jpg" "$entry" > /dev/null 2>&1 && \ + "$IMG_VIEWER" "$PREVIEWDIR/${entryhash}.jpg" && exit 0 fi ;; # Epub application/epub+zip|application/x-mobipocket-ebook|application/x-fictionbook+xml) - if [ -n "$IMG_VIEWER" ] || [ -n "$EPUBTHUMB_OK" ]; then - epub-thumbnailer "$entry" "$PREVIEWDIR/${entry}.jpg" \ + [ -z "$IMG_VIEWER" ] && return + + if [ -f "$PREVIEWDIR/${entryhash}.jpg" ]; then + "$IMG_VIEWER" "$PREVIEWDIR/${entryhash}.jpg" && exit 0 + fi + + if [ -n "$EPUBTHUMB_OK" ]; then + epub-thumbnailer "$entry" "$PREVIEWDIR/${entryhash}.jpg" \ "$WIDTH" "$HEIGHT" && \ - "$IMG_VIEWER" "$PREVIEWDIR/${entry}.jpg" && exit 0 + "$IMG_VIEWER" "$PREVIEWDIR/${entryhash}.jpg" && exit 0 fi ;; # PDF */pdf) - if [ -n "$IMG_VIEWER" ] && [ "$PDFTOPPM_OK" = 1 ]; then - pdftoppm -jpeg -f 1 -singlefile "$entry" "$PREVIEWDIR/$entry" && \ - "$IMG_VIEWER" "${PREVIEWDIR}/${entry}.jpg" && exit 0 + [ -z "$IMG_VIEWER" ] && return + + if [ -f "$PREVIEWDIR/${entryhash}.jpg" ] && \ + [ "$PDFTOPPM_OK" = 1 ]; then + "$IMG_VIEWER" "$PREVIEWDIR/${entryhash}.jpg" && exit 0 + fi + + if [ "$PDFTOPPM_OK" = 1 ]; then + pdftoppm -jpeg -f 1 -singlefile "$entry" "$PREVIEWDIR/$entryhash" && \ + "$IMG_VIEWER" "$PREVIEWDIR/${entryhash}.jpg" && exit 0 elif [ "$PDFTOTEXT_OK" = 1 ]; then pdftotext -nopgbrk -layout -- "$entry" - | ${PAGER:=less} && exit 0 elif [ "$MUTOOL_OK" = 1 ]; then @@ -331,28 +370,45 @@ handle_mime() { elif [ "$MPV_OK" = 1 ]; then mpv --no-video --quiet "$entry" & fi - [ "$MEDIAINFO_OK" = 1 ] && mediainfo "$entry" - [ "$EXIFTOOL_OK" = 1 ] && exiftool "$entry" + + if [ "$FALLBACK_INFO" = 1 ]; then + [ "$MEDIAINFO_OK" = 1 ] && mediainfo "$entry" + [ "$EXIFTOOL_OK" = 1 ] && exiftool "$entry" + fi + exit 0 ;; # Video video/*) - if [ -n "$IMG_VIEWER" ] || [ -n "$FFMPEGTHUMB_OK" ]; then - ffmpegthumbnailer -i "$entry" -o "$PREVIEWDIR/${entry}.jpg" -s 0 \ + [ -z "$IMG_VIEWER" ] && return + + if [ -f "$PREVIEWDIR/${entryhash}.jpg" ]; then + "$IMG_VIEWER" "$PREVIEWDIR/${entryhash}.jpg" && exit 0 + fi + + if [ "$FFMPEGTHUMB_OK" = 1 ]; then + ffmpegthumbnailer -i "$entry" -o "$PREVIEWDIR/${entryhash}.jpg" -s 0 \ -q 5 2>/dev/null && \ - "$IMG_VIEWER" "$PREVIEWDIR/${entry}.jpg" && exit 0 + "$IMG_VIEWER" "$PREVIEWDIR/${entryhash}.jpg" && exit 0 fi ;; # Fonts font/*|application/font*|application/*opentype) [ -z "$IMG_VIEWER" ] && return + + if [ -f "${PREVIEWDIR}/${entryhash}.jpg" ]; then + "$IMG_VIEWER" "${PREVIEWDIR}/${entryhash}.jpg" && exit 0 + elif [ -f "${PREVIEWDIR}/${entryhash}.png" ]; then + "$IMG_VIEWER" "${PREVIEWDIR}/${entryhash}.png" && exit 0 + fi + if [ "$FONTPREVIEW_OK" = 1 ]; then - fontpreview -i "$entry" -o "$PREVIEWDIR/${entry}.jpg" && \ - "$IMG_VIEWER" "$PREVIEWDIR/${entry}.jpg" && exit 0 + fontpreview -i "$entry" -o "$PREVIEWDIR/${entryhash}.jpg" && \ + "$IMG_VIEWER" "$PREVIEWDIR/${entryhash}.jpg" && exit 0 elif [ "$FONTIMAGE_OK" = 1 ]; then - png_file="$PREVIEWDIR/${entry}.png" + png_file="$PREVIEWDIR/${entryhash}.png" if fontimage -o "$png_file" \ --width "500" --height "290" \ --pixelsize "45" \ @@ -413,7 +469,7 @@ main() { # Directory if [ -d "$entry" ]; then path="$(printf "%s" "$(pwd)/$entry" | sed "s;//;/;")" - if [ "$DIR_PREVIEWER" = "tree" ]; then + if [ "$DIR_CMD" = "tree" ]; then if [ "$COLORS" = 256 ]; then tree -a "$path" && exit 0 else @@ -428,18 +484,12 @@ main() { printf "\n" + # Use hashes instead of file names for cached files + entryhash="$(md5sum "$entry" | cut -d' ' -f1)" + # Do not generate previews of previews [ "$PWD" = "${PREVIEWDIR}" ] && entry="${entry%.*}" - # Use cached images whenever possible - if [ -n "$IMG_VIEWER" ]; then - if [ -f "${PREVIEWDIR}/${entry}.jpg" ]; then - "$IMG_VIEWER" "${PREVIEWDIR}/${entry}.jpg" && exit 0 - elif [ -f "${PREVIEWDIR}/${entry}.png" ]; then - "$IMG_VIEWER" "${PREVIEWDIR}/${entry}.png" && exit 0 - fi - fi - handle_ext "$entry" handle_mime "$entry" file_info "$entry" # Fallback to file information diff --git a/plugins/fzfnav.sh b/plugins/fzfnav.sh index 8ad725ce..1df7376a 100755 --- a/plugins/fzfnav.sh +++ b/plugins/fzfnav.sh @@ -19,7 +19,7 @@ # with FZF or open the last accepted file (Enter). # Press Esc to cancel and exit. -if [ -n "$1" ] && ([ "$1" = "--help" ] || [ "$1" = "help" ]); then +if [ -n "$1" ] && { [ "$1" = "--help" ] || [ "$1" = "help" ]; }; then name="$(basename "$0")" printf "Navigate/preview files via FZF\n" printf "Usage: %s\n" "$name" @@ -110,131 +110,456 @@ $PWD" --marker="+" --preview-window=:wrap "$BORDERS" \ main() { if ! [ "$(which fzf 2>/dev/null)" ]; then - printf "CliFM: fzf: Command not found" >&2 + printf "CliFM: fzf: Command not found\n" >&2 exit 1 fi + # The variables below are exported to the environment so that the + # previewer script, BFG.sh, executed from within FZF, can make use of + # them. Here we define which application should be used for different + # file types. The implementation for each application is defined in the + # BFG file. + + BFG_CFG_FILE="${XDG_CONFIG_HOME:-$HOME/.config}/clifm/plugins/BFG.cfg" + + ################################################# + # 1. GET VALUES FROM THE CONFIGURATION FILE # + ################################################# + + PREV_IMGS=1 + PLAY_MUSIC=1 + export ANIMATE_GIFS=1 + export FALLBACK_INFO=1 + + while read -r LINE; do + [ -z "$LINE" ] || [ "$(printf "%s" "$LINE" | cut -c1)" = "#" ] \ + && continue + + option="$(printf "%s" "$LINE" | cut -d= -f1)" + value="$(printf "%s" "$LINE" | cut -d= -f2 | tr -d "\"" )" + + case $option in + # CHECK GENERAL OPTIONS + BFG_FILE) + if [ -z "$value" ]; then + BFG_FILE="" + else + export BFG_FILE="$value" + fi ;; + CACHEDIR) + if [ -z "$value" ]; then + CACHEDIR="" + else + export CACHEDIR="$value" + fi ;; + PREVIEWDIR) + if [ -z "$value" ]; then + PREVIEDIR="" + else + export PREVIEDIR="$value" + fi ;; + OPENER) + if [ -z "$value" ]; then + OPENER="" + else + export OPENER="$value" + fi ;; + USE_SCOPE) + [ "$value" = 1 ] && export USE_SCOPE=1 ;; + SCOPE_FILE) + if [ -z "$value" ]; then + SCOPE_FILE="" + else + export OPENER="$value" + fi ;; + USE_PISTOL) + [ "$value" = 1 ] && export USE_PISTOL=1 ;; + PREVIEW_IMAGES) + [ "$value" != 1 ] && PREV_IMGS=0 ;; + PLAY_MUSIC) + [ "$value" != 1 ] && PLAY_MUSIC=0 ;; + ANIMATE_GIFS) + [ "$value" != 1 ] && ANIMATE_GIFS=0 ;; + FALLBACK_INFO) + [ "$value" != 1 ] && FALLBACK_INFO=0 ;; + + # CHECK FILE TYPES + ARCHIVES) + ARCHIVES="$value" + case "$value" in + atool) + export ARCHIVER_CMD="atool" + export ARCHIVER_OPTS="-l" ;; + bsdtar) + export ARCHIVER_CMD="bsdtar" + export ARCHIVER_OPTS="-tvf" ;; + tar) + export ARCHIVER_CMD="tar" + export ARCHIVER_OPTS="-tvf" ;; + none) ;; + *) ARCHIVES="" ;; + esac + ;; + BROWSER) + case "$value" in + w3m) export BROWSER="w3m" ;; + elinks) export BROWSER="elinks" ;; + linx) export BROWSER="linx" ;; + cat) export CAT_OK=1 ;; + none) export BROWSER="true";; + *) BROWSER="" ;; + esac + ;; + DDJVU) + DDJVU="$value" + case "$value" in + ddjvu) export DDJVU_OK=1 ;; + ddjvutxt) export DDJVU_OK=1 ;; + none) ;; + *) DDJVU="";; + esac + ;; + DIR) + case "$value" in + tree) export DIR_CMD="tree" ;; + ls) export DIR_CMD="ls" ;; + none) export DIR_CMD="true" ;; + *) DIR_CMD="" ;; + esac + ;; + DOC) + DOC="$value" + case "$value" in + libreoffice) export LIBREOFFICE_OK=1 ;; + text) DOC="" && export DOCASTEXT=1 ;; + none) ;; + *) DOC="";; + esac + ;; + EPUB) + EPUB="$value" + case "$value" in + epub-thumbnailer) export EPUBTHUMB_OK=1 ;; + none) ;; + *) EPUB="";; + esac + ;; + FILEINFO) + FILEINFO="$value" + case "$value" in + exiftool) export EXIFTOOL_OK=1 ;; + none) ;; + *) FILEINFO="";; + esac + ;; + FONTS) + FONTS="$value" + case "$value" in + fontpreview) export FONTPREVIEW_OK=1 ;; + fontimage) export FONTIMAGE_OK=1 ;; + none) ;; + *) FONTS="";; + esac + ;; + IMG) + case "$value" in + ueberzug) export UEBERZUG_OK=1 ;; + viu|catimg|img2txt) export IMG_VIEWER="$value" ;; + none) export IMG_VIEWER="true" ;; + *) IMG_VIEWER="" ;; + esac + ;; + JSON) + JSON="$value" + case "$value" in + python) export PYTHON_OK=1 ;; + jq) export JQ_OK=1 ;; + cat) export CAT_OK=1 ;; + none) ;; + *) JSON="" ;; + esac + ;; + MARKDOWN) + MARKDOWN="$value" + case "$value" in + glow) export GLOW_OK=1 ;; + cat) export CAT_OK=1 ;; + none) ;; + *) MARKDOWN="" ;; + esac + ;; + MEDIAINFO) + MEDIAINFO="$value" + case "$value" in + mediainfo) export MEDIAINFO_OK=1 ;; + none) ;; + *) MEDIAINFO="" ;; + esac + ;; + MUSIC) + MUSIC="$value" + case "$value" in + ffplay) export FFPLAY_OK=1 ;; + mplayer) export MPLAYER_OK=1 ;; + mpv) export MPV_OK=1 ;; + none) ;; + *) MUSIC="" ;; + esac + ;; + PDF) + PDF="$value" + case "$value" in + pdftoppm) export PDFTOPPM_OK=1 ;; + pdftotext) export PDFTOTEXT_OK=1 ;; + mutool) export MUTOOL_OK=1 ;; + none) ;; + *) PDF="" ;; + esac + ;; + TEXT) + TEXT="$value" + case "$value" in + bat) export BAT_OK=1 ;; + highlight) export HIGHLIGHT_OK=1 ;; + pygmentize) export PYGMENTIZE_OK=1 ;; + cat) export CAT_OK=1 ;; + none) ;; + *) TEXT="" ;; + esac + ;; + VIDEO) + VIDEO="$value" + case "$value" in + ffmpegthumbnailer) export FFMPEGTHUMBN_OK=1 ;; + none) ;; + *) VIDEO="" ;; + esac + ;; + esac + done < "$BFG_CFG_FILE" + + export COLORS + COLORS="$(tput colors)" + # This is the previewer script, similar to Ranger's scope.sh - BFG_FILE="${XDG_CONFIG_HOME:-$HOME/.config}/clifm/plugins/BFG.sh" + if [ -z "$BFG_FILE" ]; then + export BFG_FILE="${XDG_CONFIG_HOME:-$HOME/.config}/clifm/plugins/BFG.sh" + fi - UEBERZUG_OK=0 - COLORS="$(tput colors)" - OPENER="clifm" - DIR_PREVIEWER="tree" # ls is another alternative - CACHE_DIR="${XDG_CACHE_HOME:-$HOME/.cache}/clifm" + [ -z "$OPENER" ] && export OPENER="clifm" + + [ -z "$PREVIEWDIR" ] && export PREVIEWDIR="${XDG_CACHE_HOME:-$HOME/.cache}/clifm/previews" + + ! [ -d "$PREVIEWDIR" ] && mkdir -p "$PREVIEWDIR" - if ! [ -d "$CACHE_DIR" ]; then - mkdir -p "$CACHE_DIR" + if [ "$USE_SCOPE" = 1 ]; then + [ -z "$SCOPE_FILE" ] && SCOPE_FILE="${XDG_CONFIG_HOME:-$HOME/.config}/ranger/scope.sh" fi - # We check here, at startup, for available applications so that we don't need - # to do it once and again each time a file is hovered - if [ -n "$DISPLAY" ]; then + # If some value was not set in the config file, check for available + # applications + + ############################################### + # 2. CHECK INSTALLED APPS # + ############################################### + + # We check here, at startup, for available applications so that we + # don't need to do it once and again each time a file is hovered + + # Directories + + if [ -z "$DIR_CMD" ]; then + if [ "$(which tree)" ]; then + export DIR_CMD="tree" + else + export DIR_CMD="ls" + fi + fi + + # Images + if [ "$PREV_IMGS" = 1 ] && [ -z "$IMG_VIEWER" ] && \ + [ -n "$DISPLAY" ]; then if [ "$(which ueberzug 2>/dev/null)" ]; then - UEBERZUG_OK=1 - IMG_VIEWER="ueberzug" + export UEBERZUG_OK=1 elif [ "$(which viu 2>/dev/null)" ]; then - IMG_VIEWER="viu" + export IMG_VIEWER="viu" elif [ "$(which catimg 2>/dev/null)" ]; then - IMG_VIEWER="catimg" + export IMG_VIEWER="catimg" elif [ "$(which img2txt 2>/dev/null)" ]; then - IMG_VIEWER="img2txt" + export IMG_VIEWER="img2txt" fi - # Überzug is not run directly, but through a function - [ "$IMG_VIEWER" = "ueberzug" ] && IMG_VIEWER="uz_image" fi - if [ "$(which atool 2>/dev/null)" ]; then - ARCHIVER_CMD="atool" - ARCHIVER_OPTS="-l" - elif [ "$(which bsdtar 2>/dev/null)" ]; then - ARCHIVER_CMD="bsdtar" - ARCHIVER_OPTS="-tvf" - elif [ "$(which tar 2>/dev/null)" ]; then - ARCHIVER_CMD="tar" - ARCHIVER_OPTS="-tvf" + # Überzug is not run directly, but through a function + if [ "$PREV_IMGS" = 1 ] && [ "$UEBERZUG_OK" = 1 ]; then + export IMG_VIEWER="uz_image" fi - if [ "$(which w3m 2>/dev/null)" ]; then - BROWSER="w3m" - elif [ "$(which linx 2>/dev/null)" ]; then - BROWSER="linx" - elif [ "$(which elinks 2>/dev/null)" ]; then - BROWSER="elinks" - elif [ "$(which pandoc 2>/dev/null)" ]; then - PANDOC_OK=1 + # Archives + if [ -z "$ARCHIVES" ]; then + if [ "$(which atool 2>/dev/null)" ]; then + export ARCHIVER_CMD="atool" + export ARCHIVER_OPTS="-l" + elif [ "$(which bsdtar 2>/dev/null)" ]; then + export ARCHIVER_CMD="bsdtar" + export ARCHIVER_OPTS="-tvf" + elif [ "$(which tar 2>/dev/null)" ]; then + export ARCHIVER_CMD="tar" + export ARCHIVER_OPTS="-tvf" + fi fi - if [ "$(which ffplay 2>/dev/null)" ]; then - FFPLAY_OK=1 - elif [ "$(which mplayer 2>/dev/null)" ]; then - MPLAYER_OK=1 - elif [ "$(which mpv 2>/dev/null)" ]; then - MPV_OK=1 + # Web + if [ -z "$BROWSER" ]; then + if [ "$(which w3m 2>/dev/null)" ]; then + export BROWSER="w3m" + elif [ "$(which linx 2>/dev/null)" ]; then + export BROWSER="linx" + elif [ "$(which elinks 2>/dev/null)" ]; then + export BROWSER="elinks" + fi fi - if [ "$(which exiftool 2>/dev/null)" ]; then - EXIFTOOL_OK=1 + # Music + if [ "$PLAY_MUSIC" = 1 ] && [ -z "$MUSIC" ]; then + if [ "$(which ffplay 2>/dev/null)" ]; then + export FFPLAY_OK=1 + elif [ "$(which mplayer 2>/dev/null)" ]; then + export MPLAYER_OK=1 + elif [ "$(which mpv 2>/dev/null)" ]; then + export MPV_OK=1 + fi fi - if [ "$(which mediainfo 2>/dev/null)" ]; then - MEDIAINFO_OK=1 + + # Video + if [ -z "$VIDEO" ]; then + if [ "$(which ffmpegthumbnailer 2>/dev/null)" ]; then + export FFMPEGTHUMB_OK=1 + fi fi - if [ "$(which pdftoppm 2>/dev/null)" ]; then - PDFTOPPM_OK=1 - elif [ "$(which pdftotext 2>/dev/null)" ]; then - PDFTOTEXT_OK=1 - elif [ "$(which mutool 2>/dev/null)" ]; then - MUTOOL_OK=1 + # File information + if [ -z "$FILEINFO" ]; then + if [ "$(which exiftool 2>/dev/null)" ]; then + export EXIFTOOL_CMD=1 + else + export FILE_OK=1 + fi fi - if [ "$(which libreoffice 2>/dev/null)" ]; then - LIBREOFFICE_OK=1 - elif [ "$(which catdoc 2>/dev/null)" ]; then - CATDOC_OK=1 + if [ -z "$MEDIAINFO" ]; then + if [ "$(which mediainfo 2>/dev/null)" ]; then + export MEDIAINFO_OK=1 + else + export FILE_OK=1 + fi fi - if [ "$(which bat 2>/dev/null)" ]; then - BAT_OK=1 - elif [ "$(which highlight 2>/dev/null)" ]; then - HIGHLIGHT_OK=1 - elif [ "$(which pygmentize 2>/dev/null)" ]; then - PYGMENTIZE_OK=1 + # PDF + if [ -z "$PDF" ]; then + if [ "$(which pdftoppm 2>/dev/null)" ]; then + export PDFTOPPM_OK=1 + elif [ "$(which pdftotext 2>/dev/null)" ]; then + export PDFTOTEXT_OK=1 + elif [ "$(which mutool 2>/dev/null)" ]; then + export MUTOOL_CMD=1 + fi fi - if [ "$(which ddjvu 2>/dev/null)" ]; then - DDJVU_OK=1 - elif [ "$(which djvutxt 2>/dev/null)" ]; then - DJVUTXT_OK=1 + # Office documents + if [ -z "$DOC" ]; then + if [ -z "$DOCASTEXT" ] && [ "$(which libreoffice 2>/dev/null)" ]; then + export LIBREOFFICE_OK=1 + else + [ "$(which catdoc 2>/dev/null)" ] && export CATDOC_OK=1 + [ "$(which odt2txt 2>/dev/null)" ] && export ODT2TXT_OK=1 + [ "$(which xlsx2csv 2>/dev/null)" ] && export XLSX2CSV_OK=1 + [ "$(which xls2csv 2>/dev/null)" ] && export XLS2CSV_OK=1 + [ "$(which unzip 2>/dev/null)" ] && export UNZIP_OK=1 + fi + fi + + [ "$(which pandoc 2>/dev/null)" ] && export PANDOC_OK=1 + + # Syntax highlighting + if [ -z "$TEXT" ]; then + if [ "$(which bat 2>/dev/null)" ]; then + export BAT_OK=1 + elif [ "$(which highlight 2>/dev/null)" ]; then + export HIGHLIGHT_OK=1 + elif [ "$(which pygmentize 2>/dev/null)" ]; then + export PYGMENTIZE_OK=1 + else + export CAT_OK=1 + fi + fi + + if [ -z "$JSON" ]; then + if [ "$(which python 2>/dev/null)" ]; then + export PYTHON_OK=1 + elif [ "$(which jq 2>/dev/null)" ]; then + export JQ_OK=1 + else + export CAT_OK=1 + fi + fi + + # Ddjvu + if [ -z "$DDJVU" ]; then + if [ "$(which ddjvu 2>/dev/null)" ]; then + export DDJVU_OK=1 + elif [ "$(which djvutxt 2>/dev/null)" ]; then + export DDJVUTXT_OK=1 + fi fi - if [ "$(which fontpreview 2>/dev/null)" ]; then - FONTPREVIEW_OK=1 - elif [ "$(which fontimage 2>/dev/null)" ]; then - FONTIMAGE_OK=1 + # Fonts + if [ -z "$FONTS" ]; then + if [ "$(which fontpreview 2>/dev/null)" ]; then + export FONTPREVIEW_OK=1 + elif [ "$(which fontimage 2>/dev/null)" ]; then + export FONTIMAGE_OK=1 + fi + fi + + # Markdown + if [ -z "$MARKDOWN" ]; then + if [ "$(which glow 2>/dev/null)" ]; then + export GLOW_OK=1 + fi + fi + + # Epub + if [ -z "$EPUB" ]; then + if [ "$(which epub-thumbnailer 2>/dev/null)" ]; then + export EPUBTHUMB_OK=1 + fi fi - [ "$(which ffmpegthumbnailer 2>/dev/null)" ] && FFMPEGTHUMB_OK=1 - [ "$(which convert 2>/dev/null)" ] && CONVERT_OK=1 - [ "$(which glow 2>/dev/null)" ] && GLOW_OK=1 - [ "$(which epub-thumbnailer 2>/dev/null)" ] && EPUBTHUMB_OK=1 + # Torrent + if [ "$(which transmission-show 2>/dev/null)" ]; then + export TRANSMISSION_OK=1 + fi + + # Used to convert some file types to images + [ "$(which convert 2>/dev/null)" ] && export CONVERT_OK=1 + + # Make sure we have file, use dto get files MIME type + [ "$(which file 2>/dev/null)" ] && export FILE_OK=1 - if [ "$UEBERZUG_OK" -eq 1 ]; then - export FIFO_UEBERZUG="$CACHE_DIR/ueberzug-${PPID}" + if [ "$UEBERZUG_OK" = 1 ] ; then + CACHEDIR="${XDG_CACHE_HOME:-$HOME/.cache}/clifm" + ! [ -d "$CACHEDIR" ] && mkdir -p "$CACHEDIR" + export FIFO_UEBERZUG="$CACHEDIR/ueberzug-${PPID}" trap uz_cleanup EXIT start_ueberzug fi TMP="$(mktemp /tmp/clifm.XXXXXX)" - # These variables are exported to the environment so that the previewer script: - # BFG.sh, executed from within FZF, can catch them all. - export IMG_VIEWER ARCHIVER_CMD ARCHIVER_OPTS BROWSER \ - FFPLAY_OK MEDIAINFO_OK PDFTOPPM_OK FFMPEGTHUMB_OK CONVERT_OK \ - LIBREOFFICE_OK HIGHLIGHT_OK FONTPREVIEW_OK BAT_OK EPUBTHUMB_OK DDJVU_OK \ - MPLAYER_OK EXIFTOOL_OK GLOW_OK MPV_OK PDFTOTEXT_OK CATDOC_OK \ - MUTOOL_OK PANDOC_OK COLORS PYGMENTIZE_OK DJVUTXT_OK UEBERZUG_OK \ - HELP BFG_FILE DIR_PREVIEWER FONTIMAGE_OK + ##################################### + # 3. RUN FZF, WHICH CALLS BFG # + ##################################### fcd "$@" |