about summary refs log tree commit diff
path: root/Completion
diff options
context:
space:
mode:
Diffstat (limited to 'Completion')
-rw-r--r--Completion/Base/_first72
-rw-r--r--Completion/Base/_subscript14
-rw-r--r--Completion/Commands/.distfiles2
-rw-r--r--Completion/Core/_path_files6
-rw-r--r--Completion/Core/compdump13
-rw-r--r--Completion/Core/compinit77
-rw-r--r--Completion/Core/compinstall56
7 files changed, 116 insertions, 124 deletions
diff --git a/Completion/Base/_first b/Completion/Base/_first
index 8b4da019d..655e3569f 100644
--- a/Completion/Base/_first
+++ b/Completion/Base/_first
@@ -1,63 +1,11 @@
-#compdef -first-
+#compdef -subscript-
 
-# This function is called at the very beginning before any other
-# function for a specific context.
-#
-# This just gives some examples of things you might want to do here.
-#
-#
-# If you use the vared builtin and want completion in there to act the 
-# way completion on the right hand side of assignments is done, add
-# (or un-comment) this code:
-#
-#     if [[ -n $compstate[vared] ]]; then
-#       if [[ $compstate[vared] = *\[* ]]; then
-#         # vared on an array-element
-#         compstate[parameter]=${compstate[vared]%%\[*}
-#         compstate[context]=value
-#       else
-#         # vared on a parameter, let's see if it is an array
-#         compstate[parameter]=$compstate[vared]
-#         if [[ ${(tP)compstate[vared]} = *(array|assoc)* ]]; then
-#           compstate[context]=array_value
-#         else
-#           compstate[context]=value
-#         fi
-#       fi
-#       return
-#     fi
-#
-#
-#
-# Other things you can do here is to complete different things if the
-# word on the line matches a certain pattern. This example allows
-# completion of words from the history by adding two commas at the end 
-# and hitting TAB.
-#
-#     if [[ "$PREFIX" = *,, ]]; then
-#       local max i=1
-#     
-#       PREFIX="$PREFIX[1,-2]"
-#       # If a numeric prefix is given, we use it as the number of
-#       # lines (multiplied by ten below) in the history to search.
-#       if [[ ${NUMERIC:-1} -gt 1 ]]; then
-#         max=$NUMERIC
-#         unset NUMERIC
-#       else
-#         # The default is to search the last 100 lines.
-#         max=10
-#       fi
-#       # We first search in the last ten lines, then in the last
-#       # twenty lines, and so on...
-#       while [[ i -le max ]]; do
-#         if compgen -X "%Bhistory ($n):%b" -Q -H $(( i*10 )) ''; then
-#           # We have found at least one matching word, so we switch
-#           # on menu-completion and make sure that no other
-#           # completion function is called by setting _comp_skip.
-#           compstate[insert]=menu
-#           _comp_skip=1
-#           return
-#         fi
-#         (( i++ ))
-#       done
-#     fi
+if [[ ${(Pt)${compstate[parameter]}} = assoc* ]]; then
+  if [[ "$RBUFFER" = \]* ]]; then
+    compadd -S '' - "${(@kP)${compstate[parameter]}}"
+  else
+    compadd -S ']' - "${(@kP)${compstate[parameter]}}"
+  fi
+else
+  _compalso -math-
+fi
diff --git a/Completion/Base/_subscript b/Completion/Base/_subscript
index 66d88b00c..00b2b6506 100644
--- a/Completion/Base/_subscript
+++ b/Completion/Base/_subscript
@@ -13,15 +13,15 @@ elif [[ ${(Pt)${compstate[parameter]}} = array* ]]; then
   list=()
   for i in "$ind[@]"; do
     [[ "$i" = ${PREFIX}*${SUFFIX} ]] &&
