You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
263 lines
9.3 KiB
263 lines
9.3 KiB
#!/bin/sh |
|
|
|
# (C) 2002-2003 Dan Allen and Stefan Kamphausen |
|
|
|
# Written by Dan Allen <dan@mojavelinux.com> |
|
# - small additions by Stefan Kamphausen |
|
# - better completion code by Robi Malik robi.malik@nexgo.de |
|
# - trailing path support by Damon Harper <ds+dev-cdargs@usrbin.ca> Feb 2006 |
|
|
|
# Globals |
|
CDARGS_SORT=0 # set to 1 if you want mark to sort the list |
|
CDARGS_NODUPS=1 # set to 1 if you want mark to delete dups |
|
|
|
# --------------------------------------------- # |
|
# Run the cdargs program to get the target # |
|
# directory to be used in the various context # |
|
# This is the fundamental core of the # |
|
# bookmarking idea. An alias or substring is # |
|
# expected and upon receiving one it either # |
|
# resolves the alias if it exists or opens a # |
|
# curses window with the narrowed down options # |
|
# waiting for the user to select one. # |
|
# # |
|
# @param string alias # |
|
# # |
|
# @access private # |
|
# @return 0 on success, >0 on failure # |
|
# --------------------------------------------- # |
|
|
|
CDARGSPATH="$SHELLRC/var/cdargs/cdargs" |
|
CDARGSRESULT="$SHELLRC/var/cdargs/cdargsresult" |
|
|
|
function _cdargs_get_dir () |
|
{ |
|
local bookmark extrapath |
|
# if there is one exact match (possibly with extra path info after it), |
|
# then just use that match without calling cdargs |
|
if [ -e "$CDARGSPATH" ]; then |
|
dir=`grep "^$1 " "$CDARGSPATH"` |
|
if [ -z "$dir" ]; then |
|
bookmark="${1/\/*/}" |
|
if [ "$bookmark" != "$1" ]; then |
|
dir=`grep "^$bookmark " "$CDARGSPATH"` |
|
extrapath=`echo "$1" | sed 's#^[^/]*/#/#'` |
|
fi |
|
fi |
|
[ -n "$dir" ] && dir=`echo "$dir" | sed 's/^[^ ]* //'` |
|
fi |
|
if [ -z "$dir" -o "$dir" != "${dir/ |
|
/}" ]; then |
|
# okay, we need cdargs to resolve this one. |
|
# note: intentionally retain any extra path to add back to selection. |
|
dir= |
|
if cdargs --noresolve "${1/\/*/}"; then |
|
dir=`cat "$CDARGSRESULT"` |
|
rm -f "$CDARGSRESULT" 2>/dev/null; |
|
fi |
|
fi |
|
if [ -z "$dir" ]; then |
|
echo "Aborted: no directory selected" >&2 |
|
return 1 |
|
fi |
|
[ -n "$extrapath" ] && dir="$dir$extrapath" |
|
if [ ! -d "$dir" ]; then |
|
echo "Failed: no such directory '$dir'" >&2 |
|
return 2 |
|
fi |
|
} |
|
|
|
# --------------------------------------------- # |
|
# Perform the command (cp or mv) using the # |
|
# cdargs bookmark alias as the target directory # |
|
# # |
|
# @param string command argument list # |
|
# # |
|
# @access private # |
|
# @return void # |
|
# --------------------------------------------- # |
|
function _cdargs_exec () |
|
{ |
|
local arg dir i last call_with_browse |
|
|
|
# Get the last option which will be the bookmark alias |
|
eval last=\${$#}; |
|
|
|
# Resolve the bookmark alias. If it cannot resolve, the |
|
# curses window will come up at which point a directory |
|
# will need to be choosen. After selecting a directory, |
|
# the function will continue and $_cdargs_dir will be set. |
|
if [ -e $last ]; then |
|
last= |
|
fi |
|
if _cdargs_get_dir "$last"; then |
|
# For each argument save the last, move the file given in |
|
# the argument to the resolved cdargs directory |
|
i=1; |
|
for arg; do |
|
if [ $i -lt $# ]; then |
|
$command "$arg" "$dir"; |
|
fi |
|
let i=$i+1; |
|
done |
|
fi |
|
} |
|
|
|
# --------------------------------------------- # |
|
# Prepare to move file list into the cdargs # |
|
# target directory # |
|
# # |
|
# @param string command argument list # |
|
# # |
|
# @access public # |
|
# @return void # |
|
# --------------------------------------------- # |
|
function mvb () |
|
{ |
|
local command |
|
|
|
command='mv -i'; |
|
_cdargs_exec $*; |
|
} |
|
|
|
# --------------------------------------------- # |
|
# Prepare to copy file list into the cdargs # |
|
# target directory # |
|
# # |
|
# @param string command argument list # |
|
# # |
|
# @access public # |
|
# @return void # |
|
# --------------------------------------------- # |
|
function cpb () |
|
{ |
|
local command |
|
|
|
command='cp -i'; |
|
_cdargs_exec $*; |
|
} |
|
|
|
# --------------------------------------------- # |
|
# Change directory to the cdargs target # |
|
# directory # |
|
# # |
|
# @param string alias # |
|
# # |
|
# @access public # |
|
# @return void # |
|
# --------------------------------------------- # |
|
function cdb () |
|
{ |
|
local dir |
|
|
|
_cdargs_get_dir "$1" && cd "$dir" && echo `pwd`; |
|
} |
|
alias cb='cdb' |
|
alias cv='cdb' |
|
|
|
# --------------------------------------------- # |
|
# Mark the current directory with alias # |
|
# provided and store as a cdargs bookmark # |
|
# directory # |
|
# # |
|
# @param string alias # |
|
# # |
|
# @access public # |
|
# @return void # |
|
# --------------------------------------------- # |
|
function mark () |
|
{ |
|
local tmpfile |
|
|
|
# first clear any bookmarks with this same alias, if file exists |
|
if [[ "$CDARGS_NODUPS" && -e "$CDARGSPATH" ]]; then |
|
tmpfile=`echo ${TEMP:-${TMPDIR:-/tmp}} | sed -e "s/\\/$//"` |
|
tmpfile=$tmpfile/cdargs.$USER.$$.$RANDOM |
|
grep -v "^$1 " "$CDARGSPATH" > $tmpfile && 'mv' -f $tmpfile "$CDARGSPATH"; |
|
fi |
|
# add the alias to the list of bookmarks |
|
cdargs --add=":$1:`pwd`"; |
|
# sort the resulting list |
|
if [ "$CDARGS_SORT" ]; then |
|
sort -o "$CDARGSPATH" "$CDARGSPATH"; |
|
fi |
|
} |
|
# Oh, no! Not overwrite 'm' for stefan! This was |
|
# the very first alias I ever wrote in my un*x |
|
# carreer and will always be aliased to less... |
|
# alias m='mark' |
|
|
|
# --------------------------------------------- # |
|
# Mark the current directory with alias # |
|
# provided and store as a cdargs bookmark # |
|
# directory but do not overwrite previous # |
|
# bookmarks with same name # |
|
# # |
|
# @param string alias # |
|
# # |
|
# @access public # |
|
# @return void # |
|
# author: SKa # |
|
# --------------------------------------------- # |
|
function ca () |
|
{ |
|
# add the alias to the list of bookmarks |
|
cdargs --add=":$1:`pwd`"; |
|
} |
|
|
|
# --------------------------------------------- # |
|
# Bash programming completion for cdargs # |
|
# Sets the $COMPREPLY list for complete # |
|
# # |
|
# @param string substring of alias # |
|
# # |
|
# @access private # |
|
# @return void # |
|
# --------------------------------------------- # |
|
function _cdargs_aliases () |
|
{ |
|
local cur bookmark dir strip oldIFS |
|
COMPREPLY=() |
|
if [ -e "$CDARGSPATH" ]; then |
|
cur=${COMP_WORDS[COMP_CWORD]} |
|
if [ "$cur" != "${cur/\//}" ]; then # if at least one / |
|
bookmark="${cur/\/*/}" |
|
dir=`grep "^$bookmark " "$CDARGSPATH" | sed 's#^[^ ]* ##'` |
|
if [ -n "$dir" -a "$dir" = "${dir/ |
|
/}" -a -d "$dir" ]; then |
|
strip="${dir//?/.}" |
|
oldIFS="$IFS" |
|
IFS=' |
|
' |
|
COMPREPLY=( $( |
|
compgen -d "$dir`echo "$cur" | sed 's#^[^/]*##'`" \ |
|
| sed -e "s/^$strip/$bookmark/" -e "s/\([^\/a-zA-Z0-9#%_+\\\\,.-]\)/\\\\\\1/g" ) ) |
|
IFS="$oldIFS" |
|
fi |
|
else |
|
COMPREPLY=( $( (echo $cur ; cat "$CDARGSPATH") | \ |
|
awk 'BEGIN {first=1} |
|
{if (first) {cur=$0; l=length(cur); first=0} |
|
else if (substr($1,1,l) == cur) {print $1}}' ) ) |
|
fi |
|
fi |
|
return 0 |
|
} |
|
|
|
# --------------------------------------------- # |
|
# Bash programming completion for cdargs # |
|
# Set up completion (put in a function just so # |
|
# `nospace' can be a local variable) # |
|
# # |
|
# @param none # |
|
# # |
|
# @access private # |
|
# @return void # |
|
# --------------------------------------------- # |
|
_cdargs_complete() { |
|
local nospace= |
|
[ "${BASH_VERSINFO[0]}" -ge 3 -o \( "${BASH_VERSINFO[0]}" = 2 -a \( "${BASH_VERSINFO[1]}" = 05a -o "${BASH_VERSINFO[1]}" = 05b \) \) ] && nospace='-o nospace' |
|
complete $nospace -S / -X '*/' -F _cdargs_aliases cv cb cdb |
|
} |
|
|
|
_cdargs_complete
|
|
|