-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathterminal-bookmarks.sh
243 lines (227 loc) · 7.5 KB
/
terminal-bookmarks.sh
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
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
# --------------------------------------------------------------------------- #
# ------------------------ B o o k m a r k s BEGIN -------------------------- #
# --------------------------------------------------------------------------- #
#
# TODO: Legg til sjekk slik at du må confirm før du overskriver allerede eksisterende bookmark
# FIXME: Legg til funksjonalitet som når man godkjenner å overskrive en allerede eksisterende bokmerke så forskyves det bokmærke til bokmerket som påfølger
# NOTE: <== Per nå så forskyves bare ett bokmerke, ikke hele arrayet
# TODO: Legg til funksjonalitet for å kunne slette bokmerke direkte uten å forskyve
# Fil der bokmerker lagres
BOOKMARK_FILE="$HOME/.bookmarks"
# Global assosiativ array for bokmerker
typeset -A bookmarks
# Laster bokmerker fra filen
load_bookmarks() {
# echo "DEBUG: Starter load_bookmarks" >&2
bookmarks=()
# echo "DEBUG: Sjekker om fil eksisterer: $BOOKMARK_FILE" >&2
if [ -f "$BOOKMARK_FILE" ]; then
# echo "DEBUG: Fil finnes, leser med cat" >&2
while IFS="=" read -r key value || [[ -n "$key" ]]; do
# echo "DEBUG: Leser linje: key=$key, value=$value" >&2
[[ -n "$key" && -n "$value" ]] && bookmarks[$key]="$value"
done < <(cat "$BOOKMARK_FILE")
# echo "DEBUG: Fullførte lesing fra fil" >&2
fi
# echo "DEBUG: Avslutter load_bookmarks" >&2
}
# Lagrer bokmerker til filen
save_bookmarks() {
# echo "DEBUG: Starter save_bookmarks" >&2
# echo "DEBUG: Sjekker skrivetillatelse for $BOOKMARK_FILE" >&2
if [ ! -w "$BOOKMARK_FILE" ] && [ -e "$BOOKMARK_FILE" ]; then
# echo "Feil: $BOOKMARK_FILE eksisterer, men er ikke skrivbar." >&2
return 1
fi
# echo "DEBUG: Sørger for at filen eksisterer" >&2
if ! touch "$BOOKMARK_FILE" 2>/dev/null; then
echo "Feil: Kunne ikke opprette eller oppdatere $BOOKMARK_FILE. Sjekk rettigheter." >&2
return 1
fi
# echo "DEBUG: Tømmer filen" >&2
if ! : > "$BOOKMARK_FILE" 2>/dev/null; then
echo "Feil: Kunne ikke tømme $BOOKMARK_FILE. Sjekk rettigheter eller filstatus." >&2
return 1
fi
# echo "DEBUG: Skriver til $BOOKMARK_FILE" >&2
for key in ${(n)${(k)bookmarks}}; do
# echo "DEBUG: Skriver linje: $key=${bookmarks[$key]}" >&2
echo "$key=${bookmarks[$key]}" >> "$BOOKMARK_FILE" 2>/dev/null || {
echo "Feil: Kunne ikke skrive til $BOOKMARK_FILE under oppdatering." >&2
return 1
}
done
# echo "DEBUG: Fullførte save_bookmarks" >&2
}
# Flytter bokmerker oppover
shift_bookmarks_from() {
local num=$1
local i
# echo "DEBUG: Starter shift_bookmarks_from med num=$num" >&2
for i in ${(n)${(k)bookmarks}}; do
if [[ $i -ge $num ]]; then
bookmarks[$((i + 1))]="${bookmarks[$i]}"
fi
done
# echo "DEBUG: Fullførte shift_bookmarks_from" >&2
}
# Setter et bokmerke
set_bookmark() {
local num=$1
# echo "DEBUG: Starter set_bookmark med num=$num" >&2
if ! [[ "$num" =~ '^[0-9]+$' ]]; then
# echo "Feil: '$num' er ikke et gyldig nummer." >&2
return 1
fi
# echo "DEBUG: Kaller load_bookmarks" >&2
load_bookmarks
# echo "DEBUG: load_bookmarks fullført" >&2
if [[ -n "${bookmarks[$num]}" ]]; then
# echo "DEBUG: Bokmerke finnes, venter på input" >&2
read -u 0 "confirm?Bokmerke $num finnes allerede (mappe: ${bookmarks[$num]}). Overskriv og flytt eksisterende bokmerker oppover? (y/n): "
if [[ "$confirm" != "y" ]]; then
echo "Handling avbrutt." >&2
return
else
# echo "DEBUG: Kaller shift_bookmarks_from" >&2
shift_bookmarks_from "$num"
fi
fi
# echo "DEBUG: Setter bokmerke" >&2
bookmarks[$num]="$PWD"
# echo "DEBUG: Lagrer bokmerker" >&2
save_bookmarks
# echo "Bokmerke $num satt til $PWD" >&2
}
# Bytter til bokmerke
goto_bookmark() {
local num=$1
if ! [[ "$num" =~ '^[0-9]+$' ]]; then
echo "Feil: '$num' er ikke et gyldig nummer." >&2
return 1
fi
# echo "DEBUG: Kaller load_bookmarks i goto_bookmark" >&2
load_bookmarks
if [[ -n "${bookmarks[$num]}" ]]; then
if [[ -d "${bookmarks[$num]}" ]]; then
cd "${bookmarks[$num]}"
else
echo "Feil: Mappen '${bookmarks[$num]}' eksisterer ikke lenger." >&2
fi
else
echo "Bokmerke $num er ikke definert." >&2
fi
}
# Sletter et bokmerke
del_bookmark() {
local num=$1
if ! [[ "$num" =~ '^[0-9]+$' ]]; then
echo "Feil: '$num' er ikke et gyldig nummer." >&2
return 1
fi
# echo "DEBUG: Kaller load_bookmarks i del_bookmark" >&2
load_bookmarks
if [[ -n "${bookmarks[$num]}" ]]; then
unset bookmarks[$num]
save_bookmarks
echo "Bokmerke $num slettet." >&2
else
echo "Bokmerke $num finnes ikke." >&2
fi
}
# Lister bokmerker
list_bookmarks() {
load_bookmarks
if (( ${#bookmarks} == 0 )); then
echo "Ingen bokmerker definert."
else
echo "Bokmerker:"
for key in ${(n)${(k)bookmarks}}; do
local path
if [[ "${bookmarks[$key]}" == "$HOME"* ]]; then
path="~${bookmarks[$key]#$HOME}"
else
path="${bookmarks[$key]}"
fi
printf " %2d: %s\n" "$key" "$path"
done
fi
return 0
}
# Viser keybinding-hjelp
show_keybindings_help() {
echo "Hotkeys er bundet til 'bookmark <nummer>' ved hjelp av F1–F9 for å navigere til bokmerker." >&2
echo "For å endre dette, rediger BOOKMARK_SET_KEYS og bindkey-koden i skriptet." >&2
echo "Gjeldende bindinger (hvis terminfo støtter det):" >&2
for num in {1..9}; do
if [[ -n "${terminfo[kf$num]}" ]]; then
echo " F$num -> bookmark $num (navigerer til bokmerke $num)" >&2
fi
done
echo "Eksempel på tilpasning i ~/.zshrc: bindkey '\e[11~' 'bookmark-goto-1'" >&2
}
# Hovedfunksjon
bookmark() {
if [[ "$1" == "set" || "$1" == "s" ]] && [[ -n "$2" ]]; then
set_bookmark "$2"
elif [[ "$1" == "del" || "$1" == "d" ]] && [[ -n "$2" ]]; then
del_bookmark "$2"
elif [[ "$1" == "help-bindings" ]]; then
show_keybindings_help
elif [[ -z "$1" ]]; then
list_bookmarks
elif [[ "$1" =~ '^[0-9]+$' ]]; then
goto_bookmark "$1"
else
echo "Bruk:
bookmark -> List bokmerker
bookmark set|s <nummer> -> Lagre gjeldende mappe som bokmerke
bookmark <nummer> -> Gå til bokmerke
bookmark del|d <nummer> -> Slett bokmerke
bookmark help-bindings -> Vis keybinding-forslag" >&2
fi
}
# Hotkey-bindinger
typeset -A BOOKMARK_SET_KEYS
BOOKMARK_SET_KEYS=(
1 "kf1"
2 "kf2"
3 "kf3"
4 "kf4"
5 "kf5"
6 "kf6"
7 "kf7"
8 "kf8"
9 "kf9"
10 "kf10"
11 "kf11"
12 "kf12"
)
# Funksjon for å definere og binde hotkeys
setup_bookmark_hotkeys() {
# Hjelpefunksjon som navigerer til bokmerke via zle
bookmark_goto_widget() {
local num="$1"
BUFFER="bookmark $num"
zle accept-line
}
# Definer widgeter for hver bokmerke-nummer
for num in ${(k)BOOKMARK_SET_KEYS}; do
eval "bookmark_goto_${num}() { bookmark_goto_widget $num }"
zle -N "bookmark-goto-$num" "bookmark_goto_${num}"
local key="${terminfo[${BOOKMARK_SET_KEYS[$num]}]}"
if [[ -n "$key" ]]; then
bindkey "$key" "bookmark-goto-$num"
# echo "DEBUG: Bundet F$num til bookmark-goto-$num (navigerer til bokmerke $num)" >&2
else
# echo "Advarsel: Ingen terminfo-verdi for F$num. Hotkey ble ikke bundet." >&2
fi
done
}
# Kjør oppsettet for hotkeys
setup_bookmark_hotkeys
# --------------------------------------------------------------------------- #
# ------------------------- B o o k m a r k s END --------------------------- #
# --------------------------------------------------------------------------- #
# --------------- T e r m i n a l C a l c u l a t o r BEGIN -------------- #
# --------------------------------------------------------------------------- #