Extended go functionalies

This commit is contained in:
斟酌 鵬兄 2017-09-21 16:25:23 +08:00
parent 2b2d09e2ae
commit f6c3239846

View File

@ -5,21 +5,26 @@ function go() {
ARG1=$1; ARG2=$2; ARG3=$3; ARG1=$1; ARG2=$2; ARG3=$3;
if [[ -z "$ARG1" ]]; then if [[ -z "$ARG1" ]]; then
__func_head "[MODE] SITE TARGET_DIR" __func_head "[MODE] SITE TARGET_DIR [..SLICE]"
__func_help "<up|down> [MODE] TARGET_DIR" __func_help "up [MODE] TARGET_DIR"
__func_help "down [MODE] TARGET_DIR [..SLICE]"
echo echo
return 1 return 1
fi fi
NAV=false; NAV=false
case "$ARG1" in case "$ARG1" in
p) p)
shift
CC='pushd' ;; CC='pushd' ;;
c) c)
shift
CC='cd' ;; CC='cd' ;;
e) e)
shift
CC='echo' ;; CC='echo' ;;
up|down) up|down)
shift
NAV=true ;; NAV=true ;;
*) *)
CC='cd' CC='cd'
@ -29,59 +34,86 @@ function go() {
esac esac
if [ $NAV = true ]; then if [ $NAV = true ]; then
__go_nav $ARG1 $ARG2 $ARG3 __go_nav $ARG1 $@
return 0; return $?
fi fi
if [[ -f ~/.go_conf ]]; then if [[ -f ~/.go_conf ]]; then
source ~/.go_conf source ~/.go_conf
else else
echo "Cannot source config file" echo "Cannot source config file"
return 1; return 1
fi fi
SITE=$(ls $UDEV|grep -m 1 $ARG2) SITE=$( ls "$UDEV" | grep -m 1 "$ARG2" )
if [[ -z "$SITE" ]]; then if [[ -z "$SITE" ]]; then
echo "No such site: $ARG2" echo "No such site: $ARG2"
ls $UDEV -1 | sed 's/^/ /g' find "$UDEV/" -maxdepth 1 -type d | sed "s/^.\+\/\([^\/]\+\)\/\?$/ \1/g"
return 1 return 1
fi fi
if [[ -z "$ARG3" ]]; then if [[ -z "$ARG3" ]]; then
$CC $UDEV/$SITE $CC "$UDEV/$SITE"
return 0 return $?
fi fi
for LOC in ${LOCS[@]} for ((i = 0; i < ${#LOCS[@]}; i++))
do do
LOCATION=$(ls $UDEV/$SITE/$LOC/ 2> /dev/null | grep -m 1 $ARG3) LOC=${LOCS[i]}
LOCATION=$(ls -d "$UDEV/$SITE/$LOC/*$ARGS3*/" 2> /dev/null )
if [[ -n "$LOCATION" ]]; then if [[ -n "$LOCATION" ]]; then
LOCATION="$LOC/$LOCATION" LOCATION="$LOC/$LOCATION"
break; break
fi fi
done done
# shift ARG2 ARG3
shift; shift
if [[ -n "$LOCATION" ]]; then if [[ -n "$LOCATION" ]]; then
$CC $UDEV/$SITE/$LOCATION/ __dive $CC "$UDEV/$SITE/$LOCATION/" $@
return 0 return $?
else else
echo "Location '$ARG3' not found under: $SITE" __dive $CC "$UDEV/$SITE" "$ARG3" $@
return $?
fi
}
__dive() {
CC=$1
WDIR=$2
shift; shift
OIFS=$IFS
IFS="*"
PATT="*$**"
IFS=$OIFS
pushd "$WDIR" > /dev/null
DIR=$(find . -type d -path "$PATT" -print -quit | cut -c 3- )
popd > /dev/null
if [[ -z $DIR ]]; then
echo "Path: $WDIR"
echo " - Pattern not found: $PATT"
return 1 return 1
fi fi
return 1 $CC "$WDIR/$DIR"
} }
__go_nav() { __go_nav() {
ARG1=$1; ARG2=$2; ARG3=$3; ARG1=$1; ARG2=$2; ARG3=$3;
case "$ARG2" in case "$ARG2" in
p) p)
shift
CC='pushd' ;; CC='pushd' ;;
c|"") c|"")
shift
CC='cd' ;; CC='cd' ;;
e) e)
shift
CC='echo' ;; CC='echo' ;;
*) *)
CC='cd' CC='cd'
ARG3=$ARG2 ARG3=$ARG2
@ -89,39 +121,32 @@ __go_nav() {
esac esac
if [[ "$ARG1" == "up" ]]; then if [[ "$ARG1" == "up" ]]; then
OIFS=$IFS
IFS="/" read -a PWDA <<< "$(pwd)" IFS="/" read -a PWDA <<< "$(pwd)"
IFS=$OIFS
MARK=0 MARK=0
NOT_FOUND=1 S_LEN=$(( ${#PWDA[@]} - 2 ))
LISTOF='' for (( i=1; i<=$S_LEN; i++ ))
for i in "${!PWDA[@]}"
do do
STACK=${PWDA[$i]} STACK=${PWDA[$i]}
if [ -z "$STACK" ]; then if [ -z "$STACK" ]; then
continue continue
fi fi
MARK=$i
if [ -n "$ARG3" ] && [[ "$STACK" =~ "$ARG3" ]]; then if [ -n "$ARG3" ] && [[ "$STACK" =~ "$ARG3" ]]; then
unset NOT_FOUND MARK=$i
break
fi
if [[ -n "$STACK" ]]; then
LISTOF="$LISTOF\n $STACK";
fi fi
done done
if [ -z "$ARG3" ]; then if [ -z "$ARG3" ]; then
unset NOT_FOUND # Go up 1 level
MARK=$(( $MARK - 1 )) MARK=$(( ${#PWDA[@]} - 2 ))
fi fi
if [ -n "$NOT_FOUND" ]; then if [ $MARK -eq 0 ]; then
echo "No such token in up stack: $ARG3" echo "No such token in up stack: $ARG3"
echo -e $LISTOF; for (( i=1; i<=$S_LEN; i++ )); do echo " ${PWDA[$i]}"; done
echo
return 1 return 1
fi fi
@ -132,18 +157,10 @@ __go_nav() {
DIR="$DIR${PWDA[$i]}/" DIR="$DIR${PWDA[$i]}/"
done done
$CC "$DIR"
else else
if [ -z "$ARG3" ]; then shift
DIR=$(find . -maxdepth 1 -type d | head -n 2 | tail -n 1) __dive $CC . $@
else return $?
DIR=$(find . -type d -name '*'$ARG3'*')
if [[ -z $DIR ]]; then
echo "Directory not found: $ARG3"
return 1
fi
fi
fi fi
$CC $DIR
} }