Bookmarks script rewrite; Web shortcut now launches the script instead, and +SHIFT, the browser
This commit is contained in:
9
TODO.md
9
TODO.md
@@ -1,11 +1,2 @@
|
|||||||
# TODO
|
# TODO
|
||||||
|
|
||||||
## SCRIPT
|
|
||||||
- Dmenu bookmarks + search
|
|
||||||
- Add bookmarks/Remove
|
|
||||||
- Detect follow up input for engines
|
|
||||||
- Launch default browser with search/bookmark
|
|
||||||
|
|
||||||
## DWM
|
|
||||||
- Web Browser shortcut -> META+SHIFT+W
|
|
||||||
- Bookmarks + Search dmenu script -> META+W
|
|
||||||
|
|||||||
@@ -1,14 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
bookmarks_file="$HOME/.local/bin/dmenu-bookmark-sources"
|
|
||||||
bookmark_entries=$(awk -F'"' '{print $2 "\t" $4}' "$bookmarks_file")
|
|
||||||
|
|
||||||
choice=$(echo "$bookmark_entries" | cut -f1 | dmenu -i -p "Select bookmark:")
|
|
||||||
|
|
||||||
if [[ -n "$choice" ]]; then
|
|
||||||
# Find the matching URL
|
|
||||||
url=$(echo "$bookmark_entries" | awk -v choice="$choice" '$1 == choice {print $2}')
|
|
||||||
echo $url
|
|
||||||
xdg-open $url
|
|
||||||
fi
|
|
||||||
|
|
||||||
@@ -1,324 +0,0 @@
|
|||||||
#!/bin/sh
|
|
||||||
|
|
||||||
PROGRAM_NAME=$(basename $0) # This will be used in a few messages
|
|
||||||
|
|
||||||
main() {
|
|
||||||
parse_opts "$@"
|
|
||||||
[ -z "$mode" ] && mode=open # The default mode
|
|
||||||
|
|
||||||
if [ -n "$copy" -a "$copy" != false -a "$cat" = true ]; then
|
|
||||||
prompt_copy_contents "$@"
|
|
||||||
elif [ "$open" = true ]; then
|
|
||||||
prompt_open "$@"
|
|
||||||
elif [ "$cat" = true ]; then
|
|
||||||
prompt_print_contents "$@"
|
|
||||||
elif [ "$print" = true ]; then
|
|
||||||
prompt_print "$@"
|
|
||||||
elif [ -n "$copy" -a "$copy" != false ]; then
|
|
||||||
prompt_copy "$@"
|
|
||||||
else
|
|
||||||
prompt_$mode "$@"
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
prompt_base() {
|
|
||||||
[ -z "$length" ] && length=10
|
|
||||||
|
|
||||||
if [ "$case_sensitivity" = sensitive ]; then
|
|
||||||
backtrack() { sed 's|\(.*/'$sel'[^/]*\).*|\1|'; }
|
|
||||||
s=+i
|
|
||||||
else
|
|
||||||
backtrack() { perl -pe 's|(.*/'$sel'[^/]*).*|$1|i'; }
|
|
||||||
i=-i
|
|
||||||
fi
|
|
||||||
|
|
||||||
[ -z "$menu" ] && menu="dmenu"
|
|
||||||
if [ "$menu" = dmenu ]; then menu() { $menu $i -l $length -p "$@"; }
|
|
||||||
elif [ "$menu" = fzf ]; then menu() { $menu $s $i --header="$@"; }
|
|
||||||
else menu() { $menu; }; fi
|
|
||||||
|
|
||||||
if [ "$path" = "full" ]; then prompt() { p="$target"; }
|
|
||||||
else prompt() { p="$(printf '%s' "$target" | sed 's|^'"$HOME"'|~|')"; }; fi
|
|
||||||
|
|
||||||
# Only GNU `ls` supports `--group-directories-first`
|
|
||||||
if [ "$(ls --version | head -1 | cut -d " " -f 2-3)" = "(GNU coreutils)" ]
|
|
||||||
then
|
|
||||||
list() { ls --group-directories-first "$@"; }
|
|
||||||
else
|
|
||||||
list() {
|
|
||||||
(ls -l "$@" | grep "^d"
|
|
||||||
ls -l "$@" | grep -vE "^d|^total") | tr -s " " | cut -d " " -f 9-
|
|
||||||
}
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Commonly used functions in DFM
|
|
||||||
truepath() { sh -c "realpath -s "$sel""; }
|
|
||||||
slash() { printf '%s' "$target/$sel" | rev | cut -b 1-2; }
|
|
||||||
check() { file -E "$@" | grep "(No such file or directory)$"; }
|
|
||||||
fullcmd() {
|
|
||||||
printf '%s\n' "$PWD" > "$cache_file"
|
|
||||||
printf '%s' "$target" | sed -e "s/'/'\\\\''/g;s/\(.*\)/'\1'/" | cmd
|
|
||||||
}
|
|
||||||
|
|
||||||
while true; do
|
|
||||||
p="$prompt" # Reset the prompt to have it update
|
|
||||||
[ -z "$p" ] && prompt # Make the prompt if it does not exist
|
|
||||||
|
|
||||||
# This is where the file manager actually first opens.
|
|
||||||
sel="$(printf '%s' "$(list "$target"; list -A "$target" | grep '^\.')" |
|
|
||||||
menu "$p")"
|
|
||||||
|
|
||||||
# Exit if the user presses Escape, Control-C, etc.
|
|
||||||
exit_code=$?
|
|
||||||
if [ "$exit_code" -ne 0 ]; then
|
|
||||||
printf '%s\n' "$target" > "$cache_file"
|
|
||||||
exit $exit_code
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ $(printf '%s' "$sel" | wc -l) -eq 0 ]; then
|
|
||||||
# If the input box is empty, go to the parent directory
|
|
||||||
if [ "$sel" = "" ]; then
|
|
||||||
newt="$(realpath -s "$target/..")"
|
|
||||||
# Relative directories
|
|
||||||
elif [ -e "$target/$sel" -a "$(slash)" != // ]; then
|
|
||||||
newt="$(realpath -s "$target/$sel")"
|
|
||||||
elif [ ! -e "$target/$sel" -a $(printf '%s' "$target" |
|
|
||||||
grep $i "$(sh -c "printf '%s' "$sel"")" | wc -l) -eq 1 ]
|
|
||||||
then
|
|
||||||
# Go to a lower directory using the input box
|
|
||||||
if [ ! -e "$(truepath)" ]; then
|
|
||||||
newt="$(printf '%s' "$target" | backtrack)"
|
|
||||||
# Go to certain directories like `~` `$HOME`, etc.
|
|
||||||
else
|
|
||||||
newt="$(truepath)"
|
|
||||||
fi
|
|
||||||
# Go to a directory when the input box begins with `/`
|
|
||||||
elif [ -e "$(truepath)" ] &&
|
|
||||||
[ ! -e "$target/$sel" -o "$(slash)" = "//" ]
|
|
||||||
then
|
|
||||||
newt="$(truepath)"
|
|
||||||
else
|
|
||||||
# This applies to wildcards
|
|
||||||
newt="$(realpath -s "$target/$sel")"
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
newt="$sel"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# If the current working directory is not empty
|
|
||||||
if [ $(ls | wc -l) -ge 1 ]; then
|
|
||||||
target="$newt"
|
|
||||||
if [ ! -d "$target" ]; then
|
|
||||||
# Check if the user used a wildcard
|
|
||||||
if [ $(printf '%s' "$target" | grep "*" | wc -l) -ge 1 -a\
|
|
||||||
$(check "$target" | wc -l) -eq 1 ]
|
|
||||||
then
|
|
||||||
IFS= # Needed to make wildcards work
|
|
||||||
ls "$PWD"/$sel 1> /dev/null 2>& 1
|
|
||||||
# Target is a file or directory
|
|
||||||
if [ $? -ne 0 ]; then
|
|
||||||
target="$PWD"
|
|
||||||
# Target is a wildcard
|
|
||||||
else
|
|
||||||
target=$(ls -d "$PWD"/$sel) fullcmd
|
|
||||||
exit 0
|
|
||||||
fi
|
|
||||||
# No such file or directory
|
|
||||||
elif [ $(printf '%s' "$target" | wc -l) -eq 0 -a\
|
|
||||||
$(check "$target" | wc -l) -eq 1 ]
|
|
||||||
then
|
|
||||||
target="$PWD"
|
|
||||||
# More than one selection
|
|
||||||
elif [ $(printf '%s' "$target" | wc -l) -gt 0 ]; then
|
|
||||||
target=$(printf '%s' "$target" | sed 's|^|'"$PWD"/'|')
|
|
||||||
fullcmd
|
|
||||||
exit
|
|
||||||
# Exactly one selection
|
|
||||||
else
|
|
||||||
fullcmd
|
|
||||||
exit
|
|
||||||
fi
|
|
||||||
# Target is a directory
|
|
||||||
else
|
|
||||||
PWD="$target"
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
}
|
|
||||||
|
|
||||||
prompt_print() {
|
|
||||||
cmd () { xargs ls -d; }
|
|
||||||
prompt_base "$@"
|
|
||||||
}
|
|
||||||
|
|
||||||
prompt_print_contents() {
|
|
||||||
cmd() { xargs cat; }
|
|
||||||
prompt_base "$@"
|
|
||||||
}
|
|
||||||
|
|
||||||
prompt_open() {
|
|
||||||
if [ -x "$(command -v sesame)" ]; then cmd() { xargs sesame; }
|
|
||||||
else cmd() { xargs xdg-open; }; fi
|
|
||||||
prompt_base "$@"
|
|
||||||
}
|
|
||||||
|
|
||||||
prompt_copy() {
|
|
||||||
cmd() { tr '\n' ' ' | xclip -r -i -selection $copy; }
|
|
||||||
prompt_base "$@"
|
|
||||||
}
|
|
||||||
|
|
||||||
prompt_copy_contents() {
|
|
||||||
if [ "$(file -b "$target" | cut -d " " -f2)" = "image" ]; then
|
|
||||||
cmd() { xargs xclip -i -selection $copy -t image/png; }
|
|
||||||
else
|
|
||||||
cmd() { xargs xclip -r -i -selection $copy; }
|
|
||||||
fi
|
|
||||||
prompt_base "$@"
|
|
||||||
}
|
|
||||||
|
|
||||||
help() {
|
|
||||||
printf "Usage:\t$0 [options] [target] [prompt]
|
|
||||||
|
|
||||||
Options:
|
|
||||||
|
|
||||||
Modes:
|
|
||||||
-p|--print │ Print the output of the selection
|
|
||||||
-o|--open │ Open the appropriate program for the selection (default)
|
|
||||||
|
|
||||||
--cat │ Concatenate the selections before using a mode
|
|
||||||
-c|--copy=[CLIPBOARD] │ Copy the output of the selection
|
|
||||||
--no-copy │ Do not copy (always overrides \`--copy\`)
|
|
||||||
│
|
|
||||||
-r|--restore │ Start from the previous path restored from the last run
|
|
||||||
-s|--sensitive │ Use case-sensitive matching
|
|
||||||
-i|--insensitive │ Use case-insensitive matching (default)
|
|
||||||
-m|--menu=MENU │ Choose which menu program to use (default: dmenu)
|
|
||||||
-l|--length=LENGTH │ Specify the length of dmenu (default: 10)
|
|
||||||
│
|
|
||||||
-f|--full │ Use the full path for the prompt
|
|
||||||
-a|--abbreviated │ Use the abbreviated path for the prompt (default)
|
|
||||||
│
|
|
||||||
-h|--help │ Print this help message and exit
|
|
||||||
"; }
|
|
||||||
|
|
||||||
parse_opts() {
|
|
||||||
: "${config_dir:=${XDG_CONFIG_HOME:-$HOME/.config}/$PROGRAM_NAME}"
|
|
||||||
: "${config_file:=$config_dir/$PROGRAM_NAME.conf}"
|
|
||||||
[ -f "$config_file" ] && . "$config_file"
|
|
||||||
|
|
||||||
: "${cache_dir:=${XDG_CACHE_DIR:-$HOME/.cache}/$PROGRAM_NAME}"
|
|
||||||
: "${cache_file:=$cache_dir/path}"
|
|
||||||
# Create the cache file if it doesn't exist
|
|
||||||
if [ ! -f "$cache_file" ]; then
|
|
||||||
mkdir -p "$(dirname "$cache_file")" &&
|
|
||||||
touch "$cache_file"
|
|
||||||
fi
|
|
||||||
|
|
||||||
needs_arg() {
|
|
||||||
if [ -z "$OPTARG" ]; then
|
|
||||||
printf '%s\n' "No arg for --$OPT option" >&2
|
|
||||||
exit 2
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
while getopts hpcosim:l:far-: OPT; do
|
|
||||||
# Support long options: https://stackoverflow.com/a/28466267/519360
|
|
||||||
if [ "$OPT" = "-" ]; then
|
|
||||||
OPT="${OPTARG%%=*}"
|
|
||||||
OPTARG="${OPTARG#$OPT}"
|
|
||||||
OPTARG="${OPTARG#=}"
|
|
||||||
fi
|
|
||||||
case "$OPT" in
|
|
||||||
h|help)
|
|
||||||
help
|
|
||||||
exit 0
|
|
||||||
;;
|
|
||||||
p|print)
|
|
||||||
print=true
|
|
||||||
;;
|
|
||||||
c|copy)
|
|
||||||
shift
|
|
||||||
[ $(printf '%s' "$OPT" | wc -c) -eq 1 ] && OPTARG="$1"
|
|
||||||
case "$OPTARG" in
|
|
||||||
primary|secondary|clipboard|buffer-cut)
|
|
||||||
copy="$OPTARG"
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
copy=clipboard
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
[ -n "$1" -a "$OPTARG" = "$1" -a "$copy" = "$OPTARG" ] && shift
|
|
||||||
;;
|
|
||||||
no-copy)
|
|
||||||
copy=false
|
|
||||||
;;
|
|
||||||
cat)
|
|
||||||
cat=true
|
|
||||||
;;
|
|
||||||
o|open)
|
|
||||||
open=true
|
|
||||||
;;
|
|
||||||
s|sensitive)
|
|
||||||
case_sensitivity="sensitive"
|
|
||||||
;;
|
|
||||||
i|insensitive)
|
|
||||||
case_sensitivity="insensitive"
|
|
||||||
;;
|
|
||||||
m|menu)
|
|
||||||
needs_arg
|
|
||||||
menu="$OPTARG"
|
|
||||||
;;
|
|
||||||
l|length)
|
|
||||||
needs_arg
|
|
||||||
length=$OPTARG
|
|
||||||
;;
|
|
||||||
f|full)
|
|
||||||
path="full"
|
|
||||||
;;
|
|
||||||
a|abbreviated)
|
|
||||||
path="abbreviated"
|
|
||||||
;;
|
|
||||||
r|restore)
|
|
||||||
restore=true
|
|
||||||
;;
|
|
||||||
??*)
|
|
||||||
printf '%s\n' "Illegal option --$OPT" >&2
|
|
||||||
exit 2
|
|
||||||
;;
|
|
||||||
?) # Error reported via `getopts`
|
|
||||||
exit 2
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
done
|
|
||||||
shift $((OPTIND-1)) # Remove option arguments from the argument list
|
|
||||||
|
|
||||||
if [ -n "$1" ]; then
|
|
||||||
target="$1"
|
|
||||||
elif [ -z "$target" ]; then
|
|
||||||
if [ "$restore" = true -a -s "$cache_file" ]; then
|
|
||||||
target="$(cat "$cache_file")"
|
|
||||||
else
|
|
||||||
target="$PWD"
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ -d "$target" ]; then
|
|
||||||
target="$(realpath -s "$target")"
|
|
||||||
PWD="$target"
|
|
||||||
else
|
|
||||||
# Zero out cache file.
|
|
||||||
[ "$restore" = true -a -s "$cache_file" ] && > "$cache_file"
|
|
||||||
printf '%s\n' "$PROGRAM_NAME: \`$target\` is not a directory." >&2
|
|
||||||
exit 2
|
|
||||||
fi
|
|
||||||
|
|
||||||
[ -n "$2" ] && prompt="$2"
|
|
||||||
# If the prompt is the same as the target, uset the prompt so that it can
|
|
||||||
# update. This is useful if you set a prompt in your configuration file but
|
|
||||||
# want to use the default prompt
|
|
||||||
if [ -n "$prompt" ] && [ "$(realpath -s "$prompt")" = "$target" ]; then
|
|
||||||
unset prompt
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
main "$@"
|
|
||||||
@@ -1,66 +1,27 @@
|
|||||||
#!/usr/bin/env bash
|
#!/bin/bash
|
||||||
|
|
||||||
sources_file="$HOME/.local/bin/dmenu-websearch-sources"
|
engine="https://www.google.com/search?q="
|
||||||
|
|
||||||
prompt="-p Search:"
|
declare -A bookmarks=(
|
||||||
|
["YouTube"]="https://www.youtube.com/"
|
||||||
|
["GitHub"]="https://github.com/TrudeEH/dotfiles"
|
||||||
|
["TrudeWeb"]="https://trudeeh.github.io/web/"
|
||||||
|
["Gemini"]="https://gemini.google.com/app"
|
||||||
|
["Element"]="https://app.element.io/#/home"
|
||||||
|
["Gmail"]="https://mail.google.com/mail/u/0/#inbox"
|
||||||
|
["Google Messages"]="https://messages.google.com/web/conversations"
|
||||||
|
["WOL"]="https://wol.jw.org/pt-PT/"
|
||||||
|
)
|
||||||
|
|
||||||
se_data="$(
|
choice=$(printf "%s\n" "${!bookmarks[@]}" | dmenu -i -p "Search:")
|
||||||
awk -F'"' '
|
|
||||||
BEGIN {
|
|
||||||
labels=""
|
|
||||||
}
|
|
||||||
{
|
|
||||||
# Selector line
|
|
||||||
gsub(/[[:space:]]/,"",$1)
|
|
||||||
sel=$1
|
|
||||||
|
|
||||||
# Description line
|
|
||||||
dsc=$2
|
|
||||||
|
|
||||||
# URL line
|
|
||||||
gsub(/[[:space:]]/,"",$3)
|
|
||||||
url=$3
|
|
||||||
|
|
||||||
# URL array (selector is the key)
|
|
||||||
surl[sel]=url
|
|
||||||
|
|
||||||
# Descriptions array (selector is the key)
|
|
||||||
sdsc[sel]=dsc
|
|
||||||
|
|
||||||
if (labels != "") {
|
|
||||||
labels=sprintf ("%s\n%s - %s", labels, sel, dsc)
|
|
||||||
} else {
|
|
||||||
labels=sprintf ("%s - %s", sel, dsc)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
END {
|
|
||||||
for(k in surl) {
|
|
||||||
print "declare -A " k
|
|
||||||
print k "[url]=\"" surl[k] "\""
|
|
||||||
print k "[dsc]=\"" sdsc[k] "\""
|
|
||||||
}
|
|
||||||
print "dmenu_labels=\"" labels "\""
|
|
||||||
}
|
|
||||||
' "$sources_file"
|
|
||||||
)";
|
|
||||||
|
|
||||||
# Eval awk output as real variables...
|
if [[ -n "$choice" ]]; then
|
||||||
eval "$se_data"
|
# Find the matching URL
|
||||||
|
url=${bookmarks[$choice]}
|
||||||
# Output label string to rofi...
|
|
||||||
search="$(dmenu $prompt <<< $dmenu_labels)"
|
|
||||||
|
|
||||||
if [[ ! -z "$search" ]]; then
|
|
||||||
|
|
||||||
# Retrieve data...
|
|
||||||
sel="$( awk '{ print tolower($1) }' <<< $search )"
|
|
||||||
txt="$( cut -d" " -f2- <<< $search )"
|
|
||||||
|
|
||||||
eval "sen_dsc=\"\${$sel[dsc]}\""
|
|
||||||
eval "sen_url=\"\${$sel[url]}\""
|
|
||||||
|
|
||||||
xdg-open "$sen_url$txt" &>/dev/null &
|
|
||||||
|
|
||||||
|
if [[ -n "$url" ]]; then
|
||||||
|
xdg-open $url
|
||||||
|
else
|
||||||
|
xdg-open $engine$choice
|
||||||
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
exit 0
|
|
||||||
|
|||||||
@@ -1,7 +0,0 @@
|
|||||||
"YouTube" "https://www.youtube.com/"
|
|
||||||
"GitHub" "https://github.com/TrudeEH/dotfiles"
|
|
||||||
"TrudeWeb" "https://trudeeh.github.io/web/"
|
|
||||||
"Gemini" "https://gemini.google.com/app"
|
|
||||||
"Element" "https://app.element.io/#/home"
|
|
||||||
"Gmail" "https://mail.google.com/mail/u/0/#inbox"
|
|
||||||
"Google Messages" "https://messages.google.com/web/conversations"
|
|
||||||
@@ -1,8 +0,0 @@
|
|||||||
gg "Google Search" https://www.google.com/search?q=
|
|
||||||
dd "DuckDuckGo" https://duckduckgo.com/?q=
|
|
||||||
we "Wikipedia (en)" https://en.wikipedia.org/wiki/
|
|
||||||
wp "Wikipedia (pt)" https://pt.wikipedia.org/wiki/
|
|
||||||
so "Stack Overflow" https://stackoverflow.com/search?q=
|
|
||||||
gt "Google Translate" https://translate.google.com.br/?text=
|
|
||||||
yt "YouTube" https://www.youtube.com/results?search_query=
|
|
||||||
|
|
||||||
@@ -76,7 +76,8 @@ static const Key keys[] = {
|
|||||||
{ MODKEY, XK_Return, spawn, {.v = termcmd } },
|
{ MODKEY, XK_Return, spawn, {.v = termcmd } },
|
||||||
{ MODKEY|ShiftMask, XK_l, spawn, {.v = slockcmd } },
|
{ MODKEY|ShiftMask, XK_l, spawn, {.v = slockcmd } },
|
||||||
{ MODKEY|ShiftMask, XK_s, spawn, {.v = screenshotcmd } },
|
{ MODKEY|ShiftMask, XK_s, spawn, {.v = screenshotcmd } },
|
||||||
{ MODKEY, XK_w, spawn, {.v = webcmd } },
|
{ MODKEY, XK_w, spawn, SHCMD("dm-web") },
|
||||||
|
{ MODKEY|ShiftMask, XK_w, spawn, {.v = webcmd } },
|
||||||
{ MODKEY, XK_b, togglebar, {0} },
|
{ MODKEY, XK_b, togglebar, {0} },
|
||||||
{ MODKEY, XK_j, focusstack, {.i = +1 } },
|
{ MODKEY, XK_j, focusstack, {.i = +1 } },
|
||||||
{ MODKEY, XK_k, focusstack, {.i = -1 } },
|
{ MODKEY, XK_k, focusstack, {.i = -1 } },
|
||||||
|
|||||||
BIN
programs/dwm/dwm
BIN
programs/dwm/dwm
Binary file not shown.
Reference in New Issue
Block a user