-        list=( "$list[@]" 
-	  "${(r:4:: ::):)i} $(print -D ${(P)${compstate[parameter]}[$i]})" )
+        list=( "$list[@]" "${(r:4:: ::):)i} ${(P)${compstate[parameter]}[$i]}
+)
   done
 
-  if [[ "$RBUFFER" = \]* ]]; then
-    compadd -S '' -V default -y list - "$ind[@]"
-  else
-    compadd -S ']' -V default -y list - "$ind[@]"
-  fi
+ if [[ "$RBUFFER" = \]* ]]; then
+   compadd -S '' -y list - "$ind[@]"
+ else
+   compadd -S ']' -y list - "$ind[@]"
+ fi
 else
   _compalso -math-
 fi
diff --git a/Completion/Commands/.distfiles b/Completion/Commands/.distfiles
index f79d69704..19a02ef39 100644
--- a/Completion/Commands/.distfiles
+++ b/Completion/Commands/.distfiles
@@ -1,3 +1,3 @@
 DISTFILES_SRC='
-    .distfiles _correct_filename _most_recent_file 
+    .distfiles _correct_filename _correct_word _most_recent_file 
 '
diff --git a/Completion/Core/_path_files b/Completion/Core/_path_files
index 58f343367..77365a01a 100644
--- a/Completion/Core/_path_files
+++ b/Completion/Core/_path_files
@@ -377,9 +377,9 @@ done
 exppaths=( "${(@)exppaths:#$orig}" )
 
 if [[ -n "$compconfig[path_expand]" &&
-      $#exppaths -eq 0 && nm -eq compstate[nmatches] ]]; then
-  compadd -QU -S '' "$group[@]" "$expl[@]" -i "$IPREFIX" -I "$ISUFFIX" \
-          -M 'r:|/=* r:|=*' -p "$linepath" - "${(@)exppaths}"
+      $#exppaths -ne 0 && nm -eq compstate[nmatches] ]]; then
+  compadd -U -S '' "$group[@]" "$expl[@]" -i "$IPREFIX" -I "$ISUFFIX" \
+          -p "$linepath" - "${(@)exppaths}"
 fi
 
 [[ nm -eq compstate[nmatches] ]]
diff --git a/Completion/Core/compdump b/Completion/Core/compdump
index f2729acc5..b7682bd50 100644
--- a/Completion/Core/compdump
+++ b/Completion/Core/compdump
@@ -1,4 +1,4 @@
-# This is a function to dump the definitions for new-style
+# This is a file to be sourced to dump the definitions for new-style
 # completion defined by 'compinit' in the same directory.  The output
 # should be directed into the "compinit.dump" in the same directory as
 # compinit. If you rename init, just stick .dump onto the end of whatever
@@ -9,14 +9,12 @@
 # To do this, simply remove the .dump file, start a new shell, and
 # create the .dump file as before.  Again, compinit -d handles this
 # automatically.
+#
+# It relies on KSH_ARRAYS not being set.
 
 # Print the number of files used for completion. This is used in compinit
 # to see if auto-dump should re-dump the dump-file.
 
-emulate -L zsh
-
-typeset _d_file _d_f _d_bks _d_line _d_als
-
 _d_file=${compconfig[dumpfile]-${0:h}/compinit.dump}
 
 typeset -U _d_files
@@ -24,6 +22,8 @@ _d_files=( ${^~fpath}/_(|*[^~])(N:t) )
 
 print "#files: $#_d_files" > $_d_file
 
+unset _d_files
+
 # First dump the arrays _comps and _patcomps.  The quoting hieroglyphyics
 # ensure that a single quote inside a variable is itself correctly quoted.
 
@@ -88,5 +88,4 @@ done >> $_d_file
 
 print >> $_d_file
 
-unfunction compdump
-autoload -U compdump
+unset _d_line _d_zle _d_bks _d_als _d_f _f_file
diff --git a/Completion/Core/compinit b/Completion/Core/compinit
index e078cc33c..f4aa80f21 100644
--- a/Completion/Core/compinit
+++ b/Completion/Core/compinit
@@ -41,13 +41,15 @@
 # See the file `compdump' for how to speed up initialisation.
 
 # If we got the `-d'-flag, we will automatically dump the new state (at
-# the end).  This takes the dumpfile as an argument.
-
-emulate -L zsh
-
-typeset _i_dumpfile _i_files _i_line _i_done _i_dir _i_autodump=0
-typeset _i_tag _i_file
-
+# the end).
+# `-f dir' is used to pass down the directory where this file was
+#   found.  This is necessary if functionargzero is not set.
+# If we were given an argument, this will be taken as the name of the
+# file in which to store the dump.
+
+_i_fdir=''
+_i_dumpfile=''
+_i_autodump=0
 while [[ $# -gt 0 && $1 = -[df] ]]; do
   if [[ "$1" = -d ]]; then
     _i_autodump=1
@@ -57,27 +59,56 @@ while [[ $# -gt 0 && $1 = -[df] ]]; do
       shift
     fi
   elif [[ "$1" = -f ]]; then
-    # Not used any more; use _compdir
+    # Used by compinstall to pass down directory where compinit was found
     shift
+    _i_fdir="$1"
     shift
   fi
 done
+# Get the directory if we don't have it already and we can
+if [[ -z "$_i_fdir" && -o functionargzero && $0 = */* ]]; then
+  _i_fdir=${0:h}
+fi
 
 # The associative array containing the definitions for the commands.
 # Definitions for patterns will be stored in the normal array `_patcomps'.
 
-typeset -gA _comps
+typeset -A _comps
 _patcomps=()
 
 # This is the associative array used for configuration.
 
-typeset -gA compconfig
+typeset -A compconfig
 
 # Standard initialisation for `compconfig'.
 if [[ -n $_i_dumpfile ]]; then
   # Explicitly supplied dumpfile.
   compconfig[dumpfile]="$_i_dumpfile"
+elif [[ -o functionargzero ]]; then
+  # We can deduce it from the name of this script
+  compconfig[dumpfile]="$0.dump"
+elif [[ -n $_i_fdir ]]; then
+  # We were told what directory to use.
+  compconfig[dumpfile]="$_i_fdir/compinit.dump"
 else
+  compconfig[dumpfile]=''
+fi
+
+if [[ -n $compconfig[dumpfile] ]]; then
+  # Check the file is writeable.  If it doesn't exist, the
+  # only safe way is to try and create it.
+  if [[ -f $compconfig[dumpfile] ]]; then
+    [[ -w $compconfig[dumpfile] ]] || compconfig[dumpfile]=''
+  elif touch $compconfig[dumpfile] >& /dev/null; then
+    rm -f $compconfig[dumpfile]
+  else
+    compconfig[dumpfile]=''
+  fi
+fi
+
+if [[ -z $compconfig[dumpfile] ]]; then
+  # If no dumpfile given, or it was not writeable, then use
+  # user's ZDOTDIR.
   compconfig[dumpfile]="${ZDOTDIR:-$HOME}/.zcompdump"
 fi
 
@@ -294,13 +325,15 @@ _i_files=( ${^~fpath:/.}/_(|*[^~])(N:t) )
 if [[ $#_i_files -lt 20 ]]; then
   # Too few files:  we need some more directories
   # Assume that we need to add the compinit directory to fpath.
-  if [[ -n $_compdir ]]; then
-    if [[ $_compdir = */Core ]]; then
+  if [[ -n $_i_fdir ]]; then
+    if [[ $_i_fdir = */Core ]]; then
       # Add all the Completion subdirectories
-      fpath=(${_compdir:h}/*(/) $fpath)
-    elif [[ -d $_compdir/Core ]]; then
+      fpath=(${_i_fdir:h}/*(/) $fpath)
+    elif [[ -d $_i_fdir/Core ]]; then
       # Likewise
-      fpath=(${_compdir}/*(/) $fpath)
+      fpath=(${_i_fdir}/*(/) $fpath)
+    else
+      fpath=($_i_fdir $fpath)
     fi
     _i_files=( ${^~fpath:/.}/_(|*[^~])(N:t) )
   fi
@@ -313,13 +346,9 @@ for _i_line in complete-word delete-char-or-list expand-or-complete \
   menu-expand-or-complete reverse-menu-complete; do
   zle -C $_i_line .$_i_line _main_complete
 done
-zle -la menu-select && zle -C menu-select .menu-select _main_complete
 
 _i_done=''
 
-# Make sure compdump is available, even if we aren't going to use it.
-autoload -U compdump compinstall
-
 # If we have a dump file, load it.
 
 if [[ -f "$compconfig[dumpfile]" ]]; then
@@ -328,6 +357,7 @@ if [[ -f "$compconfig[dumpfile]" ]]; then
     builtin . "$compconfig[dumpfile]"
     _i_done=yes
   fi
+  unset _i_line
 fi
 if [[ -z "$_i_done" ]]; then
   for _i_dir in $fpath; do
@@ -351,12 +381,13 @@ if [[ -z "$_i_done" ]]; then
     done
   done
 
+  unset _i_dir _i_line _i_file _i_tag
+
   # If autodumping was requested, do it now.
 
-  if [[ $_i_autodump = 1 ]]; then
-    compdump
+  if [[ -n ${_i_fdir} && $_i_autodump = 1 ]]; then
+    builtin . ${_i_fdir}/compdump
   fi
 fi
 
-unfunction compinit
-autoload -U compinit
+unset _i_files _i_initname _i_done _i_autodump _i_fdir _i_dumpfile
diff --git a/Completion/Core/compinstall b/Completion/Core/compinstall
index 255565b3f..5086cc7d2 100644
--- a/Completion/Core/compinstall
+++ b/Completion/Core/compinstall
@@ -3,7 +3,7 @@
 # available in some directory; they should have been installed with the
 # the shell (except we haven't written that yet).
 #
-# Run this script as a function and answer the questions.
+# Source this script (e.g. `. /path/compinstall') and answer the questions.
 #
 # Normally, this will alter ~/.zshrc (or wherever ZDOTDIR puts it), but you
 # can make that unwritable and it will leave the lines in a temporary file
@@ -23,13 +23,33 @@
 #  - Could add code for setting other completers and options.
 #  - Could add keys for context-sensitive help.
 
+# Save the options.  We will need to trap ^C to make sure they get
+# restored properly.
+typeset -A _ci_options
+_ci_options=($(setopt kshoptionprint;setopt))
+[[ -o kshoptionprint ]] || _ci_options[kshoptionprint]=off
+[[ -o monitor ]] && _ci_options[monitor]=on
+[[ -o zle ]] && _ci_options[zle]=on
+
+emulate zsh
+
+TRAPINT() { 
+  unsetopt ${(k)_ci_options[(R)off]}
+  setopt ${(k)_ci_options[(R)on]}
+
+  unset _ci_options _ci_f _ci_fdir _ci_files _ci_dumpfile _ci_lines
+  unset _ci_type _ci_completer _ci_accept _ci_cprompt _ci_startline
+  unset _ci_endline _ci_ifile _ci_tmpf _ci_defaults _ci_compconf _ci_warn
+  unset _ci_dtype _ci_existing _ci_line
+
+  if (( $1 )); then
+    print Aborted.
+    unfunction TRAPINT
+    return 1
+  fi
+  return 0
+}
 
-emulate -L zsh
-
-typeset _ci_options _ci_f _ci_fdir _ci_files _ci_dumpfile _ci_lines
-typeset _ci_type _ci_completer _ci_accept _ci_cprompt _ci_startline
-typeset _ci_endline _ci_ifile _ci_tmpf _ci_compconf _ci_warn
-typeset _ci_dtype _ci_existing _ci_line
 
 # Look for the defaults.
 _ci_startline='# The following lines were added by compinstall'
@@ -40,7 +60,6 @@ _ci_lines=''
 _ci_existing=''
 
 typeset -A _ci_defaults
-
 if [[ -f $_ci_ifile ]]; then
   # This assumes the lines haven't been altered by the user too much
   # after they were added.
@@ -64,12 +83,10 @@ if [[ -f $_ci_ifile ]]; then
       fi
       _ci_existing="${_ci_existing}  $_ci_line
 "
-    elif [[ $_ci_line[1] = compinit ]]; then
-      # parse the line running compinit
-      [[ $_ci_line[2] = -f ]]  && _ci_fdir=$_ci_line[3]
+    elif [[ $_ci_line[1] = . && $_ci_line[2] = */compinit ]]; then
+      # parse the line sourcing compinit
+      [[ $_ci_line[3] = -f ]]  && _ci_fdir=$_ci_line[4]
       [[ $_ci_line[-2] = -d ]] && _ci_dumpfile=$_ci_line[-1]
-    elif [[ $_ci_line[1] = _compdir=* ]]; then
-      _ci_fdir=${_ci_line[1]##_compdir=}
     elif [[ $_ci_line[1] = compconf ]]; then
       # parse a compconf component as second argument (should be completer)
       [[ $_ci_line[2] = completer=* ]] &&
@@ -77,7 +94,7 @@ if [[ -f $_ci_ifile ]]; then
       [[ $_ci_line[-1] == \\ ]] && _ci_compconf=1
       _ci_existing="${_ci_existing}$_ci_line
 "
-    elif [[ $_ci_line[1] != \#* && $_ci_line[1] != (autoload|\[\[) ]]; then
+    elif [[ $_ci_line[1] != \#* ]]; then
       if [[ -z $_ci_warn ]]; then
 	_ci_warn=1
 	print "Warning:  existing lines in compinstall setup not understood:"
@@ -149,7 +166,7 @@ fi
 # Set up the dumpfile
 _ci_dtype=existing
 if [[ -z $_ci_dumpfile ]]; then
-  _ci_dumpfile="${ZDOTDIR:-$HOME}/.zcompdump"
+  _ci_dumpfile="${_ci_fdir}/compinit.dump"
   _ci_dtype=standard
 fi
 
@@ -167,6 +184,7 @@ else
 I will force completion to dump its status, which will speed up the shell's
 start-up considerably.  However, I can't write the file I'd like to, namely
 ${_ci_dumpfile}.  Please edit a replacement."
+  _ci_dumpfile='~/.compinit.dump'
   vared _ci_dumpfile
   while ! touch ${~_ci_dumpfile} >& /dev/null; do
     print "Sorry, I can't write that either.  Try again."
@@ -175,10 +193,7 @@ ${_ci_dumpfile}.  Please edit a replacement."
   [[ -s $_ci_dumpfile ]] || rm -f $_ci_dumpfile
 fi
 
-_ci_lines="${_ci_lines}_compdir=$_ci_fdir
-[[ -z \$fpath[(r)\$_compdir] ]] && fpath=(\$_compdir \$fpath)
-autoload -U compinit
-compinit -d"
+_ci_lines="${_ci_lines}. $_ci_fdir/compinit -f $_ci_fdir -d"
 [[ $_ci_dtype != standard ]] && _ci_lines="${_ci_lines} $_ci_dumpfile"
 _ci_lines="${_ci_lines}
 "
@@ -348,7 +363,6 @@ $_ci_lines$_ci_endline" >>$_ci_ifile &&
   print "\nSuccessfully appended lines to $_ci_ifile."
 fi
 
-unfunction compinstall
-autoload -U compinstall
+TRAPINT 0
 
 return 0