diff --git a/README.md b/README.md
index 36f948c..d5d7a0a 100644
--- a/README.md
+++ b/README.md
@@ -74,6 +74,7 @@ In the 3rd form, list current bookmark.
* `-a` [BOOKMARK\_ID] add current directory to bookmark
with no BOOKMARK\_ID, automatically use free ID number as BOOKMARK\_ID
* `-c` BOOKMARK\_ID change directory which is identified by BOOKMARK\_ID
+* `-d` BOOKMARK\_ID delete directory which is identified by BOOKMARK\_ID
* `-l` list bookmark
* `-e` edit bookmark file
* `-p` BOOKMARK\_ID display bookmark real path for BOOKMARK\_ID
@@ -119,5 +120,8 @@ work|/home/mollifier/work
# To edit bookmark, run cd-bookmark with -e option.
% cd-bookmark -e
# Open bookmark file with $EDITOR (vim, emacs, etc.), so you can edit bookmark.
+
+# To delete a bookmark, run cd-bookmark with -d option.
+% cd-bookmark -d work
```
diff --git a/_cd-bookmark b/_cd-bookmark
index 48323e4..f09c395 100644
--- a/_cd-bookmark
+++ b/_cd-bookmark
@@ -20,6 +20,7 @@ declare -a opts args
args=(
'(:)-a[add current directory to bookmark]:new_bookmark_id:_cd-bookmark_current_directory_name'
'-c[change directory which is identified by BOOKMARK_ID]:bookmark_id:->bookmark_id_or_path'
+ '-d[delete directory which is identified by BOOKMARK_ID]:bookmark_id:->bookmark_id_or_path'
'-l[list bookmark]'
'-e[edit bookmark file]'
'-p[display bookmark real path for BOOKMARK_ID]:bookmark_id:_cd-bookmark_bookmark_id'
@@ -82,4 +83,3 @@ return $ret
# sh-basic-offset: 2
# End:
# vim: ft=zsh sw=2 ts=2 et
-
diff --git a/cd-bookmark b/cd-bookmark
index e0dd738..b16c91d 100644
--- a/cd-bookmark
+++ b/cd-bookmark
@@ -38,6 +38,7 @@ For example if 'cd-bookmark work' command will change current directory to '~/wo
-a [BOOKMARK_ID] add current directory to bookmark
with no BOOKMARK_ID, automatically use free ID number as BOOKMARK_ID
-c BOOKMARK_ID change directory which is identified by BOOKMARK_ID
+ -d BOOKMARK_ID delete directory which is identified by BOOKMARK_ID
-l list bookmark
-e edit bookmark file
-p BOOKMARK_ID display bookmark real path for BOOKMARK_ID
@@ -46,8 +47,27 @@ EOF
}
function _cdbookmark_print_error() {
- echo "$SCRIPT_NAME: $@" 1>&2
- echo "Try \`-h' option for more information." 1>&2
+ echo "$SCRIPT_NAME: $@" 1>&2
+ echo "Try \`-h' option for more information." 1>&2
+}
+
+function _cdbookmark_escape_id() {
+ echo $1 | sed -e 's/[^a-zA-Z0-9<>]/\\&/g'
+}
+
+function _cdbookmark_delete_bookmark() {
+ local bookmark_id="$1"
+ local bookmark_dir="$(_cdbookmark_get_bookmark $bookmark_id)"
+
+ if [ -z "$bookmark_dir" ]; then
+ _cdbookmark_print_error "$bookmark_id is not in bookmark"
+ return 4
+ fi
+
+ local escaped_id="$(_cdbookmark_escape_id $1)"
+ # To be compatiable with both GNU sed and the old BSD sed that macOS uses, need to set and inplace backup extension and then remove the file.
+ # Reference: https://unix.stackexchange.com/a/131940/19909
+ sed -i.bak -e "/^${escaped_id}|/d" "$BOOKMARK_FILE" && rm "$BOOKMARK_FILE.bak"
}
function _cdbookmark_edit_bookmark() {
@@ -68,7 +88,7 @@ function _cdbookmark_list_bookmark_id() {
}
function _cdbookmark_get_bookmark() {
- local escaped_id="$(echo $1 | sed -e 's/[^a-zA-Z0-9<>]/\\&/g')"
+ local escaped_id="$(_cdbookmark_escape_id $1)"
cat "$BOOKMARK_FILE" | grep -E "^${escaped_id}\\|" | cut -d '|' -f 2 | head -n 1
}
@@ -145,7 +165,7 @@ function _cdbookmark_main() {
local bookmark_id=""
local option OPTARG OPTIND
- while getopts ':ac:lep:h' option; do
+ while getopts ':ac:d:lep:h' option; do
case $option in
a)
mode="add"
@@ -154,6 +174,10 @@ function _cdbookmark_main() {
bookmark_id="$OPTARG"
mode="cd"
;;
+ d)
+ bookmark_id="$OPTARG"
+ mode="delete"
+ ;;
l)
mode="list"
;;
@@ -208,6 +232,9 @@ function _cdbookmark_main() {
cd)
_cdbookmark_cd_to_bookmark "$bookmark_id"
;;
+ delete)
+ _cdbookmark_delete_bookmark "$bookmark_id"
+ ;;
list)
_cdbookmark_list_bookmark
;;