commit 25a329aba92d483fe42ff70d5ab85b92e26e4c86
parent 6f9feaf9b4c9004ef4e2b98e7979e36469943475
Author: emmett1 <emmett1.2miligrams@protonmail.com>
Date: Sat, 28 Mar 2026 00:08:08 +0800
added opener script support
Diffstat:
| M | README.txt | | | 131 | +++++++++++++++++++++++++++++++++++++++++++++++-------------------------------- |
| M | sfm | | | 8 | ++++++++ |
2 files changed, 86 insertions(+), 53 deletions(-)
diff --git a/README.txt b/README.txt
@@ -1,15 +1,15 @@
sfm - Simple File Manager
==========================
-
+
DESCRIPTION
-----------
sfm is a lightweight, terminal-based file manager written entirely in
POSIX sh. It runs in your terminal with no external dependencies beyond
standard Unix tools (ls, awk, tput, stty, mv, cp, rm). Designed to be
fast, flicker-free, and keyboard-driven with a vim-inspired key layout.
-
-
+
+
REQUIREMENTS
------------
- A POSIX-compatible shell (sh, dash, bash, etc.)
@@ -18,41 +18,41 @@ REQUIREMENTS
- Optional: mpv, vlc, feh, zathura, etc. (for smart file opening)
- Optional: readlink (for symlink display)
- Optional: file (for MIME type detection)
-
-
+
+
INSTALLATION
------------
Using make (recommended):
-
+
make install
-
+
This installs sfm to /usr/local/bin by default. To change the prefix:
-
+
make install PREFIX=/usr
-
+
To uninstall:
-
+
make uninstall
-
+
Manual installation:
-
+
cp sfm /usr/local/bin/sfm
chmod +x /usr/local/bin/sfm
-
-
+
+
USAGE
-----
sfm [path]
-
+
If no path is given, sfm opens in the current directory.
-
+
Examples:
sfm # open in current directory
sfm /mnt/data # open at a specific path
sfm ~ # open home directory
sfm .. # open parent directory
-
-
+
+
NAVIGATION
----------
j / k or up/down arrows Move up / down
@@ -62,15 +62,15 @@ NAVIGATION
G Jump to bottom of list
~ Go to home directory
` (backtick) Jump to previous directory
-
-
+
+
SEARCH & FILTER
---------------
/ Enter search mode (filters listing as you type)
esc Clear filter and exit search mode
enter Exit search mode but keep filter active
-
-
+
+
DISPLAY TOGGLES
---------------
. Toggle hidden files (dotfiles)
@@ -79,19 +79,42 @@ DISPLAY TOGGLES
s Cycle sort mode: name -> size -> date
i Show file info (permissions, size, date) in status bar
R Refresh current directory listing
-
-
+
+
PREVIEW PANE
------------
Press P to toggle the preview pane on the right side of the screen.
The list pane takes the left half, preview takes the right half.
-
+
Text files Shows file contents line by line
- Directories Shows entry count
+ Directories Shows directory contents
Symlinks Shows link target
Binary files Shows file size
-
-
+
+
+CUSTOM OPENER
+-------------
+sfm checks for a user-defined opener script at:
+
+ ~/.config/sfm/opener
+
+If the file exists and is executable, sfm passes the selected file
+path to it instead of using the built-in smart opener. Example:
+
+ #!/bin/sh
+ case "$1" in
+ *.jpg|*.jpeg) imv "$1" ;;
+ *.mp4) mpv "$1" ;;
+ *.html|*.pdf) firefox "$1" ;;
+ *) echo "no program set for this file type" ;;
+ esac
+
+Make it executable: chmod +x ~/.config/sfm/opener
+
+If the opener script does not exist, sfm falls back to its built-in
+smart opener automatically.
+
+
FILE OPERATIONS
---------------
r Rename selected entry
@@ -101,45 +124,45 @@ FILE OPERATIONS
u Move to trash (safe delete)
U Open trash directory
o Open with custom program
-
-
+
+
CLIPBOARD
---------
y Yank / copy (works on multi-selection)
x Cut (works on multi-selection)
p Paste into current directory
c Copy full path of selected entry to system clipboard
-
-
+
+
MULTI-SELECT
------------
space Toggle multi-select on current entry (cursor advances)
a Select all / deselect all
-
-
+
+
BOOKMARKS
---------
b Bookmark current directory (press again to remove)
B Open bookmark picker (j/k navigate, enter jump)
-
+
Bookmarks are saved to: ~/.config/sfm/bookmarks
-
-
+
+
SHELL & UTILITIES
-----------------
! Drop into $SHELL in current directory (type "exit" to return)
-
-
+
+
HELP
----
? Show keyboard shortcuts overlay
-
-
+
+
QUIT
----
q Quit sfm
-
-
+
+
STATUS BAR INDICATORS
---------------------
[hidden] Hidden files are visible
@@ -148,13 +171,13 @@ STATUS BAR INDICATORS
[cut] A file is in the clipboard (cut mode)
[sel:N] N items are currently selected
[details] Size/date column is visible
-
-
+
+
SMART FILE OPENER
-----------------
When you open a file, sfm detects the file type by extension and
MIME type, then picks an appropriate program automatically:
-
+
Text / code $EDITOR (or vi)
Images imv, feh, sxiv, eog, gimp
Video mpv, vlc, mplayer, totem
@@ -162,24 +185,26 @@ MIME type, then picks an appropriate program automatically:
PDF zathura, evince, okular, mupdf
Office docs libreoffice
Archives atool / bsdtar (lists contents in pager)
-
+
Falls back to xdg-open, open (macOS), or $EDITOR if nothing matches.
Use 'o' to manually specify any program.
-
-
+
+
TRASH
-----
Files deleted with 'u' are moved to:
-
+
~/.local/share/sfm-trash/
-
+
Files are prefixed with a timestamp: YYYYMMDD_HHMMSS_filename
Use U to browse the trash directory. To restore a file, rename it
(press r) to remove the timestamp prefix, then cut (x) and paste (p)
it back to the desired location.
-
-
+
+
DATA FILES
----------
~/.config/sfm/bookmarks Saved bookmarks (one path per line)
+ ~/.config/sfm/opener Custom file opener script (optional)
~/.local/share/sfm-trash/ Trashed files
+
diff --git a/sfm b/sfm
@@ -679,6 +679,14 @@ _run_gui() { "$@" >/dev/null 2>&1 & }
open_file() {
_f="$1"
+
+ # use user opener script if it exists and is executable
+ _opener="${XDG_CONFIG_HOME:-$HOME/.config}/sfm/opener"
+ if [ -x "$_opener" ]; then
+ "$_opener" "$_f"
+ return
+ fi
+
_ext="${_f##*.}"
_ext=$(printf '%s' "$_ext" | tr '[:upper:]' '[:lower:]')