-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathbm.sh
More file actions
156 lines (139 loc) · 5.52 KB
/
bm.sh
File metadata and controls
156 lines (139 loc) · 5.52 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
#!/bin/bash
# =======================================================
# Function: bm
# Version : 1.5
# Purpose : Universal, colorful bookmark manager
# Storage : ~/.config/bm/list
# Author : PhateValleyman
# Homepage: https://github.com/PhateValleyman/bm
# =======================================================
bm() {
# ===== Color definitions =====
local Red="\033[1;31m"
local Green="\033[1;32m"
local Yellow="\033[1;33m"
local Blue="\033[1;34m"
local Cyan="\033[1;36m"
local Magenta="\033[1;35m"
local None="\033[0m"
# ===== Config path =====
local CONFIG_DIR="$HOME/.config/bm"
local CONFIG_FILE="$CONFIG_DIR/list"
mkdir -p "$CONFIG_DIR"
# ===== Associative array for bookmarks =====
if ! declare -p bookmarks &>/dev/null; then
declare -Ag bookmarks
fi
# ===== Load bookmarks =====
loadBookmarks() {
bookmarks=()
[[ -f "$CONFIG_FILE" ]] && source "$CONFIG_FILE"
}
# ===== Save bookmarks =====
saveBookmarks() {
: > "$CONFIG_FILE"
for n in "${!bookmarks[@]}"; do
printf 'bookmarks["%s"]="%s"\n' "$n" "${bookmarks[$n]}" >> "$CONFIG_FILE"
done
}
reloadBookmarks() { loadBookmarks; }
# ===== Version info =====
printVersion() {
printf "${Red}bm${None} v1.5\n"
printf "by ${Green}PhateValleyman${None}\n"
printf "${Green}Jonas.Ned@outlook.com${None}\n"
}
# ===== Add bookmark =====
addBookmark() {
local name="$1"
[[ -z "$name" ]] && { printf "${Red}Usage:${None} bm -a <${Cyan}name${None}>\n"; return 1; }
bookmarks["$name"]="$PWD"
saveBookmarks
reloadBookmarks
printf "${Green}[bm]${None} Added ${Yellow}%s${None} → ${Cyan}%s${None}\n" "$name" "$PWD"
}
# ===== Remove bookmark =====
removeBookmark() {
local name="$1"
[[ -z "$name" ]] && { printf "${Red}Usage:${None} bm -r <${Cyan}name${None}>\n"; return 1; }
if [[ -z "${bookmarks[$name]}" ]]; then
printf "${Red}[bm] Bookmark '${Yellow}%s${Red}' not found${None}\n" "$name"
return 1
fi
unset 'bookmarks["$name"]'
saveBookmarks
reloadBookmarks
printf "${Red}[bm]${None} Removed bookmark ${Yellow}%s${None}\n" "$name"
}
# ===== List bookmarks with current directory highlight =====
listBookmarks() {
loadBookmarks
[[ ${#bookmarks[@]} -eq 0 ]] && { printf "\n${Yellow}[bm]${None} No bookmarks saved\n"; return; }
local CUR="$PWD"
printf "\n${Cyan}=== Saved bookmarks ===${None}\n"
for n in $(printf "%s\n" "${!bookmarks[@]}" | sort); do
local dir="${bookmarks[$n]}"
if [[ "$dir" == "$CUR" ]]; then
printf "${Blue}%-20s${None} ${Green}%s${None} 📌\n" "$n" "$dir"
else
printf "${Yellow}%-20s${None} ${Green}%s${None}\n" "$n" "$dir"
fi
done
printf "\n"
}
# ===== Go to bookmark =====
goToBookmark() {
local name="$1"
loadBookmarks
local dir="${bookmarks[$name]}"
[[ -z "$dir" ]] && { printf "[${Red}bm${None}] Bookmark '${Yellow}%s${Red}' not found${None}\n" "$name"; return 1; }
[[ ! -d "$dir" ]] && { printf "[${Red}bm${None}] Directory '${Yellow}%s${Red}' does not exist${None}\n" "$dir"; return 1; }
cd "$dir" || return
printf "${Green}Opening${None}:${Cyan}%s${None}\n" "$dir"
}
# ===== Print help =====
printHelp() {
printf "${Red}bm${None}\n\n"
printf "${Green}Usage:${None} ${Red}bm${None} [${Yellow}option${None}] [${Cyan}name${None}]\n\n"
printf "${Green}Options:${None}\n"
printf " ${Yellow}-a${None}, ${Yellow}--add${None} <${Cyan}name${None}> Add current directory as bookmark\n"
printf " ${Yellow}-r${None}, ${Yellow}--remove${None} <${Cyan}name${None}> Remove bookmark\n"
printf " ${Yellow}-l${None}, ${Yellow}--list${None} List all bookmarks (current directory highlighted)\n"
printf " ${Yellow}-g${None}, ${Yellow}--go${None} <${Cyan}name${None}> Go to bookmark\n"
printf " ${Yellow}-v${None}, ${Yellow}--version${None} Show version information\n"
printf " ${Yellow}-h${None}, ${Yellow}--help${None} Show this help\n\n"
printf "${Green}Storage:${None}\n ${Cyan}%s${None}\n" "$CONFIG_FILE"
}
# ===== Main logic =====
local cmd="$1"; shift || true
case "$cmd" in
-a|--add) addBookmark "$1" ;;
-r|--remove) removeBookmark "$1" ;;
-l|--list) listBookmarks ;;
-g|--go) goToBookmark "$1" ;;
-v|--version) printVersion ;;
-h|--help|"") printHelp ;;
*)
[[ -n "$cmd" ]] && goToBookmark "$cmd" || printHelp
;;
esac
}
# ===== Bash completion including bookmark names =====
_bm_complete() {
local cur prev opts
COMPREPLY=()
cur="${COMP_WORDS[COMP_CWORD]}"
prev="${COMP_WORDS[COMP_CWORD-1]}"
opts="-a --add -r --remove -l --list -g --go -v --version -h --help"
local CONFIG_FILE="$HOME/.config/bm/list"
local -A bookmarks=()
[[ -f "$CONFIG_FILE" ]] && source "$CONFIG_FILE"
# If previous argument is a bookmark command, complete bookmark names
if [[ "$prev" =~ ^(-g|--go|-r|--remove)$ ]]; then
COMPREPLY=( $(compgen -W "${!bookmarks[*]}" -- "$cur") )
return 0
fi
# Always include bookmark names in completion
COMPREPLY=( $(compgen -W "$opts ${!bookmarks[*]}" -- "$cur") )
}
complete -F _bm_complete bm