.config/ranger/scope.sh
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 |
#!/usr/bin/env bash set -o noclobber -o noglob -o nounset -o pipefail IFS=$'\n' # If the option `use_preview_script` is set to `true`, # then this script will be called and its output will be displayed in ranger. # ANSI color codes are supported. # STDIN is disabled, so interactive scripts won't work properly # This script is considered a configuration file and must be updated manually. # It will be left untouched if you upgrade ranger. # Meanings of exit codes: # code | meaning | action of ranger # -----+------------+------------------------------------------- # 0 | success | Display stdout as preview # 1 | no preview | Display no preview at all # 2 | plain text | Display the plain content of the file # 3 | fix width | Don't reload when width changes # 4 | fix height | Don't reload when height changes # 5 | fix both | Don't ever reload # 6 | image | Display the image `$IMAGE_CACHE_PATH` points to as an image preview # 7 | image | Display the file directly as an image # Script arguments FILE_PATH="${1}" # Full path of the highlighted file PV_WIDTH="${2}" # Width of the preview pane (number of fitting characters) PV_HEIGHT="${3}" # Height of the preview pane (number of fitting characters) IMAGE_CACHE_PATH="${4}" # Full path that should be used to cache image preview PV_IMAGE_ENABLED="${5}" # 'True' if image previews are enabled, 'False' otherwise. FILE_EXTENSION="${FILE_PATH##*.}" FILE_EXTENSION_LOWER=$(echo ${FILE_EXTENSION} | tr '[:upper:]' '[:lower:]') # Settings HIGHLIGHT_SIZE_MAX=262143 # 256KiB HIGHLIGHT_TABWIDTH=8 HIGHLIGHT_STYLE='pablo' PYGMENTIZE_STYLE='autumn' handle_extension() { case "${FILE_EXTENSION_LOWER}" in # Archive 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) atool --list -- "${FILE_PATH}" && exit 5 bsdtar --list --file "${FILE_PATH}" && exit 5 exit 1;; rar) # Avoid password prompt by providing empty password unrar lt -p- -- "${FILE_PATH}" && exit 5 exit 1;; 7z) # Avoid password prompt by providing empty password 7z l -p -- "${FILE_PATH}" && exit 5 exit 1;; # PDF pdf) # Preview as text conversion pdftotext -l 10 -nopgbrk -q -- "${FILE_PATH}" - && exit 5 exiftool "${FILE_PATH}" && exit 5 exit 1;; # BitTorrent torrent) transmission-show -- "${FILE_PATH}" && exit 5 exit 1;; # OpenDocument odt|ods|odp|sxw) # Preview as text conversion odt2txt "${FILE_PATH}" && exit 5 exit 1;; # HTML htm|html|xhtml) # Preview as text conversion w3m -dump "${FILE_PATH}" && exit 5 lynx -dump -- "${FILE_PATH}" && exit 5 elinks -dump "${FILE_PATH}" && exit 5 ;; # Continue with next handler on failure esac } handle_image() { local mimetype="${1}" case "${mimetype}" in # SVG # image/svg+xml) # convert "${FILE_PATH}" "${IMAGE_CACHE_PATH}" && exit 6 # exit 1;; # Image image/*) local orientation orientation="$( identify -format '%[EXIF:Orientation]\n' -- "${FILE_PATH}" )" # If orientation data is present and the image actually # needs rotating ("1" means no rotation)... if [[ -n "$orientation" && "$orientation" != 1 ]]; then # ...auto-rotate the image according to the EXIF data. convert -- "${FILE_PATH}" -auto-orient "${IMAGE_CACHE_PATH}" && exit 6 fi # `w3mimgdisplay` will be called for all images (unless overriden as above), # but might fail for unsupported types. exit 7;; # Video # video/*) # # Thumbnail # ffmpegthumbnailer -i "${FILE_PATH}" -o "${IMAGE_CACHE_PATH}" -s 0 && exit 6 # exit 1;; # PDF # application/pdf) # pdftoppm -f 1 -l 1 \ # -scale-to-x 1920 \ # -scale-to-y -1 \ # -singlefile \ # -jpeg -tiffcompression jpeg \ # -- "${FILE_PATH}" "${IMAGE_CACHE_PATH%.*}" \ # && exit 6 || exit 1;; esac } handle_mime() { local mimetype="${1}" case "${mimetype}" in # Text text/* | */xml) # Syntax highlight if [[ "$( stat --printf='%s' -- "${FILE_PATH}" )" -gt "${HIGHLIGHT_SIZE_MAX}" ]]; then exit 2 fi if [[ "$( tput colors )" -ge 256 ]]; then local pygmentize_format='terminal256' local highlight_format='xterm256' else local pygmentize_format='terminal' local highlight_format='ansi' fi highlight --replace-tabs="${HIGHLIGHT_TABWIDTH}" --out-format="${highlight_format}" \ --style="${HIGHLIGHT_STYLE}" --force -- "${FILE_PATH}" && exit 5 # pygmentize -f "${pygmentize_format}" -O "style=${PYGMENTIZE_STYLE}" -- "${FILE_PATH}" && exit 5 exit 2;; # Image image/*) # Preview as text conversion # img2txt --gamma=0.6 --width="${PV_WIDTH}" -- "${FILE_PATH}" && exit 4 exiftool "${FILE_PATH}" && exit 5 exit 1;; # Video and audio video/* | audio/*) mediainfo "${FILE_PATH}" && exit 5 exiftool "${FILE_PATH}" && exit 5 exit 1;; esac } handle_fallback() { echo '----- File Type Classification -----' && file --dereference --brief -- "${FILE_PATH}" && exit 5 exit 1 } MIMETYPE="$( file --dereference --brief --mime-type -- "${FILE_PATH}" )" if [[ "${PV_IMAGE_ENABLED}" == 'True' ]]; then handle_image "${MIMETYPE}" fi handle_extension handle_mime "${MIMETYPE}" handle_fallback exit 1 |