-
Notifications
You must be signed in to change notification settings - Fork 41
/
zshmarks.plugin.zsh
136 lines (126 loc) · 4.09 KB
/
zshmarks.plugin.zsh
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
# ------------------------------------------------------------------------------
# FILE: zshmarks.plugin.zsh
# DESCRIPTION: oh-my-zsh plugin file.
# AUTHOR: Jocelyn Mallon
# VERSION: 1.7.0
# ------------------------------------------------------------------------------
# Set BOOKMARKS_FILE if it doesn't exist to the default.
# Allows for a user-configured BOOKMARKS_FILE.
if [[ -z $BOOKMARKS_FILE ]] ; then
export BOOKMARKS_FILE="$HOME/.bookmarks"
fi
# Check if $BOOKMARKS_FILE is a symlink.
if [[ -L $BOOKMARKS_FILE ]]; then
BOOKMARKS_FILE=$(readlink $BOOKMARKS_FILE)
fi
# Create bookmarks_file it if it doesn't exist
if [[ ! -f $BOOKMARKS_FILE ]]; then
touch $BOOKMARKS_FILE
fi
_zshmarks_move_to_trash(){
if [[ $(uname) == "Linux"* || $(uname) == "FreeBSD"* ]]; then
label=`date +%s`
mkdir -p ~/.local/share/Trash/info ~/.local/share/Trash/files
\mv "${BOOKMARKS_FILE}.bak" ~/.local/share/Trash/files/bookmarks-$label
echo "[Trash Info]
Path=/home/"$USER"/.bookmarks
DeletionDate="`date +"%Y-%m-%dT%H:%M:%S"`"
">~/.local/share/Trash/info/bookmarks-$label.trashinfo
elif [[ $(uname) = "Darwin" ]]; then
\mv "${BOOKMARKS_FILE}.bak" ~/.Trash/"bookmarks"$(date +%H-%M-%S)
else
\rm -f "${BOOKMARKS_FILE}.bak"
fi
}
function bookmark() {
local bookmark_name=$1
if [[ -z $bookmark_name ]]; then
bookmark_name="${PWD##*/}"
fi
cur_dir="$(pwd)"
# Replace /home/uname with $HOME
if [[ "$cur_dir" =~ ^"$HOME"(/|$) ]]; then
cur_dir="\$HOME${cur_dir#$HOME}"
fi
# Store the bookmark as folder|name
bookmark="$cur_dir|$bookmark_name"
if [[ -z $(grep "$bookmark" $BOOKMARKS_FILE 2>/dev/null) ]]; then
echo $bookmark >> $BOOKMARKS_FILE
echo "Bookmark '$bookmark_name' saved"
else
echo "Bookmark already existed"
return 1
fi
}
__zshmarks_zgrep() {
local outvar="$1"; shift
local pattern="$1"
local filename="$2"
local file_contents="$(<"$filename")"
local file_lines; file_lines=(${(f)file_contents})
for line in "${file_lines[@]}"; do
if [[ "$line" =~ "$pattern" ]]; then
eval "$outvar=\"$line\""
return 0
fi
done
return 1
}
function jump() {
local bookmark_name=$1
local bookmark
if ! __zshmarks_zgrep bookmark "\\|$bookmark_name\$" "$BOOKMARKS_FILE"; then
echo "Invalid name, please provide a valid bookmark name. For example:"
echo " jump foo"
echo
echo "To bookmark a folder, go to the folder then do this (naming the bookmark 'foo'):"
echo " bookmark foo"
return 1
else
local dir="${bookmark%%|*}"
eval "cd \"${dir}\""
fi
}
# Show a list of the bookmarks
function showmarks() {
local bookmark_file="$(<"$BOOKMARKS_FILE")"
local bookmark_array; bookmark_array=(${(f)bookmark_file});
local bookmark_name bookmark_path bookmark_line
if [[ $# -eq 1 ]]; then
bookmark_name="*\|${1}"
bookmark_line=${bookmark_array[(r)$bookmark_name]}
bookmark_path="${bookmark_line%%|*}"
bookmark_path="${bookmark_path/\$HOME/~}"
printf "%s \n" $bookmark_path
else
for bookmark_line in $bookmark_array; do
bookmark_path="${bookmark_line%%|*}"
bookmark_path="${bookmark_path/\$HOME/~}"
bookmark_name="${bookmark_line#*|}"
printf "%s\t\t%s\n" "$bookmark_name" "$bookmark_path"
done
fi
}
# Delete a bookmark
function deletemark() {
local bookmark_name=$1
if [[ -z $bookmark_name ]]; then
printf "%s \n" "Please provide a name for your bookmark to delete. For example:"
printf "\t%s \n" "deletemark foo"
return 1
else
local bookmark_line bookmark_search
local bookmark_file="$(<"$BOOKMARKS_FILE")"
local bookmark_array; bookmark_array=(${(f)bookmark_file});
bookmark_search="*\|${bookmark_name}"
if [[ -z ${bookmark_array[(r)$bookmark_search]} ]]; then
eval "printf '%s\n' \"'${bookmark_name}' not found, skipping.\""
else
\cp "${BOOKMARKS_FILE}" "${BOOKMARKS_FILE}.bak"
bookmark_line=${bookmark_array[(r)$bookmark_search]}
bookmark_array=(${bookmark_array[@]/$bookmark_line})
eval "printf '%s\n' \"\${bookmark_array[@]}\"" >! $BOOKMARKS_FILE
_zshmarks_move_to_trash
fi
fi
}