diff options
Diffstat (limited to 'Completion')
-rw-r--r-- | Completion/Base/_first | 72 | ||||
-rw-r--r-- | Completion/Base/_subscript | 14 | ||||
-rw-r--r-- | Completion/Commands/.distfiles | 2 | ||||
-rw-r--r-- | Completion/Core/_path_files | 6 | ||||
-rw-r--r-- | Completion/Core/compdump | 13 | ||||
-rw-r--r-- | Completion/Core/compinit | 77 | ||||
-rw-r--r-- | Completion/Core/compinstall | 56 |
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 |