summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorleo-arch <leonardoabramovich2@gmail.com>2021-06-06 23:10:48 -0300
committerleo-arch <leonardoabramovich2@gmail.com>2021-06-06 23:10:48 -0300
commit6e62dc92f4122d16772444bdcf108767835761f5 (patch)
treef143b1bcc9097ab5e1c9861f9e42387f527c7ba2
parentfd3311c28528484388ec8277e6f57bc555025e05 (diff)
Cache hashes and config file for BFG
-rw-r--r--plugins/BFG.cfg99
-rwxr-xr-xplugins/BFG.sh204
-rwxr-xr-xplugins/fzfnav.sh495
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 "$@"