This commit is contained in:
Dylan Araps 2020-08-03 23:33:13 +03:00
parent 436543fb8e
commit 5a384d86e0
No known key found for this signature in database
GPG Key ID: 46D62DD9F1DE636E
2 changed files with 83 additions and 32 deletions

81
README
View File

@ -12,8 +12,7 @@ ________________________________________________________________________________
* really nice escape sequence handling for keys which emit '\033[<stuff>'. 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

34
shfm
View File

@ -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 "$@"
;;