Files
oh-my-bash/plugins/bashmarks/bashmarks.plugin.sh

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

233 lines
7.0 KiB
Bash
Raw Normal View History

#! bash oh-my-bash.module
2023-10-12 15:20:52 +09:00
# Copyright (c) 2010, Huy Nguyen, https://everyhue.me
# Copyright (c) 2015, Toan Nguyen, https://nntoan.github.io
2017-03-19 15:40:25 +07:00
# All rights reserved.
#
2023-10-12 15:20:52 +09:00
# This plugin is derived from the project https://github.com/huing/bashmarks.
# This version is based on the following commit in the upstream project:
2017-03-19 15:40:25 +07:00
#
# https://github.com/huyng/bashmarks/commit/264952f2225691b5f99a498e4834e2c69bf4f5f5
2023-10-12 15:20:52 +09:00
#
# This plugin is licensed under the BSD-3 License.
#------------------------------------------------------------------------------
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are met:
#
# * Redistributions of source code must retain the above copyright notice,
# this list of conditions and the following disclaimer.
# * Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
# * Neither the name of Huy Nguyen nor the names of contributors may be
# used to endorse or promote products derived from this software without
2017-03-19 15:40:25 +07:00
# specific prior written permission.
#
2023-10-12 15:20:52 +09:00
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
2017-03-19 15:40:25 +07:00
# POSSIBILITY OF SUCH DAMAGE.
2023-10-12 15:20:52 +09:00
#------------------------------------------------------------------------------
2017-03-19 15:40:25 +07:00
# USAGE:
# bm -a bookmarkname - saves the curr dir as bookmarkname
# bm -g bookmarkname - jumps to the that bookmark
# bm -g b[TAB] - tab completion is available
# bm -p bookmarkname - prints the bookmark
# bm -p b[TAB] - tab completion is available
# bm -d bookmarkname - deletes the bookmark
# bm -d [TAB] - tab completion is available
# bm -l - list all bookmarks
# setup file to store bookmarks
2023-10-12 15:35:23 +09:00
if [[ ! $SDIRS ]]; then
2023-10-12 15:21:51 +09:00
SDIRS=~/.sdirs
2017-03-19 15:40:25 +07:00
fi
touch "$SDIRS"
2017-03-19 15:40:25 +07:00
# main function
function bm {
2023-10-12 15:35:23 +09:00
local option=$1
case $option in
2017-03-20 19:51:00 +07:00
# save current directory to bookmarks [ bm -a BOOKMARK_NAME ]
-a)
_save_bookmark "$2"
;;
# delete bookmark [ bm -d BOOKMARK_NAME ]
-d)
_delete_bookmark "$2"
;;
# jump to bookmark [ bm -g BOOKMARK_NAME ]
-g)
_goto_bookmark "$2"
;;
# print bookmark [ bm -p BOOKMARK_NAME ]
-p)
_print_bookmark "$2"
;;
# show bookmark list [ bm -l ]
-l)
_list_bookmark
;;
# help [ bm -h ]
-h)
_echo_usage
;;
2017-03-20 19:51:00 +07:00
*)
if [[ $1 == -* ]]; then
# unrecognized option. echo error message and usage [ bm -X ]
echo "Unknown option '$1'"
_echo_usage
kill -SIGINT $$
exit 1
elif [[ $1 == "" ]]; then
# no args supplied - echo usage [ bm ]
_echo_usage
else
# non-option supplied as first arg. assume goto [ bm BOOKMARK_NAME ]
_goto_bookmark "$1"
fi
2017-03-20 19:51:00 +07:00
;;
esac
2017-03-19 15:40:25 +07:00
}
# print usage information
function _echo_usage {
echo 'USAGE:'
echo "bm -h - Prints this usage info"
echo 'bm -a <bookmark_name> - Saves the current directory as "bookmark_name"'
echo 'bm [-g] <bookmark_name> - Goes (cd) to the directory associated with "bookmark_name"'
echo 'bm -p <bookmark_name> - Prints the directory associated with "bookmark_name"'
echo 'bm -d <bookmark_name> - Deletes the bookmark'
echo 'bm -l - Lists all available bookmarks'
}
2017-03-19 15:40:25 +07:00
# save current directory to bookmarks
function _save_bookmark {
2023-10-12 15:35:23 +09:00
local exit_message
2017-03-20 19:51:00 +07:00
_bookmark_name_valid "$@"
2023-10-12 15:35:23 +09:00
if [[ ! $exit_message ]]; then
2017-03-20 19:51:00 +07:00
_purge_line "$SDIRS" "export DIR_$1="
CURDIR=$(echo $PWD| sed "s#^$HOME#\$HOME#g")
echo "export DIR_$1=\"$CURDIR\"" >> $SDIRS
fi
2017-03-19 15:40:25 +07:00
}
# delete bookmark
function _delete_bookmark {
2023-10-12 15:35:23 +09:00
local exit_message
2017-03-20 19:51:00 +07:00
_bookmark_name_valid "$@"
2023-10-12 15:35:23 +09:00
if [[ ! $exit_message ]]; then
2017-03-20 19:51:00 +07:00
_purge_line "$SDIRS" "export DIR_$1="
unset "DIR_$1"
fi
2017-03-19 15:40:25 +07:00
}
# jump to bookmark
function _goto_bookmark {
2023-10-12 15:35:23 +09:00
source "$SDIRS"
local target_varname=DIR_$1
local target=${!target_varname-}
if [[ -d $target ]]; then
2023-10-12 15:21:51 +09:00
cd "$target"
2023-10-12 15:35:23 +09:00
elif [[ ! $target ]]; then
2023-10-12 15:21:51 +09:00
printf '%s\n' "${_omb_term_brown}WARNING: '${1}' bashmark does not exist${_omb_term_reset}"
else
printf '%s\n' "${_omb_term_brown}WARNING: '${target}' does not exist${_omb_term_reset}"
fi
2017-03-19 15:40:25 +07:00
}
# list bookmarks with dirname
function _list_bookmark {
2023-10-12 15:35:23 +09:00
source "$SDIRS"
2023-10-12 15:21:51 +09:00
# if color output is not working for you, comment out the line below '\033[1;32m' == "red"
env | sort | awk '/^DIR_.+/{split(substr($0,5),parts,"="); printf("\033[0;33m%-20s\033[0m %s\n", parts[1], parts[2]);}'
2023-10-12 15:21:51 +09:00
# uncomment this line if color output is not working with the line above
# env | grep "^DIR_" | cut -c5- | sort |grep "^.*="
2017-03-19 15:40:25 +07:00
}
# print bookmark
function _print_bookmark {
2023-10-12 15:35:23 +09:00
source "$SDIRS"
2023-10-12 15:21:51 +09:00
echo "$(eval $(echo echo $(echo \$DIR_$1)))"
2017-03-19 15:40:25 +07:00
}
# list bookmarks without dirname
function _l {
2023-10-12 15:35:23 +09:00
source "$SDIRS"
2023-10-12 15:21:51 +09:00
env | grep "^DIR_" | cut -c5- | sort | grep "^.*=" | cut -f1 -d "="
2017-03-19 15:40:25 +07:00
}
# validate bookmark name
2023-10-12 15:35:23 +09:00
# @var[out] exit_message
2017-03-19 15:40:25 +07:00
function _bookmark_name_valid {
2023-10-12 15:21:51 +09:00
exit_message=""
2023-10-12 15:35:23 +09:00
if [[ ! $1 ]]; then
2023-10-12 15:21:51 +09:00
exit_message="bookmark name required"
2023-10-12 15:35:23 +09:00
echo "$exit_message"
elif [[ $1 == *[!A-Za-z0-9_]* ]]; then
2023-10-12 15:21:51 +09:00
exit_message="bookmark name is not valid"
2023-10-12 15:35:23 +09:00
echo "$exit_message"
2023-10-12 15:21:51 +09:00
fi
2017-03-19 15:40:25 +07:00
}
# completion command
function _comp {
2023-10-12 15:21:51 +09:00
local curw
COMPREPLY=()
if ((COMP_CWORD >= 2)) && [[ ${COMP_WORDS[1]} == -[gpd] ]]; then
local cur=${COMP_WORDS[COMP_CWORD]}
COMPREPLY=($(compgen -W '$(_l)' -- "$cur"))
fi
2023-10-12 15:21:51 +09:00
return 0
2017-03-19 15:40:25 +07:00
}
# ZSH completion command
function _compzsh {
2017-03-20 19:51:00 +07:00
reply=($(_l))
2017-03-19 15:40:25 +07:00
}
# safe delete line from sdirs
function _purge_line {
2023-10-12 15:35:23 +09:00
if [[ -s $1 ]]; then
2017-03-20 19:51:00 +07:00
# safely create a temp file
t=$(mktemp -t bashmarks.XXXXXX) || exit 1
trap "/bin/rm -f -- '$t'" EXIT
# purge line
sed "/$2/d" "$1" >| "$t"
2017-03-20 19:51:00 +07:00
/bin/mv "$t" "$1"
# cleanup temp file
/bin/rm -f -- "$t"
trap - EXIT
fi
2017-03-19 15:40:25 +07:00
}
# bind completion command for g,p,d to _comp
2023-10-12 15:35:23 +09:00
if [[ ${ZSH_VERSION-} ]]; then
2017-03-20 19:51:00 +07:00
compctl -K _compzsh bm -g
compctl -K _compzsh bm -p
compctl -K _compzsh bm -d
compctl -K _compzsh g
compctl -K _compzsh p
compctl -K _compzsh d
2017-03-19 15:40:25 +07:00
else
2017-03-20 19:51:00 +07:00
shopt -s progcomp
complete -F _comp bm
2017-03-20 19:51:00 +07:00
complete -F _comp g
complete -F _comp p
complete -F _comp d
2017-03-19 15:40:25 +07:00
fi
alias s='bm -a' # Save a bookmark [bookmark_name]
alias g='bm -g' # Go to bookmark [bookmark_name]
alias p='bm -p' # Print bookmark of a path [path]
alias d='bm -d' # Delete a bookmark [bookmark_name]