sfm

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

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:
Msfm | 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 ;;