Add bookmarking to spmenu_run

This commit is contained in:
Jacob 2023-06-25 18:41:43 +02:00
parent f08b9bdccc
commit 53dca773a7

View file

@ -36,6 +36,7 @@ DESCRIPTION_COLOR="${DESCRIPTION_COLOR:-#999888}"
DMENU_COMPAT="${DMENU_COMPAT:-false}" DMENU_COMPAT="${DMENU_COMPAT:-false}"
AUTOREFRESH="${AUTOREFRESH:-true}" AUTOREFRESH="${AUTOREFRESH:-true}"
MULTISELECT="${MULTISELECT:-true}" MULTISELECT="${MULTISELECT:-true}"
BOOKMARKFILE="${BOOKMARKFILE:-${XDG_CACHE_HOME:-$HOME/.cache/}/spmenu_run.bookmarks}"
PRINT_LOGS_STDERR="${PRINT_LOGS_STDERR:-true}" PRINT_LOGS_STDERR="${PRINT_LOGS_STDERR:-true}"
DESKTOP_DIR="${DESKTOP_DIR:-${DESTDIR}${PREFIX}/share/applications ${HOME}/.local/share/applications}" DESKTOP_DIR="${DESKTOP_DIR:-${DESTDIR}${PREFIX}/share/applications ${HOME}/.local/share/applications}"
@ -191,6 +192,10 @@ print_config() {
# #
# 'run_pre_func' before spawning spmenu. # 'run_pre_func' before spawning spmenu.
# 'run_post_func' after spawning spmenu, selected item passed as an argument. # 'run_post_func' after spawning spmenu, selected item passed as an argument.
# 'run_pre_bookmark_list_func' while listing selected/marked items. The selected item is passed as an argument.
# 'run_post_bookmark_list_func' while listing selected/marked items. The selected item is passed as an argument.
# 'run_file_bookmark_list_func' while reading entries from the bookmark file. The current bookmark is passed as an argument.
# 'run_single_char_pre_bookmark_list_func' while listing selected/marked items. The first character of the spmenu output is passed as an argument.
# 'run_single_char_func' while checking the value of a single character. The first character of the spmenu output is passed as an argument. # 'run_single_char_func' while checking the value of a single character. The first character of the spmenu output is passed as an argument.
# 'run_output_func' while checking the value of the spmenu output. spmenu output is passed as an argument. # 'run_output_func' while checking the value of the spmenu output. spmenu output is passed as an argument.
# 'desktop_pre_func' before spawning spmenu. # 'desktop_pre_func' before spawning spmenu.
@ -228,6 +233,7 @@ GENERIC="\${GENERIC:-\$TERMINAL -e \$EDITOR}" # Generic, used to open unknown fi
WEB_GREP="http:|https:|www[.]" # Needs to be in grep -E syntax WEB_GREP="http:|https:|www[.]" # Needs to be in grep -E syntax
MAGNET_GREP="magnet:?" # Needs to be in grep -E syntax MAGNET_GREP="magnet:?" # Needs to be in grep -E syntax
HISTORY="\${XDG_CACHE_HOME:-\$HOME/.cache/}/spmenu_run.hist" # History file, spmenu (meaning your user) must have permission to read and write to it. HISTORY="\${XDG_CACHE_HOME:-\$HOME/.cache/}/spmenu_run.hist" # History file, spmenu (meaning your user) must have permission to read and write to it.
BOOKMARKFILE="\${BOOKMARKFILE:-\${XDG_CACHE_HOME:-\$HOME/.cache/}/spmenu_run.bookmarks}" # Bookmark file, spmenu_run must have permission to read and write to it.
# Run launcher argument options # Run launcher argument options
RUNLAUNCHER="\${RUNLAUNCHER:-spmenu}" # Run launcher to use RUNLAUNCHER="\${RUNLAUNCHER:-spmenu}" # Run launcher to use
@ -287,7 +293,8 @@ EOF
} }
parse() { parse() {
path | sed "s/\&/\&/g" | $RUNLAUNCHER "${rl_run[@]}" > /tmp/spmenu_out [ ! -f "$BOOKMARKFILE" ] && mkdir -p "$(dirname "$BOOKMARKFILE")" && touch "$BOOKMARKFILE"
path | $RUNLAUNCHER "${rl_run[@]}" > /tmp/spmenu_out
while read -r sout; do while read -r sout; do
command -v run_single_char_func > /dev/null && run_single_char_func "${sout:0:1}" command -v run_single_char_func > /dev/null && run_single_char_func "${sout:0:1}"
@ -297,6 +304,7 @@ parse() {
case "${sout:0:1}" in case "${sout:0:1}" in
"#") EXEC="term" ;; "#") EXEC="term" ;;
"?") EXEC="man" ;; "?") EXEC="man" ;;
"@") EXEC="mark" ;;
esac esac
printf "Run launcher output: '%s'\n" "$sout" >> "$LOGFILE" printf "Run launcher output: '%s'\n" "$sout" >> "$LOGFILE"
@ -307,11 +315,21 @@ parse() {
"?") ;; "?") ;;
esac esac
if [ "$sout" = "?" ]; then case "$sout" in
print_help "$@" "?")
parse print_help "$@"
exec_cmd parse
fi exec_cmd
;;
"@")
print_bookmarks "$@"
;;
"@c")
rm -f "$BOOKMARKFILE" && touch "$BOOKMARKFILE"
parse
exec_cmd
;;
esac
printf "Type: '%s'\n" "$EXEC" >> "$LOGFILE" printf "Type: '%s'\n" "$EXEC" >> "$LOGFILE"
@ -324,19 +342,65 @@ parse() {
done < /tmp/spmenu_out done < /tmp/spmenu_out
} }
bookmark_path() {
while read -r file; do
command -v run_file_bookmark_list_func > /dev/null && \
run_file_bookmark_list_func "$file"
printf "%s\n" "$file"
done < "$BOOKMARKFILE"
}
print_bookmarks() {
bookmark_path | sort "${sort_args[@]}" | $RUNLAUNCHER "${rl_run[@]}" > /tmp/spmenu_out
while read -r sout; do
command -v run_pre_bookmark_list_func > /dev/null && run_pre_bookmark_list_func "$sout"
command -v run_single_char_pre_bookmark_list_func > /dev/null && run_single_char_pre_bookmark_list_func "${sout:0:1}"
case "${sout:0:1}" in
"#") EXEC="term" ;;
"?") EXEC="man" ;;
"@") EXEC="mark" ;;
esac
printf "Run launcher output: '%s'\n" "$sout" >> "$LOGFILE"
case "$(printf "%s" "$sout" | awk '{ print $1 }')" in
"magnet") EXEC=torrent ;;
"www") EXEC=web ;;
"?") ;;
esac
printf "Type: '%s'\n" "$EXEC" >> "$LOGFILE"
# check for keywords
printf "%s" "$sout" | grep -qE "$WEB_GREP" && EXEC=web
printf "%s" "$sout" | grep -qE "$MAGNET_GREP" && EXEC=torrent
exec_cmd "$args"
[ "$MULTISELECT" != "true" ] && break
done < /tmp/spmenu_out
command -v run_post_bookmark_list_func > /dev/null && run_post_bookmark_list_func
exit 0
}
exec_cmd() { exec_cmd() {
[ -z "$EXEC" ] && EXEC=shell [ -z "$EXEC" ] && EXEC=shell
[ "$STDOUT" != "false" ] && printf "%s\n" "$sout" && exit 1 [ "$STDOUT" != "false" ] && printf "%s\n" "$sout" && exit 1
command -v run_post_func > /dev/null && run_post_func "$sout" command -v run_post_func > /dev/null && run_post_func "$sout"
# when there's no read_man func because the user is retarded and removed it, this basic function will be called instead # when there's no read_man func because the user is retarded and removed it, this basic function will be called instead
read_nman() { read_woman() {
$TERMINAL -e man "$1" $TERMINAL -e man "$1"
} }
# execute it # execute it
case "$EXEC" in case "$EXEC" in
"shell") printf "%s" "$sout" | sed "s/#//g" | ${SHELL:-"/bin/sh"} & ;; "mark") printf "%s\n" "$sout" | sed "s/@//g" >> "$BOOKMARKFILE"; parse; exit 0 ;;
"shell") printf "%s" "$sout" | ${SHELL:-"/bin/sh"} & ;;
"term") $TERMINAL -e "$(printf "%s" "$sout" | sed "s/#//g")" & ;; "term") $TERMINAL -e "$(printf "%s" "$sout" | sed "s/#//g")" & ;;
"web") $BROWSER "$(printf "%s" "$sout" | sed "s/www //g")" & ;; "web") $BROWSER "$(printf "%s" "$sout" | sed "s/www //g")" & ;;
"torrent") $TORRENT "$(printf "%s" "$sout" | sed "s/magnet //g")" & ;; "torrent") $TORRENT "$(printf "%s" "$sout" | sed "s/magnet //g")" & ;;
@ -346,7 +410,7 @@ exec_cmd() {
read_man "$exec" read_man "$exec"
return return
else else
read_nman "$exec" read_woman "$exec"
return return
fi fi
;; ;;