diff --git a/README b/README index 3ada0c5..2cf78df 100644 --- a/README +++ b/README @@ -12,8 +12,7 @@ ________________________________________________________________________________ * really nice escape sequence handling for keys which emit '\033['. Not based on read timeouts. Based on tracking position within sequences. -* has no dependencies other than a POSIX shell and POSIX coreutils (for printf, - [, etc if not builtin). +* no dependencies other than a POSIX shell and POSIX (printf, dd, [ and stty) * movement uses vim-like keybinds (hjkl). @@ -26,8 +25,8 @@ ________________________________________________________________________________ - [x] store list somehow. - [ ] search - [ ] prompts -- [ ] opener -- [ ] resize (POSIX shell winch is not asynchronous during read + SIGWINCH?) +- [x] opener +- [x] resize keybinds @@ -40,3 +39,77 @@ h - go up level g - go to top G - go to bottom q - quit + + +opener +________________________________________________________________________________ + +opening files in different applications (based on mime-type or file extension) +can be achieved via an environment variable (SHFM_OPENER) set to the location of +a small external script. The default for all files will be '$EDITOR' (and if +that is unset, 'vi'). + +The script receives a single argument, the full path to the selected file. +The opener script is also useful on the command-line. + +Example scripts: + + #!/bin/sh -e + # + # open file in application based on file extension + + case $1 in + *.mp3|*.flac|*.wav) + mpv --no-video "$1" + ;; + + *.mp4|*.mkv|*.webm) + mpv "$1" + ;; + + *.png|*.gif||*.jpg|*.jpe|*.jpeg) + gimp "$1" + ;; + + *.html|*.pdf) + firefox "$1" + ;; + + # all other files + *) + "${EDITOR:=vi}" "$1" + ;; + esac + + + #!/bin/sh -e + # + # open file in application based on mime-type + + mime_type=$(file -bi) + + case $mime_type in + audio/*) + mpv --no-video "$1" + ;; + + video/*) + mpv "$1" + ;; + + image/*) + gimp "$1" + ;; + + text/html*|application/pdf*) + firefox "$1" + ;; + + text/*|) + "${EDITOR:=vi}" "$1" + ;; + + *) + printf 'unknown mime-type %s\n' "$mime_type" + ;; + esac diff --git a/shfm b/shfm index 9c3a5c8..f9ba568 100755 --- a/shfm +++ b/shfm @@ -28,9 +28,8 @@ hist_search() { j=1 for file do - [ "${PWD%%/}/$file" = "$old_pwd" ] && { + [ "${PWD%%/}/$file" = "$old_pwd" ] && y=$j y2=$((j > bottom ? bottom : j)) - } j=$((j + 1)) done @@ -61,10 +60,6 @@ list_print() { printf '\033[%sH' "$((y > bottom ? bottom : y))" } -list_reset() { - y=1 y2=1 -} - redraw() { list_print "$@" status_line "$PWD ($y/$#)" @@ -75,20 +70,6 @@ status_line() { "$LINES" "$COLUMNS" "$1" } -open_ext() { - # todo envar whatever - case $1 in - *.mp3|*.mp4|*.mkv|*.webm|*.flac|\ - *.jpg|*.png|*.gif|*.jpeg|*.jpe) - mpv "$1" - ;; - - *) - "${EDITOR:=vi}" "$1" - ;; - esac -} - print_line() { offset=$1 @@ -112,11 +93,11 @@ main() { term_resize term_setup - list_reset + y=1 y2=1 redraw "$@" trap 'term_reset' EXIT INT - trap 'term_resize; term_setup; list_reset; redraw "$@"' WINCH + trap 'term_resize; term_setup; y=1 y2=1; redraw "$@"' WINCH while key=$(dd ibs=1 count=1 2>/dev/null); do case $key${esc:=0} in @@ -155,11 +136,9 @@ main() { l?|C2) # ARROW RIGHT if cd "$cur"; then set -- * - list_reset + y=1 y2=1 else - term_reset - open_ext "$cur" - term_setup + "${SHFM_OPENER:="${EDITOR:=vi}"}" "$cur" fi redraw "$@" @@ -169,8 +148,7 @@ main() { old_pwd=$PWD cd .. || continue set -- * - list_reset - hist=1 + y=1 y2=1 hist=1 redraw "$@" ;;