fix double slash at directory name
This commit is contained in:
@@ -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 ;;
|
||||||
|
|||||||
Reference in New Issue
Block a user