commit 09f60a85efad29f393596c90cf40f1098436ceb3
parent 32337e4ccaab0649b31ed5c53aa84146793199fb
Author: emmett1 <me@emmett1.my>
Date: Sun, 5 Apr 2026 19:33:56 +0800
add chmod +x and -x function
Diffstat:
| M | sfm | | | 55 | ++++++++++++++++++++++++++++++++++++++++++------------- |
1 file changed, 42 insertions(+), 13 deletions(-)
diff --git a/sfm b/sfm
@@ -894,7 +894,7 @@ do_help() {
bw=$((COLS - 4))
[ "$bw" -gt 52 ] && bw=52
[ "$bw" -lt 36 ] && bw=36
- bh=42
+ bh=44
_help_bx=$(( (COLS - bw) / 2 )); [ "$_help_bx" -lt 1 ] && _help_bx=1
_help_by=$(( (ROWS - bh) / 2 )); [ "$_help_by" -lt 1 ] && _help_by=1
_help_iw=$((bw - 2))
@@ -932,17 +932,19 @@ do_help() {
help_row 27 " U open trash directory"
help_row 28 " ! drop to shell in CWD"
help_row 29 " o open with custom program"
- help_sep 30
- help_row 31 " b bookmark current dir"
- help_row 32 " B open bookmark picker"
- help_row 33 " c copy path to clipboard"
- help_row 34 " ~ go to home directory"
- help_row 35 " \` jump to previous directory"
- help_sep 36
- help_row 37 " q quit"
- help_row 38 " ? this help"
- help_row 39 ""
- help_row 40 " press any key to close..."
+ help_row 30 " + chmod +x (make executable)"
+ help_row 31 " - chmod -x (remove executable)"
+ help_sep 32
+ help_row 33 " b bookmark current dir"
+ help_row 34 " B open bookmark picker"
+ help_row 35 " c copy path to clipboard"
+ help_row 36 " ~ go to home directory"
+ help_row 37 " \` jump to previous directory"
+ help_sep 38
+ help_row 39 " q quit"
+ help_row 40 " ? this help"
+ help_row 41 ""
+ help_row 42 " press any key to close..."
goto "$(( _help_by + bh ))" "$_help_bx"
printf '%s+%s+%s' "${BOLD}${CYAN}" "$_help_hl" "${RESET}"
@@ -1193,6 +1195,32 @@ do_mkdir() {
fi
}
+do_chmod_x() {
+ entry=$(get_entry "$SEL")
+ [ -z "$entry" ] && return
+ case "$entry" in */) INFO_MSG="cannot chmod a directory"; NEED_FULL_REDRAW=1; return ;; esac
+ _target=$(joinpath "${entry%@}")
+ if chmod +x "$_target" 2>/dev/null; then
+ INFO_MSG="chmod +x: ${entry}"
+ else
+ INFO_MSG="chmod failed: ${entry}"
+ fi
+ NEED_FULL_REDRAW=1
+}
+
+do_chmod_nox() {
+ entry=$(get_entry "$SEL")
+ [ -z "$entry" ] && return
+ case "$entry" in */) INFO_MSG="cannot chmod a directory"; NEED_FULL_REDRAW=1; return ;; esac
+ _target=$(joinpath "${entry%@}")
+ if chmod -x "$_target" 2>/dev/null; then
+ INFO_MSG="chmod -x: ${entry}"
+ else
+ INFO_MSG="chmod failed: ${entry}"
+ fi
+ NEED_FULL_REDRAW=1
+}
+
do_info() {
entry=$(get_entry "$SEL")
[ -z "$entry" ] && return
@@ -1524,7 +1552,8 @@ while true; do
T) do_toggle_details ;;
P) do_toggle_preview ;;
i) do_info ;;
- '!') do_shell ;;
+ '+') do_chmod_x ;;
+ '-') do_chmod_nox ;;
o) do_open_with ;;
s) do_sort ;;
u) do_trash ;;