Plugin to create bookmarks in the file system.
This plugin also makes it quite easy to navigate through the bookmarks and manage those bookmarks.
This commit is contained in:
parent
77140a2ea7
commit
6c4c39fa4f
223
plugins/bookmark/bookmark.plugin.zsh
Normal file
223
plugins/bookmark/bookmark.plugin.zsh
Normal file
@ -0,0 +1,223 @@
|
||||
#############################################################
|
||||
# Author: Amila Perera
|
||||
# File Name: bookmark.plugin.zsh
|
||||
#
|
||||
# This plugin can primarily be used to add bookmarks which
|
||||
# makes it easier to navigate through the file system.
|
||||
# The added bookmarks can also be listed, deleted, renamed and modified.
|
||||
#
|
||||
# After enabling this plugin, 'bm' command is created.
|
||||
# Use 'bm' to create bookmarks in the file system, manage those
|
||||
# bookmarks and navigate through the file system using the created bookmarks.
|
||||
# To invoke the basic usage of the command, type the following in command line.
|
||||
# % bm -h
|
||||
#
|
||||
# NOTE: zsh completion works with 'bm' command
|
||||
#############################################################
|
||||
|
||||
_bm_usage()
|
||||
{
|
||||
printf "Usage: bm: bm [option] [bookmarkname]\nType bm -h for help\n" 1>&2
|
||||
}
|
||||
|
||||
_bm_help()
|
||||
{
|
||||
cat <<- HELPMSG
|
||||
bm: Folder BookMark Utility
|
||||
Usage: bm [OPTION] [BOOKMARK] [DIRECTORY]
|
||||
|
||||
bm BOOKMARK Jumps to the directory given by BOOKMARK
|
||||
Options:
|
||||
-c BOOKMARK [DIRECTORY] Creates a bookmark.
|
||||
If no directory is given the current directory is bookmarked
|
||||
-d BOOKMARK1 BOOKMARK2... Delete bookmarks
|
||||
-r BOOKMARK_OLD BOOKMARK_NEW Renames a bookmark
|
||||
-m BOOKMARK DIRECTORY Modifies directory for a given bookmark
|
||||
-l Lists bookmarks(same operation is performed if bm is executed with no option)
|
||||
-h Displays this help
|
||||
HELPMSG
|
||||
}
|
||||
|
||||
_check_if_bm_exists()
|
||||
{
|
||||
local bmexist= name="${1}" bmfile="${2}"
|
||||
[ ! -f "${bmfile}" ] && return 0 # returns false since bookmark file doesn't exist
|
||||
|
||||
# check if book mark exists in particular bookmark file
|
||||
bmexist=$(awk -F':' '$1 == "'${name}'" { print $1 }' ${bmfile})
|
||||
[ ! -z $bmexist ] && { return 1; } || { return 0; }
|
||||
}
|
||||
|
||||
_bm_gotobm()
|
||||
{
|
||||
local name=${1} bmfile=${2} dirname=
|
||||
|
||||
_check_if_bm_exists $name $bmfile
|
||||
(($? == 0)) && { printf "bm: bookmark doesn't exist\n" 1>&2; return 1; }
|
||||
|
||||
dirname=$(awk -F':' '$1 == "'${name}'" { print $2 }' ${bmfile})
|
||||
|
||||
[ ! -d "${dirname}" ] && { printf "bm: directory doesn't exist\n" 1>&2; return 1; }
|
||||
|
||||
cd "${dirname}"
|
||||
return 0
|
||||
}
|
||||
|
||||
_bm_list()
|
||||
{
|
||||
if [ -f "${1}" ]; then
|
||||
sed 's/:/\t/' ${1} | sort | \
|
||||
{
|
||||
while read rbm rdir
|
||||
do
|
||||
[ -d "$rdir" ] && printf "%-20s ---> %s\n" "$rbm" "$rdir" \
|
||||
|| printf "%-20s ---> %s <====> [%s]\n" "$rbm" "$rdir" "doesn't exist"
|
||||
done
|
||||
}
|
||||
else
|
||||
printf "No bookmarks are entered\n" 1>&2 && _bm_usage
|
||||
fi
|
||||
}
|
||||
|
||||
##################################################################
|
||||
##bm()
|
||||
##folder bookmark function
|
||||
##################################################################
|
||||
bm()
|
||||
{
|
||||
local bm= dir= file="${HOME}/.bmarks"
|
||||
|
||||
case $1 in
|
||||
-c)
|
||||
shift
|
||||
[ $# -gt 2 -o $# -eq 0 ] && { _bm_usage; return 101; }
|
||||
bm=$1
|
||||
if [ -z "${2}" ]; then
|
||||
dir="${PWD}"
|
||||
else
|
||||
[[ "${2}" =~ ^~ || "${2}" =~ ^\/[^\/]* ]] && dir="${2}" || dir="$PWD/${2}"
|
||||
fi
|
||||
_check_if_bm_exists $bm $file
|
||||
[ $? -eq 1 ] && { printf "bm: bookmark name already exists\n" 1>&2; return 102; }
|
||||
dir=$(echo "${dir}/" | sed 's/\/\/*$/\//') # appending a / at the end of directory whether user supplies one or not
|
||||
[ ! -d "${dir}" ] \
|
||||
&& printf "bm: directory doesn't exist\n" 1>&2 \
|
||||
|| printf "%s:%s\n" "$bm" "$dir" >> $file
|
||||
;;
|
||||
|
||||
-d)
|
||||
shift
|
||||
for bm in "$@"; do
|
||||
_check_if_bm_exists $bm $file
|
||||
if [ $? -eq 1 ]; then
|
||||
local tempfile="${file}"".tmp"
|
||||
sed "/$bm:/d" $file > $tempfile; mv -f $tempfile $file
|
||||
else
|
||||
printf "bm: bookmark doesn't exist : %s\n" "$bm"
|
||||
fi
|
||||
done
|
||||
;;
|
||||
|
||||
-r)
|
||||
shift
|
||||
[ $# -ne 2 ] && { _bm_usage; return 101; }
|
||||
local oldbm=${1} newbm=${2}
|
||||
_check_if_bm_exists $oldbm $file
|
||||
if [ $? -eq 1 ]; then
|
||||
local tempfile="${file}"".tmp"
|
||||
sed "s/$oldbm:/$newbm:/" $file > $tempfile; mv -f $tempfile $file
|
||||
else
|
||||
printf "bm: bookmark doesn't exist : %s\n" "$oldbm"
|
||||
fi
|
||||
;;
|
||||
|
||||
-m)
|
||||
shift
|
||||
[ $# -gt 2 -o $# -eq 0 ] && { _bm_usage; return 101; }
|
||||
bm=$1
|
||||
if [ -z "${2}" ]; then
|
||||
dir="${PWD}"
|
||||
else
|
||||
[[ "${2}" =~ ^~ || "${2}" =~ ^\/[^\/]* ]] && dir="${2}" || dir="$PWD/${2}"
|
||||
fi
|
||||
_check_if_bm_exists $bm $file
|
||||
if [ $? -eq 1 ]; then
|
||||
[ ! -d "${dir}" ] && { printf "bm: directory doesn't exists\n" 1>&2; return 101; }
|
||||
dir=$(echo "${dir}/" | sed 's/\/\/*$/\//') # appending a / at the end of directory whether user supplies one or not
|
||||
local tempfile="${file}"".tmp"
|
||||
sed "/$bm:/d" $file > $tempfile
|
||||
printf "%s:%s\n" "$bm" "$dir" >> $tempfile
|
||||
mv -f $tempfile $file
|
||||
else
|
||||
printf "bm: bookmark doesn't exist : %s\n" "$bm"
|
||||
fi
|
||||
;;
|
||||
|
||||
-l)
|
||||
shift
|
||||
_bm_list "$file"
|
||||
;;
|
||||
|
||||
-h)
|
||||
_bm_help ;;
|
||||
|
||||
*)
|
||||
if [ $# -eq 0 ]; then
|
||||
_bm_list "$file"
|
||||
elif [ $# -gt 1 ]; then
|
||||
_bm_usage; return 1;
|
||||
else
|
||||
_bm_gotobm $1 $file
|
||||
[ $? -ne 0 ] && { _bm_usage; return 1; };
|
||||
return 0
|
||||
fi
|
||||
;;
|
||||
esac
|
||||
|
||||
return $?
|
||||
}
|
||||
|
||||
_bm()
|
||||
{
|
||||
typeset -A opt_args
|
||||
|
||||
local file="$HOME/.bmarks"
|
||||
local curcontext="$curcontext" state line
|
||||
|
||||
_arguments -C \
|
||||
'1: :->cmds'\
|
||||
'2:: :->args' && ret=0
|
||||
|
||||
case $state in
|
||||
cmds)
|
||||
if [ -f $file ]; then
|
||||
_values=( $(awk -F':' '{ print $1 }' $file) \
|
||||
'-c:create' \
|
||||
'-d:delete' \
|
||||
'-r:rename' \
|
||||
'-m:move' \
|
||||
'-l:list' \
|
||||
'-h:help')
|
||||
else
|
||||
_values=('-c:create' \
|
||||
'-d:delete' \
|
||||
'-r:rename' \
|
||||
'-m:move' \
|
||||
'-l:list' \
|
||||
'-h:help')
|
||||
fi
|
||||
_describe -t _values 'vaules' _values && ret=0
|
||||
;;
|
||||
args)
|
||||
case $line[1] in
|
||||
-m|-d)
|
||||
_bms=(`awk -F':' '{ print $1 }' $file`)
|
||||
_values 'bms' $_bms
|
||||
ret=0
|
||||
;;
|
||||
esac
|
||||
esac
|
||||
return ret
|
||||
}
|
||||
|
||||
compdef _bm bm B
|
Loading…
Reference in New Issue
Block a user