diff --git a/fish/config.fish b/fish/config.fish index 6ab9525..e7c986c 100644 --- a/fish/config.fish +++ b/fish/config.fish @@ -22,6 +22,7 @@ alias gm='git commit -m' alias ga="git add -A" alias g+='bear -- g++ -Wextra -Werror -std=c++20' alias s="kitty +kitten ssh" +alias zl='z "" ' # pwd based on the value of _ZO_RESOLVE_SYMLINKS. function __zoxide_pwd diff --git a/joshuto/joshuto.toml b/joshuto/joshuto.toml new file mode 100644 index 0000000..cc80689 --- /dev/null +++ b/joshuto/joshuto.toml @@ -0,0 +1,4 @@ +[preview] +max_preview_size = 50000097152 +preview_shown_hook_script = "~/.config/joshuto/on_preview_shown" +preview_removed_hook_script = "~/.config/joshuto/on_preview_removed" diff --git a/joshuto/on_preview_removed.sh b/joshuto/on_preview_removed.sh new file mode 100755 index 0000000..bd66564 --- /dev/null +++ b/joshuto/on_preview_removed.sh @@ -0,0 +1,5 @@ +#!/usr/bin/env bash + +kitty +kitten icat \ + --transfer-mode=file \ + --clear 2>/dev/null diff --git a/joshuto/on_preview_shown b/joshuto/on_preview_shown new file mode 100755 index 0000000..c1f6a9d --- /dev/null +++ b/joshuto/on_preview_shown @@ -0,0 +1,32 @@ +#!/usr/bin/env bash + +FILE_PATH="$1" # Full path of the previewed file +PREVIEW_X_COORD="$2" # x coordinate of upper left cell of preview area +PREVIEW_Y_COORD="$3" # y coordinate of upper left cell of preview area +PREVIEW_WIDTH="$4" # Width of the preview pane (number of fitting characters) +PREVIEW_HEIGHT="$5" # Height of the preview pane (number of fitting characters) + +TMP_FILE="$HOME/.cache/joshuto/thumbcache.png" + +mimetype=$(file --mime-type -Lb "$FILE_PATH") + +function image { + kitty +kitten icat \ + --transfer-mode=file \ + --clear 2>/dev/null + kitty +kitten icat \ + --transfer-mode=file \ + --place "${PREVIEW_WIDTH}x${PREVIEW_HEIGHT}@${PREVIEW_X_COORD}x${PREVIEW_Y_COORD}" \ + "$1" 2>/dev/null +} + +case "$mimetype" in + image/*) + image "${FILE_PATH}" + ;; + *) + kitty +kitten icat \ + --transfer-mode=file \ + --clear 2>/dev/null + ;; +esac diff --git a/joshuto/preview.sh b/joshuto/preview.sh new file mode 100755 index 0000000..8b91cb9 --- /dev/null +++ b/joshuto/preview.sh @@ -0,0 +1,202 @@ +#!/usr/bin/env bash +# ranger supports enhanced previews. If the option "use_preview_script" +# is set to True and this file exists, this script will be called and its +# output is displayed in ranger. ANSI color codes are supported. + +# NOTES: This script is considered a configuration file. If you upgrade +# ranger, it will be left untouched. (You must update it yourself.) +# Also, ranger disables STDIN here, so interactive scripts won't work properly + +# Meanings of exit codes: +# code | meaning | action of ranger +# -----+------------+------------------------------------------- +# 0 | success | success. display stdout as preview +# 1 | no preview | failure. display no preview at all +# 2 | plain text | display the plain content of the file +# 3 | fix width | success. Don't reload when width changes +# 4 | fix height | success. Don't reload when height changes +# 5 | fix both | success. Don't ever reload +# 6 | image | success. display the image $cached points to as an image preview +# 7 | image | success. display the file directly as an image + +# Meaningful aliases for arguments: +path="$1" # Full path of the selected file +width="$2" # Width of the preview pane (number of fitting characters) +height="$3" # Height of the preview pane (number of fitting characters) +cached="$4" # Path that should be used to cache image previews +preview_images="$5" # "True" if image previews are enabled, "False" otherwise. +x_coord=0 +y_coord=0 +cache_path="" + +while [ "$#" -gt 0 ]; do + case "$1" in + "--path") + shift + path="$1" + ;; + "--preview-width") + shift + width="$1" + ;; + "--preview-height") + shift + height="$1" + ;; + "--x-coord") + shift + x_coord="$1" + ;; + "--y-coord") + shift + y_coord="$1" + ;; + "--preview-images") + shift + preview_images="$1" + ;; + "--image-cache") + shift + cache_path="$1" + ;; + esac + shift +done + + +maxln=200 # Stop after $maxln lines. Can be used like ls | head -n $maxln + +# Find out something about the file: +mimetype=$(file --mime-type -Lb "$path") +extension=$(/bin/echo "${path##*.}" | awk '{print tolower($0)}') +realpath=$(realpath "$path") + +# Functions: +# runs a command and saves its output into $output. Useful if you need +# the return value AND want to use the output in a pipe +try() { output=$(eval '"$@"'); } + +# writes the output of the previously used "try" command +dump() { /bin/echo "$output"; } + +# a common post-processing function used after most commands +trim() { head -n "$maxln"; } + +# wraps highlight to treat exit code 141 (killed by SIGPIPE) as success +safepipe() { "$@"; test $? = 0 -o $? = 141; } + +tmsu_tag_list() { + taglist=`tmsu tags -n never -1 "$path"` + result=$? + if [ $result -eq 0 ]; then + if [ -z "$taglist" ]; then + echo "No Tags" + else + taglist=`echo "$taglist" | sed 's/^/ • /'` + echo "Tags:" + echo "$taglist" + fi + fi +} + + + +# case "$mimetype" in +# image/* | video/* | audio/*) +# image_output="Tags:\n `tmsu tags -n never -1 "$path" | sed 's/^/ • /'`" +# echo -e "$image_output" +# esac + +# Image previews, if enabled in ranger. +if [ "$preview_images" = "True" ]; then + case "$mimetype" in + # Image previews for SVG files, disabled by default. + ###image/svg+xml) + ### convert "$path" "$cached" && exit 6 || exit 1;; + # Image previews for image files. w3mimgdisplay will be called for all + # image files (unless overriden as above), but might fail for + # unsupported types. + image/*) + exit 7;; + # Image preview for video, disabled by default.: + ###video/*) + ### ffmpegthumbnailer -i "$path" -o "$cached" -s 0 && exit 6 || exit 1;; + esac +fi + +case "$extension" in + # Archive extensions: + a|ace|alz|arc|arj|bz|bz2|cab|cpio|deb|gz|jar|lha|lz|lzh|lzma|lzo|\ + rpm|rz|t7z|tar|tbz|tbz2|tgz|tlz|txz|tZ|tzo|war|xpi|xz|Z|zip) + try als "$path" && { dump | trim; exit 0; } + try acat "$path" && { dump | trim; exit 3; } + try bsdtar -lf "$path" && { dump | trim; exit 0; } + exit 1;; + rar) + # avoid password prompt by providing empty password + try unrar -p- lt "$path" && { dump | trim; exit 0; } || exit 1;; + 7z) + # avoid password prompt by providing empty password + try 7z -p l "$path" && { dump | trim; exit 0; } || exit 1;; + # PDF documents: + pdf) + try pdftotext -l 10 -nopgbrk -q "$path" - && \ + { dump | trim | fmt -s -w $width; exit 0; } || exit 1;; + # BitTorrent Files + torrent) + try transmission-show "$path" && { dump | trim; exit 5; } || exit 1;; + # ODT Files + odt|ods|odp|sxw) + try odt2txt "$path" && { dump | trim; exit 5; } || exit 1;; + # HTML Pages: + htm|html|xhtml) + try w3m -dump "$path" && { dump | trim | fmt -s -w $width; exit 4; } + try lynx -dump "$path" && { dump | trim | fmt -s -w $width; exit 4; } + try elinks -dump "$path" && { dump | trim | fmt -s -w $width; exit 4; } + ;; # fall back to highlight/cat if the text browsers fail +esac + +case "$mimetype" in + # Syntax highlight for text files: + text/* | */xml | */json) + if [ "$(tput colors)" -ge 256 ]; then + pygmentize_format=terminal256 + highlight_format=xterm256 + else + pygmentize_format=terminal + highlight_format=ansi + fi + #try safepipe highlight --out-format=${highlight_format} "$path" && { dump | trim; exit 5; } + #try safepipe pygmentize -f ${pygmentize_format} "$path" && { dump | trim; exit 5; } + try safepipe bat -pp --color always "$path" && { dump | trim; exit 5; } + cat "$path" + exit 2;; + image/png | image/jpeg | image/gif) + dimension="Size `exiftool "$path" | grep '^Image Size' | awk '{print $4}'`" + tags=$(tmsu_tag_list) + echo "$realpath" + echo "$dimension" + echo "$tags" + meta_file="$(get_preview_meta_file $path)" + let y_offset=`printf "${tags}" | sed -n '=' | wc -l`+3 + echo "y-offset $y_offset" > "$meta_file" + exit 4 + ;; + image/*) + tags=$(tmsu_tag_list) + echo "$tags" + echo "$realpath" + exit 4 + #img2txt --gamma=0.6 --width="$width" "$path" && exit 4 || exit 1 + ;; + # Display information about media files: + video/* | audio/*) + tags=$(tmsu_tag_list) + echo "$tags" + echo "$realpath" + exiftool "$path" && exit 5 + # Use sed to remove spaces so the output fits into the narrow window + try mediainfo "$path" && { dump | trim | sed 's/ \+:/: /;'; exit 5; } || exit 1;; +esac + +exit 1