commit f6c3239846da9acd6510655279d870b5b9158497
| author | 斟酌 鵬兄 <tgckpg@gmail.com> |
| date | 2017-09-21T08:25:23Z |
| subject | Extended go functionalies |
commit f6c3239846da9acd6510655279d870b5b9158497
Author: 斟酌 鵬兄 <tgckpg@gmail.com>
Date: 2017-09-21T08:25:23Z
Extended go functionalies
---
bash/bashrc/sources/40_go-command | 109 ++++++++++++++++++++++----------------
1 file changed, 63 insertions(+), 46 deletions(-)
diff --git a/bash/bashrc/sources/40_go-command b/bash/bashrc/sources/40_go-command
index 7a97f83..540635f 100755
--- a/bash/bashrc/sources/40_go-command
+++ b/bash/bashrc/sources/40_go-command
@@ -5,21 +5,26 @@ function go() {
ARG1=$1; ARG2=$2; ARG3=$3;
if [[ -z "$ARG1" ]]; then
- __func_head "[MODE] SITE TARGET_DIR"
- __func_help "<up|down> [MODE] TARGET_DIR"
+ __func_head "[MODE] SITE TARGET_DIR [..SLICE]"
+ __func_help "up [MODE] TARGET_DIR"
+ __func_help "down [MODE] TARGET_DIR [..SLICE]"
echo
return 1
fi
- NAV=false;
+ NAV=false
case "$ARG1" in
p)
+ shift
CC='pushd' ;;
c)
+ shift
CC='cd' ;;
e)
+ shift
CC='echo' ;;
up|down)
+ shift
NAV=true ;;
*)
CC='cd'
@@ -29,59 +34,86 @@ function go() {
esac
if [ $NAV = true ]; then
- __go_nav $ARG1 $ARG2 $ARG3
- return 0;
+ __go_nav $ARG1 $@
+ return $?
fi
if [[ -f ~/.go_conf ]]; then
source ~/.go_conf
else
echo "Cannot source config file"
- return 1;
+ return 1
fi
- SITE=$(ls $UDEV|grep -m 1 $ARG2)
+ SITE=$( ls "$UDEV" | grep -m 1 "$ARG2" )
if [[ -z "$SITE" ]]; then
echo "No such site: $ARG2"
- ls $UDEV -1 | sed 's/^/ /g'
+ find "$UDEV/" -maxdepth 1 -type d | sed "s/^.\+\/\([^\/]\+\)\/\?$/ \1/g"
return 1
fi
if [[ -z "$ARG3" ]]; then
- $CC $UDEV/$SITE
- return 0
+ $CC "$UDEV/$SITE"
+ return $?
fi
- for LOC in ${LOCS[@]}
+ for ((i = 0; i < ${#LOCS[@]}; i++))
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
LOCATION="$LOC/$LOCATION"
- break;
+ break
fi
done
+ # shift ARG2 ARG3
+ shift; shift
+
if [[ -n "$LOCATION" ]]; then
- $CC $UDEV/$SITE/$LOCATION/
- return 0
+ __dive $CC "$UDEV/$SITE/$LOCATION/" $@
+ return $?
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
fi
- return 1
+ $CC "$WDIR/$DIR"
}
__go_nav() {
ARG1=$1; ARG2=$2; ARG3=$3;
case "$ARG2" in
p)
+ shift
CC='pushd' ;;
c|"")
+ shift
CC='cd' ;;
e)
+ shift
CC='echo' ;;
-
*)
CC='cd'
ARG3=$ARG2
@@ -89,39 +121,32 @@ __go_nav() {
esac
if [[ "$ARG1" == "up" ]]; then
+ OIFS=$IFS
IFS="/" read -a PWDA <<< "$(pwd)"
+ IFS=$OIFS
MARK=0
- NOT_FOUND=1
- LISTOF=''
- for i in "${!PWDA[@]}"
+ S_LEN=$(( ${#PWDA[@]} - 2 ))
+ for (( i=1; i<=$S_LEN; i++ ))
do
STACK=${PWDA[$i]}
if [ -z "$STACK" ]; then
continue
fi
- MARK=$i
-
if [ -n "$ARG3" ] && [[ "$STACK" =~ "$ARG3" ]]; then
- unset NOT_FOUND
- break
- fi
-
- if [[ -n "$STACK" ]]; then
- LISTOF="$LISTOF\n $STACK";
+ MARK=$i
fi
done
if [ -z "$ARG3" ]; then
- unset NOT_FOUND
- MARK=$(( $MARK - 1 ))
+ # Go up 1 level
+ MARK=$(( ${#PWDA[@]} - 2 ))
fi
- if [ -n "$NOT_FOUND" ]; then
+ if [ $MARK -eq 0 ]; then
echo "No such token in up stack: $ARG3"
- echo -e $LISTOF;
- echo
+ for (( i=1; i<=$S_LEN; i++ )); do echo " ${PWDA[$i]}"; done
return 1
fi
@@ -132,18 +157,10 @@ __go_nav() {
DIR="$DIR${PWDA[$i]}/"
done
+ $CC "$DIR"
else
- if [ -z "$ARG3" ]; then
- DIR=$(find . -maxdepth 1 -type d | head -n 2 | tail -n 1)
- else
- DIR=$(find . -type d -name '*'$ARG3'*')
- if [[ -z $DIR ]]; then
-
- echo "Directory not found: $ARG3"
- return 1
- fi
- fi
+ shift
+ __dive $CC . $@
+ return $?
fi
-
- $CC $DIR
}