fix double slash at directory name

This commit is contained in:
emmett1
2026-03-16 00:11:24 +08:00
parent 7f41df91f1
commit 12c85202f9
+22 -12
View File
@@ -61,7 +61,7 @@ term_rows() { tput_cmd lines || echo 24; }
term_cols() { tput_cmd cols || echo 80; } term_cols() { tput_cmd cols || echo 80; }
# --- state --- # --- state ---
CWD="$PWD" CWD="$PWD"; CWD=$(cd "$CWD" 2>/dev/null && pwd) || CWD="/"
SEL=0 SEL=0
OFFSET=0 OFFSET=0
PREV_SEL=0 PREV_SEL=0
@@ -82,6 +82,16 @@ SHOW_DETAILS=0 # 1 = show size+date column
TRASH_DIR="${XDG_DATA_HOME:-$HOME/.local/share}/sfm-trash" TRASH_DIR="${XDG_DATA_HOME:-$HOME/.local/share}/sfm-trash"
mkdir -p "$TRASH_DIR" mkdir -p "$TRASH_DIR"
PREV_CWD="" # last visited directory, for jumping back PREV_CWD="" # last visited directory, for jumping back
# normalise CWD: resolve to absolute canonical path, no double slashes
norm_cwd() {
CWD=$(cd "$CWD" 2>/dev/null && pwd) || CWD="/"
# squeeze any double slashes (some systems return // for //<path>)
CWD=$(printf '%s' "$CWD" | tr -s '/')
}
# safely join CWD with a name, avoiding double slash at root
joinpath() { [ "$CWD" = "/" ] && printf '/%s' "$1" || printf '%s/%s' "$CWD" "$1"; }
BOOKMARK_FILE="${XDG_CONFIG_HOME:-$HOME/.config}/sfm/bookmarks" BOOKMARK_FILE="${XDG_CONFIG_HOME:-$HOME/.config}/sfm/bookmarks"
mkdir -p "$(dirname "$BOOKMARK_FILE")" mkdir -p "$(dirname "$BOOKMARK_FILE")"
[ -f "$BOOKMARK_FILE" ] || touch "$BOOKMARK_FILE" [ -f "$BOOKMARK_FILE" ] || touch "$BOOKMARK_FILE"
@@ -873,7 +883,7 @@ do_go_back() {
SELECTED="" SELECTED=""
PREV_CWD="$CWD" PREV_CWD="$CWD"
LAST_CHILD="${CWD##*/}/" # name of current dir with trailing slash LAST_CHILD="${CWD##*/}/" # name of current dir with trailing slash
CWD=$(dirname "$CWD") CWD=$(cd "$(dirname "$CWD")" && pwd)
SEL=0; OFFSET=0; PREV_SEL=0; PREV_OFFSET=0 SEL=0; OFFSET=0; PREV_SEL=0; PREV_OFFSET=0
load_entries load_entries
# restore selection to the directory we just came from # restore selection to the directory we just came from
@@ -890,20 +900,20 @@ do_open() {
*/) */)
FILTER="" FILTER=""
SELECTED="" SELECTED=""
_target="${CWD}/${entry%/}" _target=$(joinpath "${entry%/}")
if [ ! -x "$_target" ] || [ ! -r "$_target" ]; then if [ ! -x "$_target" ] || [ ! -r "$_target" ]; then
INFO_MSG="permission denied: ${entry%/}" INFO_MSG="permission denied: ${entry%/}"
NEED_FULL_REDRAW=1 NEED_FULL_REDRAW=1
return return
fi fi
PREV_CWD="$CWD" PREV_CWD="$CWD"
CWD=$(cd "$_target" && pwd) CWD=$(cd "$_target" && pwd); norm_cwd
SEL=0; OFFSET=0; PREV_SEL=0; PREV_OFFSET=0 SEL=0; OFFSET=0; PREV_SEL=0; PREV_OFFSET=0
load_entries load_entries
;; ;;
*@) *@)
_name="${entry%@}" _name="${entry%@}"
_target="${CWD}/${_name}" _target=$(joinpath "$_name")
if [ -d "$_target" ]; then if [ -d "$_target" ]; then
if [ ! -x "$_target" ] || [ ! -r "$_target" ]; then if [ ! -x "$_target" ] || [ ! -r "$_target" ]; then
INFO_MSG="permission denied: ${_name}" INFO_MSG="permission denied: ${_name}"
@@ -912,7 +922,7 @@ do_open() {
fi fi
FILTER=""; SELECTED="" FILTER=""; SELECTED=""
PREV_CWD="$CWD" PREV_CWD="$CWD"
CWD=$(cd "$_target" && pwd) CWD=$(cd "$_target" && pwd); norm_cwd
SEL=0; OFFSET=0; PREV_SEL=0; PREV_OFFSET=0 SEL=0; OFFSET=0; PREV_SEL=0; PREV_OFFSET=0
load_entries load_entries
else else
@@ -1059,7 +1069,7 @@ do_shell() {
printf '%s(type "exit" to return to fm)%s\n' "${YELLOW}" "${RESET}" printf '%s(type "exit" to return to fm)%s\n' "${YELLOW}" "${RESET}"
${SHELL:-sh} ${SHELL:-sh}
# restore CWD in case user cd'd around # restore CWD in case user cd'd around
CWD="${PWD}" CWD="${PWD}"; norm_cwd
setup_term; hide_cursor setup_term; hide_cursor
NEED_FULL_REDRAW=1 NEED_FULL_REDRAW=1
} }
@@ -1095,7 +1105,7 @@ do_trash() {
do_open_trash() { do_open_trash() {
PREV_CWD="$CWD" PREV_CWD="$CWD"
FILTER=""; SELECTED="" FILTER=""; SELECTED=""
CWD="$TRASH_DIR" CWD="$TRASH_DIR"; norm_cwd
SEL=0; OFFSET=0; PREV_SEL=0; PREV_OFFSET=0 SEL=0; OFFSET=0; PREV_SEL=0; PREV_OFFSET=0
load_entries load_entries
} }
@@ -1124,7 +1134,7 @@ do_copy_path() {
do_jump_back() { do_jump_back() {
[ -z "$PREV_CWD" ] && { INFO_MSG="no previous directory"; NEED_FULL_REDRAW=1; return; } [ -z "$PREV_CWD" ] && { INFO_MSG="no previous directory"; NEED_FULL_REDRAW=1; return; }
_tmp="$CWD" _tmp="$CWD"
CWD="$PREV_CWD" CWD="$PREV_CWD"; norm_cwd
PREV_CWD="$_tmp" PREV_CWD="$_tmp"
FILTER=""; SELECTED="" FILTER=""; SELECTED=""
SEL=0; OFFSET=0; PREV_SEL=0; PREV_OFFSET=0 SEL=0; OFFSET=0; PREV_SEL=0; PREV_OFFSET=0
@@ -1199,7 +1209,7 @@ do_bookmark_jump() {
'[C') # right — open '[C') # right — open
_chosen=$(awk -v n="$_bsel" 'NR==n&&NF{print;exit}' "$BOOKMARK_FILE") _chosen=$(awk -v n="$_bsel" 'NR==n&&NF{print;exit}' "$BOOKMARK_FILE")
if [ -n "$_chosen" ] && [ -d "$_chosen" ]; then if [ -n "$_chosen" ] && [ -d "$_chosen" ]; then
PREV_CWD="$CWD"; CWD="$_chosen" PREV_CWD="$CWD"; CWD="$_chosen"; norm_cwd
FILTER=""; SELECTED="" FILTER=""; SELECTED=""
SEL=0; OFFSET=0; PREV_SEL=0; PREV_OFFSET=0 SEL=0; OFFSET=0; PREV_SEL=0; PREV_OFFSET=0
load_entries load_entries
@@ -1215,7 +1225,7 @@ do_bookmark_jump() {
l) l)
_chosen=$(awk -v n="$_bsel" 'NR==n&&NF{print;exit}' "$BOOKMARK_FILE") _chosen=$(awk -v n="$_bsel" 'NR==n&&NF{print;exit}' "$BOOKMARK_FILE")
if [ -n "$_chosen" ] && [ -d "$_chosen" ]; then if [ -n "$_chosen" ] && [ -d "$_chosen" ]; then
PREV_CWD="$CWD"; CWD="$_chosen" PREV_CWD="$CWD"; CWD="$_chosen"; norm_cwd
FILTER=""; SELECTED="" FILTER=""; SELECTED=""
SEL=0; OFFSET=0; PREV_SEL=0; PREV_OFFSET=0 SEL=0; OFFSET=0; PREV_SEL=0; PREV_OFFSET=0
load_entries load_entries
@@ -1373,7 +1383,7 @@ while true; do
u) do_trash ;; u) do_trash ;;
U) do_open_trash ;; U) do_open_trash ;;
'`') do_jump_back ;; '`') do_jump_back ;;
'~') PREV_CWD="$CWD"; CWD="$HOME"; FILTER=""; SELECTED="" '~') PREV_CWD="$CWD"; CWD=$(cd "$HOME" && pwd); FILTER=""; SELECTED=""
SEL=0; OFFSET=0; PREV_SEL=0; PREV_OFFSET=0; load_entries ;; SEL=0; OFFSET=0; PREV_SEL=0; PREV_OFFSET=0; load_entries ;;
c) do_copy_path ;; c) do_copy_path ;;
"$(printf '\033')") do_clear_filter ;; "$(printf '\033')") do_clear_filter ;;