about summary refs log tree commit diff
path: root/Completion/Commands/_correct_filename
diff options
context:
space:
mode:
Diffstat (limited to 'Completion/Commands/_correct_filename')
-rw-r--r--Completion/Commands/_correct_filename47
1 files changed, 40 insertions, 7 deletions
diff --git a/Completion/Commands/_correct_filename b/Completion/Commands/_correct_filename
index 582555587..27295738c 100644
--- a/Completion/Commands/_correct_filename
+++ b/Completion/Commands/_correct_filename
@@ -6,18 +6,46 @@
 #
 # 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
+local file="$PREFIX$SUFFIX" trylist tilde etilde testcmd
 integer approx max_approx=6
 
-[[ -z $WIDGET ]] && file=$1 
+if [[ -z $WIDGET ]]; then
+  file=$1
+  local IPREFIX
+else
+  (( NUMERIC > 1 )) && max_approx=$NUMERIC
+fi
+
+if [[ $file = \~*/* ]]; then
+  tilde=${file%%/*}
+  etilde=${~tilde}
+  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
 
-if [[ -e "$file" ]]; then
+# 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 -U -i "$IPREFIX" "$file"
+    compadd -QUf -i "$IPREFIX" "${file/#$etilde/$tilde}"
     [[ -n "$compstate[insert]" ]] && compstate[insert]=menu
   else
     print "$file"
@@ -26,14 +54,19 @@ if [[ -e "$file" ]]; then
 fi
 
 for (( approx = 1; approx <= max_approx; approx++ )); do
-  trylist=( (#a$approx)"$file"(N) )
+  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 -U -i "$IPREFIX" -U "${trylist[@]}"
+  compadd -QUf -i "$IPREFIX" "${trylist[@]/#$etilde/$tilde}"
   [[ -n "$compstate[insert]" ]] && compstate[insert]=menu
 else
-  print "${trylist[@]}"
+  print "$IPREFIX${^trylist[@]}"
 fi