sfm

Simple File Manager
git clone git://git.emmett1.my/sfm.git
Log | Files | Refs | README | LICENSE

commit 32337e4ccaab0649b31ed5c53aa84146793199fb
parent 03df88a15031d196d274dc7763f6ee0ead85733d
Author: emmett1 <me@emmett1.my>
Date:   Sun,  5 Apr 2026 01:35:44 +0800

show hidden files first when enabled hidden

Diffstat:
Msfm | 55+++++++++++++++++++++++++++++--------------------------
1 file changed, 29 insertions(+), 26 deletions(-)

diff --git a/sfm b/sfm @@ -1,6 +1,5 @@ #!/bin/sh -# sfm - Simple File Manager in POSIX sh (flicker-free) -# version 0.4 +# sfm - Simple File Manager in POSIX sh # --- terminal control --- tput_cmd() { command -v tput >/dev/null 2>&1 && tput "$@"; } @@ -107,22 +106,11 @@ load_entries() { ENTRIES="" COUNT=0 - # build list of dir names then file names, including dotfiles if enabled - for d in "$CWD"/*/; do - [ -d "$d" ] || continue - [ -L "${d%/}" ] && continue # symlinks handled separately - name="${d%/}"; name="${name##*/}" - [ "$name" = "*" ] && continue - case "$name" in .*) continue ;; esac - ENTRIES="$ENTRIES -${name}/" - COUNT=$((COUNT + 1)) - done + # hidden dirs first if [ "$SHOW_HIDDEN" = "1" ]; then - for d in "$CWD"/./; do : ; done for d in "$CWD"/.*/; do [ -d "$d" ] || continue - [ -L "${d%/}" ] && continue # symlinks handled separately + [ -L "${d%/}" ] && continue name="${d%/}"; name="${name##*/}" [ "$name" = "." ] || [ "$name" = ".." ] && continue [ "$name" = ".*" ] && continue @@ -132,21 +120,19 @@ ${name}/" done fi - for f in "$CWD"/*; do - [ -e "$f" ] || [ -L "$f" ] || continue - [ -d "$f" ] && ! [ -L "$f" ] && continue - name="${f##*/}" + # regular dirs + for d in "$CWD"/*/; do + [ -d "$d" ] || continue + [ -L "${d%/}" ] && continue + name="${d%/}"; name="${name##*/}" [ "$name" = "*" ] && continue case "$name" in .*) continue ;; esac - if [ -L "$f" ]; then - ENTRIES="$ENTRIES -${name}@" - else - ENTRIES="$ENTRIES -${name}" - fi + ENTRIES="$ENTRIES +${name}/" COUNT=$((COUNT + 1)) done + + # hidden files first if [ "$SHOW_HIDDEN" = "1" ]; then for f in "$CWD"/.*; do [ -e "$f" ] || [ -L "$f" ] || continue @@ -164,6 +150,23 @@ ${name}" done fi + # regular files + for f in "$CWD"/*; do + [ -e "$f" ] || [ -L "$f" ] || continue + [ -d "$f" ] && ! [ -L "$f" ] && continue + name="${f##*/}" + [ "$name" = "*" ] && continue + case "$name" in .*) continue ;; esac + if [ -L "$f" ]; then + ENTRIES="$ENTRIES +${name}@" + else + ENTRIES="$ENTRIES +${name}" + fi + COUNT=$((COUNT + 1)) + done + ENTRIES="${ENTRIES# }"