2

I am using Ranger as a file explorer, and by the way it's great...

I have an issue because Ranger can display a preview of the file currently selected. Which is quite useful but becomes problematic for large files. Indeed, for large files, it takes a lot of time and ressources to do create a preview.

My question is : is there a way to set the maximal size for which Ranger won't try to display a preview ?

4

I found the solution, at least for text files, the problem was in the highlighting... Ranger was trying to highlight long files... the workaround I found is shown in the following excerpt of ~/.config/ranger/scope.sh

#!/usr/bin/env sh

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)
maxln=54    # 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=${path##*.}

try() { output=$(eval '"$@"'); }
dump() { echo "$output"; }
trim() { head -n "$maxln"; }
hl() { command head -n "$maxln" "$path" | highlight --syntax="$extension" --out-format=ansi; test $? = 0 -o $? = 141; }

case "$mimetype" in
    # Syntax highlight for text files:
    text/* | */xml)
        try hl && { dump | trim; exit 5; } || exit 2;;
esac
exit 1

The idea, it to select only the first lines of the textfile and then call highligh only on that portion.

1

You can include commands, in some parts of your scope.sh, to check for file size.

First, add new function (paste code above handle_extension() in scope.sh):

drop_bigsize() {
    # 51200 == 50 MB * 1024
    # change this number for different sizes
    if [[ `du "${FILE_PATH}" | cut -f1` -gt 51200 ]]; then
        echo '----- TOO BIG FILE -----'
        exit 0
    fi
}

Second, call that function somewhere in scope.sh.
For example, the code below will prevent from previewing any files with size bigger than 50MB (its the last few lines from scope.sh):

...
MIMETYPE="$( file --dereference --brief --mime-type -- "${FILE_PATH}" )"

### start of new block ###
drop_bigsize
### end of new block ###

if [[ "${PV_IMAGE_ENABLED}" == 'True' ]]; then
    handle_image "${MIMETYPE}"
fi

handle_extension
handle_mime "${MIMETYPE}"
handle_fallback

exit 1

To do such stuff with some specific file types, e.g. for some archives, you would need to place the same block of code in different part of your scope.sh:

...
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)
            ### start of new block ###
            drop_bigsize
            ### end of new block ###
            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;;
...

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.