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:
| M | sfm | | | 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#
}"