From f6c3239846da9acd6510655279d870b5b9158497 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=96=9F=E9=85=8C=20=E9=B5=AC=E5=85=84?= Date: Thu, 21 Sep 2017 16:25:23 +0800 Subject: [PATCH] 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 " [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 }