dotfiles

Linux and macOS dotfiles
git clone https://github.com/michaelneuper/dotfiles.git
README | Files | Log | Refs

commit f89577d1df7186bed52821adfd5f332daaafba98
parent b83b81f6d90de2a01921d04c6b4d27ea67355d11
Author: Michael Neuper <73108749+michaelneuper@users.noreply.github.com>
Date:   Thu, 17 Nov 2022 17:46:07 +0200

Once again trying to get previews to work

Diffstat:
M.config/lf/cleaner | 8++++----
C.config/lf/cleaner -> .config/lf/cleaner.old | 0
M.config/lf/lfrc | 5++---
A.config/lf/lfub.old | 24++++++++++++++++++++++++
A.config/lf/preview.old | 95+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
A.config/lf/previewer | 81+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
A.config/lf/scope.old | 49+++++++++++++++++++++++++++++++++++++++++++++++++
A.config/lf/startlf | 29+++++++++++++++++++++++++++++
8 files changed, 284 insertions(+), 7 deletions(-)

diff --git a/.config/lf/cleaner b/.config/lf/cleaner @@ -1,4 +1,4 @@ -#!/bin/sh -if [ -n "$FIFO_UEBERZUG" ]; then - printf '{"action": "remove", "identifier": "PREVIEW"}\n' > "$FIFO_UEBERZUG" -fi +#!/usr/bin/env bash + +>"${UEBERZUG_FIFO}" declare -A -p cmd=( \ + [action]=remove [identifier]="$UEBERZUG_IDEN" ) diff --git a/.config/lf/cleaner b/.config/lf/cleaner.old diff --git a/.config/lf/lfrc b/.config/lf/lfrc @@ -1,8 +1,7 @@ # Basic Settings -set ratios 1:2:3 -set previewer ~/.config/lf/preview -set cleaner ~/.config/lf/cleaner set preview true +set previewer ~/.config/lf/previewer +set cleaner ~/.config/lf/cleaner set drawbox true set ignorecase true set icons true diff --git a/.config/lf/lfub.old b/.config/lf/lfub.old @@ -0,0 +1,24 @@ +#!/bin/sh + +# This is a wrapper script for lb that allows it to create image previews with +# ueberzug. This works in concert with the lf configuration file and the +# lf-cleaner script. + +set -e + +cleanup() { + exec 3>&- + rm "$FIFO_UEBERZUG" +} + +if [ -n "$SSH_CLIENT" ] || [ -n "$SSH_TTY" ]; then + lf "$@" +else + [ ! -d "$HOME/.cache/lf" ] && mkdir -p "$HOME/.cache/lf" + export FIFO_UEBERZUG="$HOME/.cache/lf/ueberzug-$$" + mkfifo "$FIFO_UEBERZUG" + ueberzug layer -s <"$FIFO_UEBERZUG" -p json & + exec 3>"$FIFO_UEBERZUG" + trap cleanup HUP INT QUIT TERM PWR EXIT + lf "$@" 3>&- +fi diff --git a/.config/lf/preview.old b/.config/lf/preview.old @@ -0,0 +1,95 @@ +#!/bin/sh + +image() { + if [ -n "$DISPLAY" ] && [ -z "$WAYLAND_DISPLAY" ]; then + printf '{"action": "add", "identifier": "PREVIEW", "x": "%s", "y": "%s", "width": "%s", "height": "%s", "scaler": "contain", "path": "%s"}\n' "$4" "$5" "$(($2-1))" "$(($3-1))" "$1" > "$FIFO_UEBERZUG" + exit 1 + else + chafa "$1" -s "$4x" + fi +} + +batorcat() { + file="$1" + shift + if command -v bat > /dev/null 2>&1 + then + bat --color=always --style=plain --pager=never "$file" "$@" + else + cat "$file" + fi +} + +glowormdcat() { + file="$1" + shift + if command -v glow > /dev/null 2>&1 + then + glow "$file" + else + mdcat "$file" + fi +} + +CACHE="$HOME/.cache/lf/thumbnail.$(stat --printf '%n\0%i\0%F\0%s\0%W\0%Y' -- "$(readlink -f "$1")" | sha256sum | awk '{print $1}'))" + +case "$(printf "%s\n" "$(readlink -f "$1")" | awk '{print tolower($0)}')" in + *.tgz|*.tar.gz) tar tzf "$1" ;; + *.tar.bz2|*.tbz2) tar tjf "$1" ;; + *.tar.txz|*.txz) xz --list "$1" ;; + *.tar) tar tf "$1" ;; + *.zip|*.jar|*.war|*.ear|*.oxt) unzip -l "$1" ;; + *.rar) unrar l "$1" ;; + *.md) + glowormdcat "$1";; + *.7z) 7z l "$1" ;; + *.[1-8]) man "$1" | col -b ;; + *.o) nm "$1";; + *.torrent) transmission-show "$1" ;; + *.iso) iso-info --no-header -l "$1" ;; + *.odt|*.ods|*.odp|*.sxw) odt2txt "$1" ;; + *.doc) catdoc "$1" ;; + *.docx) docx2txt "$1" ;; + *.xml|*.html) w3m -dump "$1";; + *.xls|*.xlsx) + ssconvert --export-type=Gnumeric_stf:stf_csv "$1" "fd://1" | batorcat --language=csv + ;; + *.wav|*.mp3|*.flac|*.m4a|*.wma|*.ape|*.ac3|*.og[agx]|*.spx|*.opus|*.as[fx]|*.mka) + exiftool "$1" + ;; + *.pdf) + [ ! -f "${CACHE}.jpg" ] && \ + pdftoppm -jpeg -f 1 -singlefile "$1" "$CACHE" + image "${CACHE}.jpg" "$2" "$3" "$4" "$5" + ;; + *.epub) + [ ! -f "$CACHE" ] && \ + epub-thumbnailer "$1" "$CACHE" 1024 + image "$CACHE" "$2" "$3" "$4" "$5" + ;; + *.cbz|*.cbr|*.cbt) + [ ! -f "$CACHE" ] && \ + comicthumb "$1" "$CACHE" 1024 + image "$CACHE" "$2" "$3" "$4" "$5" + ;; + *.avi|*.mp4|*.wmv|*.dat|*.3gp|*.ogv|*.mkv|*.mpg|*.mpeg|*.vob|*.fl[icv]|*.m2v|*.mov|*.webm|*.ts|*.mts|*.m4v|*.r[am]|*.qt|*.divx) + [ ! -f "${CACHE}.jpg" ] && \ + ffmpegthumbnailer -i "$1" -o "${CACHE}.jpg" -s 0 -q 5 + image "${CACHE}.jpg" "$2" "$3" "$4" "$5" + ;; + *.bmp|*.jpg|*.jpeg|*.png|*.xpm|*.webp|*.tiff|*.gif|*.jfif|*.ico) + image "$1" "$2" "$3" "$4" "$5" + ;; + *.svg) + [ ! -f "${CACHE}.jpg" ] && \ + convert "$1" "${CACHE}.jpg" + image "${CACHE}.jpg" "$2" "$3" "$4" "$5" + ;; + *.ino) + batorcat --language=cpp "$1" + ;; + *) + batorcat "$1" + ;; +esac +exit 0 diff --git a/.config/lf/previewer b/.config/lf/previewer @@ -0,0 +1,81 @@ +#!/usr/bin/env bash + +FILE="$HOME/.cache/lf/err.png" + +function hash_filename { + FILE="$HOME/.cache/lf/$(echo ${1%.*} | sed -e 's|/|\!|g').$2" +} + +function draw_clear { + >"${UEBERZUG_FIFO}" declare -A -p cmd=( \ + [action]=remove [identifier]="$UEBERZUG_IDEN" ) +} + +function draw_image { +# chafa -c full -s ${3}x${2} "$1" + + >"${UEBERZUG_FIFO}" declare -A -p cmd=( \ + [action]=add [identifier]="$UEBERZUG_IDEN" \ + [x]="$4" [y]="$5" [width]="$3" [height]="$2" \ + [scaler]=fit_contain [scaling_position_x]=0.5 [scaling_position_y]=0.5 \ + [path]="$1" ) + + exit 1 +} + +function make_video { + if [ "${FILE}" -ot "$1" ]; then + ffmpegthumbnailer -t 0% -q 3 -s 0 \ + -c jpeg -i "$1" -o "${FILE}" + fi +} + +function make_pdf { + if [ "${FILE}" -ot "$1" ]; then + pdftoppm -png -f 1 -l 1 -jpeg -tiffcompression jpeg \ + -scale-to-x -1 -scale-to-y 1080 \ + -singlefile "$1" "${FILE%.png}" + fi +} + +case $(file -b --mime-type "$1") in + text/*) + draw_clear + cat "$1" + ;; + image/*) + draw_image "$1" "$2" "$3" "$4" "$5" + ;; + video/*) + hash_filename "$1" "jpg" + make_video "$1" "$2" "$3" + draw_image "${FILE}" "$2" "$3" "$4" "$5" + ;; + audio/*) + draw_clear + exiftool "$1" + ;; + application/pdf) + hash_filename "$1" "png" + make_pdf "$1" "$2" "$3" + draw_image "${FILE}" "$2" "$3" "$4" "$5" + ;; + application/gzip|application/x-xz) + draw_clear + tar tf "$1" + ;; + application/zip) + draw_clear + unzip -Z -1 "$1" + ;; + application/x-sharedlib) + draw_clear + readelf -h "$1" + ;; + *) + draw_clear + cat "$1" + ;; +esac + +exit 0 diff --git a/.config/lf/scope.old b/.config/lf/scope.old @@ -0,0 +1,49 @@ +#!/bin/sh + +# File preview handler for lf. + +set -C -f +IFS="$(printf '%b_' '\n')"; IFS="${IFS%_}" + +image() { + if [ -f "$1" ] && [ -n "$DISPLAY" ] && [ -z "$WAYLAND_DISPLAY" ] && command -V ueberzug >/dev/null 2>&1; then + printf '{"action": "add", "identifier": "PREVIEW", "x": "%s", "y": "%s", "width": "%s", "height": "%s", "scaler": "contain", "path": "%s"}\n' "$4" "$5" "$(($2-1))" "$(($3-1))" "$1" > "$FIFO_UEBERZUG" + else + mediainfo "$6" + fi +} + +ifub() { + [ -n "$DISPLAY" ] && [ -z "$WAYLAND_DISPLAY" ] && command -V ueberzug >/dev/null 2>&1 +} + +# Note that the cache file name is a function of file information, meaning if +# an image appears in multiple places across the machine, it will not have to +# be regenerated once seen. + +case "$(file --dereference --brief --mime-type -- "$1")" in + image/*) image "$1" "$2" "$3" "$4" "$5" "$1" ;; + text/html) lynx -width="$4" -display_charset=utf-8 -dump "$1" ;; + text/troff) man ./ "$1" | col -b ;; + text/* | */xml | application/json) bat --terminal-width "$(($4-2))" -f "$1" ;; + application/zip) atool --list -- "$1" ;; + audio/* | application/octet-stream) mediainfo "$1" || exit 1 ;; + video/* ) + CACHE="${XDG_CACHE_HOME:-$HOME/.cache}/lf/thumb.$(stat --printf '%n\0%i\0%F\0%s\0%W\0%Y' -- "$(readlink -f "$1")" | sha256sum | cut -d' ' -f1)" + [ ! -f "$CACHE" ] && ffmpegthumbnailer -i "$1" -o "$CACHE" -s 0 + image "$CACHE" "$2" "$3" "$4" "$5" "$1" + ;; + */pdf) + CACHE="${XDG_CACHE_HOME:-$HOME/.cache}/lf/thumb.$(stat --printf '%n\0%i\0%F\0%s\0%W\0%Y' -- "$(readlink -f "$1")" | sha256sum | cut -d' ' -f1)" + [ ! -f "$CACHE.jpg" ] && pdftoppm -jpeg -f 1 -singlefile "$1" "$CACHE" + image "$CACHE.jpg" "$2" "$3" "$4" "$5" "$1" + ;; + */epub+zip|*/mobi*) + CACHE="${XDG_CACHE_HOME:-$HOME/.cache}/lf/thumb.$(stat --printf '%n\0%i\0%F\0%s\0%W\0%Y' -- "$(readlink -f "$1")" | sha256sum | cut -d' ' -f1)" + [ ! -f "$CACHE.jpg" ] && gnome-epub-thumbnailer "$1" "$CACHE.jpg" + image "$CACHE.jpg" "$2" "$3" "$4" "$5" "$1" + ;; + *opendocument*) odt2txt "$1" ;; + application/pgp-encrypted) gpg -d -- "$1" ;; +esac +exit 1 diff --git a/.config/lf/startlf b/.config/lf/startlf @@ -0,0 +1,28 @@ +#!/usr/bin/env bash + +declare -r -x UEBERZUG_FIFO="$(mktemp --dry-run --suffix "lf-$$-ueberzug")" +declare -r -x UEBERZUG_IDEN="${UEBERZUG_FIFO#*.}" +declare -r -x PREVIEW_TMP="$(mktemp -d --suffix "lf-$$-ueberzug")" + +function check_cache { + if [ ! -d "$HOME/.cache/lf" ]; then + mkdir -p "$HOME/.cache/lf" + fi +} + +function start_ueberzug { + mkfifo "${UEBERZUG_FIFO}" + <"${UEBERZUG_FIFO}" ueberzug layer --parser bash --silent & + 3> "${UEBERZUG_FIFO}" exec +} + +function remove_temp { + rm "${UEBERZUG_FIFO}" + rm -r "${PREVIEW_TMP}" +} + + +check_cache +start_ueberzug +lf "$@" +remove_temp +\ No newline at end of file