zsh-workers
 help / color / mirror / code / Atom feed
3150ffcdbfcdf43e89fd78e3e46dd695dff3dd44 blob 1973 bytes (raw)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
 
#compdef -k complete-word \C-xC

# Function to correct a filename.  Can be used as a completion widget,
# or as a function in its own right, in which case it will print the
# corrected filename to standard output.
#
# You can adapt max_approx to the maximum number of mistakes
# which are allowed in total.
#
# If the numeric prefix is greater than 1, the maximum number of errors
# will be set to that.

# Doesn't get right special characters in the filename; should
# strip them (e.g. "foo\ bar" -> "foo bar") and then re-insert them.

emulate -LR zsh
setopt extendedglob

local file="$PREFIX$SUFFIX" trylist tilde etilde testcmd
integer approx max_approx=6

if [[ -z $WIDGET ]]; then
  file=$1
  local IPREFIX
else
  (( ${NUMERIC:-1} > 1 )) && max_approx=$NUMERIC
fi

if [[ $file = \~*/* ]]; then
  tilde=${file%%/*}
  etilde=${~tilde} 2>/dev/null
  file=${file/#$tilde/$etilde}
fi

if [[ $CURRENT -eq 1 && $file != /* ]]; then
  testcmd=1
elif [[ $file = \=* ]]; then
  [[ -n $WIDGET ]] && PREFIX="$PREFIX[2,-1]"
  IPREFIX="${IPREFIX}="
  file="$file[2,-1]"
  testcmd=1
fi

# We need the -Q's to avoid the tilde we've put back getting quoted.
if [[ -z $testcmd && -e "$file" ]] ||
  { [[ -n $testcmd ]] && whence "$file" >&/dev/null }; then
  if [[ -n $WIDGET ]]; then
    compadd -QUf -i "$IPREFIX" -I "$ISUFFIX" "${file/#$etilde/$tilde}"
    [[ -n "$compstate[insert]" ]] && compstate[insert]=menu
  else
    print "$file"
  fi
  return
fi

for (( approx = 1; approx <= max_approx; approx++ )); do
  if [[ -z $testcmd ]]; then
    trylist=( (#a$approx)"$file"(N) )
  else
    trylist=( "${(@)${(@f)$(whence -wm "(#a$approx)$file" 2>/dev/null)}%:*}" )
    [[ $file = */* ]] || trylist=(${trylist##*/})
  fi
  (( $#trylist )) && break
done
(( $#trylist )) || return 1

if [[ -n $WIDGET ]]; then
  compadd -QUf -i "$IPREFIX" -I "$ISUFFIX" "${trylist[@]/#$etilde/$tilde}"
  [[ -n "$compstate[insert]" ]] && compstate[insert]=menu
else
  print "$IPREFIX${^trylist[@]}"
fi
debug log:

solving 3150ffc ...
found 3150ffc in https://git.vuxu.org/mirror/zsh/

Code repositories for project(s) associated with this public inbox

	https://git.vuxu.org/mirror/zsh/

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).