diff --git a/z.sh b/z.sh index 919d49f..9ef55da 100755 --- a/z.sh +++ b/z.sh @@ -40,24 +40,14 @@ _z() { # maintain the file local tempfile tempfile="$(mktemp $datafile.XXXXXX)" || return - awk -v path="$*" -v now="$(date +%s)" -v datafile="$datafile" -F"|" ' - function notdir(path, tmp) { - # faster than system() - n = gsub("/+", "/", path) - for( i = 0; i < n; i++ ) path = path "/.." - path = path datafile - if( ( getline tmp < path ) >= 0 ) { - close(path) - return 0 - } - return 1 - } + cat "$datafile" | while read line; do + [ -d "${line%%\|*}" ] && echo $line + done | awk -v path="$*" -v now="$(date +%s)" -F"|" ' BEGIN { rank[path] = 1 time[path] = now } $2 >= 1 { - if( notdir($1) ) next if( $1 == path ) { rank[$1] = $2 + 1 time[$1] = now @@ -72,7 +62,7 @@ _z() { for( i in rank ) print i "|" 0.9*rank[i] "|" time[i] # aging } else for( i in rank ) print i "|" rank[i] "|" time[i] } - ' "$datafile" 2>/dev/null >| "$tempfile" + ' 2>/dev/null >| "$tempfile" if [ $? -ne 0 -a -f "$datafile" ]; then env rm -f "$tempfile" else @@ -81,24 +71,14 @@ _z() { # tab completion elif [ "$1" = "--complete" ]; then - awk -v q="$2" -v datafile="$datafile" -F"|" ' - function notdir(path, tmp) { - # faster than system() - n = gsub("/+", "/", path) - for( i = 0; i < n; i++ ) path = path "/.." - path = path datafile - if( ( getline tmp < path ) >= 0 ) { - close(path) - return 0 - } - return 1 - } + cat "$datafile" | while read line; do + [ -d "${line%%\|*}" ] && echo $line + done | awk -v q="$2" -F"|" ' BEGIN { if( q == tolower(q) ) nocase = 1 split(substr(q,3),fnd," ") } { - if( notdir($1) ) next if( nocase ) { for( i in fnd ) tolower($1) !~ tolower(fnd[i]) && $1 = "" } else { @@ -106,7 +86,7 @@ _z() { } if( $1 ) print $1 } - ' "$datafile" 2>/dev/null + ' 2>/dev/null else # list/go @@ -130,17 +110,9 @@ _z() { [ -f "$datafile" ] || return local cd - cd="$(awk -v t="$(date +%s)" -v list="$list" -v typ="$typ" -v q="$fnd" -v datafile="$datafile" -F"|" ' - function notdir(path, tmp) { - n = gsub("/+", "/", path) - for( i = 0; i < n; i++ ) path = path "/.." - path = path datafile - if( ( getline tmp < path ) >= 0 ) { - close(path) - return 0 - } - return 1 - } + cd="$(cat "$datafile" | while read line; do + [ -d "${line%%\|*}" ] && echo $line + done | awk -v t="$(date +%s)" -v list="$list" -v typ="$typ" -v q="$fnd" -F"|" ' function frecent(rank, time) { dx = t-time if( dx < 3600 ) return rank*4 @@ -176,7 +148,6 @@ _z() { } BEGIN { split(q, a, " ") } { - if( notdir($1) ) next if( typ == "rank" ) { f = $2 } else if( typ == "recent" ) { @@ -200,7 +171,7 @@ _z() { output(wcase, cx, common(wcase)) } else if( ncx ) output(nocase, ncx, common(nocase)) } - ' "$datafile")" + ')" [ $? -gt 0 ] && return [ "$cd" ] && cd "$cd" fi @@ -213,7 +184,8 @@ if complete &> /dev/null; then complete -C '_z --complete "$COMP_LINE"' ${_Z_CMD:-z} # populate directory list. avoid clobbering other PROMPT_COMMANDs. echo $PROMPT_COMMAND | grep -q "_z --add" - [ $? -gt 0 ] && PROMPT_COMMAND='_z --add "$(pwd -P 2>/dev/null)" 2>/dev/null;'"$PROMPT_COMMAND" + #[ $? -gt 0 ] && PROMPT_COMMAND='_z --add "$(pwd -P 2>/dev/null)" 2>/dev/null;'"$PROMPT_COMMAND" + [ $? -gt 0 ] && PROMPT_COMMAND='_z --add "$(pwd 2>/dev/null)" 2>/dev/null;'"$PROMPT_COMMAND" elif compctl &> /dev/null; then # zsh tab completion _z_zsh_tab_completion() {