From c5dc6b64bfc3327d6ba711c993cf18a1aefd99a6 Mon Sep 17 00:00:00 2001 From: Erik Westrup Date: Thu, 4 Nov 2021 12:05:38 +0100 Subject: [PATCH 1/3] Fix indentation in _cdbookmark_print_error() --- cd-bookmark | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cd-bookmark b/cd-bookmark index e0dd738..2e4f30f 100644 --- a/cd-bookmark +++ b/cd-bookmark @@ -46,8 +46,8 @@ 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_edit_bookmark() { From 76f99175f2cc10068bd94e73586eed57455f8973 Mon Sep 17 00:00:00 2001 From: Erik Westrup Date: Thu, 4 Nov 2021 12:28:46 +0100 Subject: [PATCH 2/3] Add delete command -d The missing piece for this shell program: easily delete bookmarkas as well without having to being faced with all bookmarks with the -e edit command. When one know the BOOKMARK_ID, it should be as easy as $ cd-bookmark -d BOOKMAK_ID to remove it! Fixes #5 --- README.md | 4 ++++ _cd-bookmark | 2 +- cd-bookmark | 25 ++++++++++++++++++++++++- 3 files changed, 29 insertions(+), 2 deletions(-) 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 2e4f30f..055d4eb 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 @@ -50,6 +51,21 @@ function _cdbookmark_print_error() { echo "Try \`-h' option for more information." 1>&2 } +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="$(echo $bookmark_id | sed -e 's/[^a-zA-Z0-9<>]/\\&/g')" + # 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() { # open BOOKMARK_FILE with EDITOR. ${EDITOR:-vi} "$BOOKMARK_FILE" @@ -145,7 +161,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 +170,10 @@ function _cdbookmark_main() { bookmark_id="$OPTARG" mode="cd" ;; + d) + bookmark_id="$OPTARG" + mode="delete" + ;; l) mode="list" ;; @@ -208,6 +228,9 @@ function _cdbookmark_main() { cd) _cdbookmark_cd_to_bookmark "$bookmark_id" ;; + delete) + _cdbookmark_delete_bookmark "$bookmark_id" + ;; list) _cdbookmark_list_bookmark ;; From 4ec2da502cb6021d7196d3018a1e2dd80e5aae9e Mon Sep 17 00:00:00 2001 From: Erik Westrup Date: Thu, 4 Nov 2021 12:42:46 +0100 Subject: [PATCH 3/3] Extract escaped_id to a function As this is now used in multiple places. --- cd-bookmark | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/cd-bookmark b/cd-bookmark index 055d4eb..b16c91d 100644 --- a/cd-bookmark +++ b/cd-bookmark @@ -51,6 +51,10 @@ function _cdbookmark_print_error() { 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)" @@ -60,7 +64,7 @@ function _cdbookmark_delete_bookmark() { return 4 fi - local escaped_id="$(echo $bookmark_id | sed -e 's/[^a-zA-Z0-9<>]/\\&/g')" + 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" @@ -84,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 }