replace notdir hack
* Test entries in datafile via shell and pipe them into awk, rather than doing the test in awk.
This commit is contained in:
1 parent
771c58409b
commit
5276d4d021
1 file changed
+14
-42
@@ -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() {
|
||||
|
||||
Reference in new issue
Block a user