mirror of
git://git.code.sf.net/p/zsh/code
synced 2025-01-01 05:16:05 +01:00
Initial revision
This commit is contained in:
parent
e8eb43fc30
commit
5d0a0edcca
3 changed files with 247 additions and 0 deletions
10
Completion/Builtins/_stat
Normal file
10
Completion/Builtins/_stat
Normal file
|
@ -0,0 +1,10 @@
|
|||
#compdef stat
|
||||
|
||||
if [[ "$words[CURRENT-1]" = -[AH] ]]; then
|
||||
compgen -A
|
||||
else
|
||||
[[ "$PREFIX[1]" = + ]] &&
|
||||
compadd - +device +inode +mode +nlink +uid +gid +rdev +size \
|
||||
+atime +mtime +ctime +blksize +block +link
|
||||
_files
|
||||
fi
|
21
Completion/Core/_menu
Normal file
21
Completion/Core/_menu
Normal file
|
@ -0,0 +1,21 @@
|
|||
#autoload
|
||||
|
||||
# This completer is an example showing how menucompletion can be
|
||||
# implemented with the new completion system.
|
||||
# Use this one before the normal _complete completer, as in:
|
||||
#
|
||||
# compconf completer=_menu:_complete
|
||||
|
||||
if [[ -n "$compstate[old_list]" ]]; then
|
||||
|
||||
# We have an old list, keep it and insert the next match.
|
||||
|
||||
compstate[old_list]=keep
|
||||
compstate[insert]=$((compstate[old_insert]+1))
|
||||
else
|
||||
# No old list, make completion insert the first match.
|
||||
|
||||
compstate[insert]=1
|
||||
fi
|
||||
|
||||
return 1
|
216
Completion/Core/compinstall
Normal file
216
Completion/Core/compinstall
Normal file
|
@ -0,0 +1,216 @@
|
|||
# This script is to be run by a user to setup the new function based
|
||||
# completion system. The functions themselves are assumed to be already
|
||||
# available in some directory; they should have been installed with the
|
||||
# the shell (except we haven't written that yet).
|
||||
#
|
||||
# Run it as a script under zsh and answer the questions.
|
||||
# You can run it as `zsh compinstall $FPATH' and it will be able to check
|
||||
# your function path for the completion functions.
|
||||
#
|
||||
# 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 instead.
|
||||
#
|
||||
# You can use this script to modify what compinstall previously
|
||||
# added to ~/.zshrc.
|
||||
#
|
||||
# It is safe to abort with ^C any time you are being prompted for
|
||||
# information; your .zshrc will not be altered.
|
||||
#
|
||||
# To do:
|
||||
# - Maybe this should be sourced, then it can check the user's current
|
||||
# setup better. But then there is a potentially horrendous option
|
||||
# setting/resetting problem. (Maybe we need another way of doing that.)
|
||||
# - Should probably offer to set different options for _approximate than
|
||||
# for _complete if both are used.
|
||||
# - Could add code for setting other completers and options.
|
||||
# - Could add keys for context-sensitive help.
|
||||
# - Probably should allow a set of directories to be added to $fpath,
|
||||
# like Core, Base, etc.
|
||||
|
||||
# In case a startup script changed options
|
||||
emulate zsh
|
||||
|
||||
[[ -n $1 ]] && FPATH=$1
|
||||
|
||||
for f in $fpath; do
|
||||
if [[ $f != . && -f $f/compinit && -f $f/compdump ]]; then
|
||||
fdir=$f
|
||||
break
|
||||
fi
|
||||
done
|
||||
|
||||
if [[ -z $fdir ]]; then
|
||||
print "Trying to find where the completion functions are..."
|
||||
if [[ $0 = */* && -f $0:h/compinit && -f $0:h/compdump ]]; then
|
||||
fdir=$0:h
|
||||
else
|
||||
# more guesses?
|
||||
print \
|
||||
"Please edit the name of the directory where the completion functions are
|
||||
installed. If they are not installed, you will need to find them in the
|
||||
Completion/* directories of the zsh distribution and install them yourself,
|
||||
or insult your system manager for incompetence."
|
||||
vared -c fdir
|
||||
while [[ ! -d ${~fdir} || ! -f ${~fdir}/compinit ||
|
||||
! -f ${~fdir}/compdump ]]; do
|
||||
print "I can't find them in that directory. Try again or abort."
|
||||
vared fdir
|
||||
done
|
||||
fi
|
||||
eval "fpath=($fdir \$fpath)"
|
||||
fdir=${fdir/#$HOME/\~}
|
||||
lines="fpath=($fdir \$fpath)\n"
|
||||
else
|
||||
print "Found completion functions in your fpath, will not alter it."
|
||||
fi
|
||||
|
||||
files=( ${^~fpath:/.}/_(|*[^~])(N:t) )
|
||||
if [[ $#files -lt 20 ]]; then
|
||||
print "
|
||||
Hmmm, completion functions seem a bit thin on the ground. There should
|
||||
be lots of files with names beginning with an underscore (_). You should
|
||||
look and see what's happened to these.
|
||||
[Hit return to continue]"
|
||||
read
|
||||
fi
|
||||
|
||||
if [[ -w ${~fdir} && ( ! -f ${~fdir}/compinit.dump ||
|
||||
-w ${~fdir}/compinit.dump ) ]]
|
||||
then
|
||||
print "
|
||||
Using standard dumpfile
|
||||
${~fdir}/compinit.dump
|
||||
to speed up initialisation.
|
||||
[Hit return to continue]"
|
||||
read
|
||||
else
|
||||
print "
|
||||
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
|
||||
$fdir/compinit.dump. Please edit a replacement."
|
||||
dumpfile='~/.compinit.dump'
|
||||
vared dumpfile
|
||||
while ! touch ${~dumpfile} >& /dev/null; do
|
||||
print "Sorry, I can't write that either. Try again."
|
||||
vared dumpfile
|
||||
done
|
||||
[[ -s $dumpfile ]] || rm -f $dumpfile
|
||||
dumpfile=" $dumpfile"
|
||||
fi
|
||||
|
||||
fdir=${fdir/#$HOME/\~}
|
||||
|
||||
lines="${lines}. $fdir/compinit -d$dumpfile\n"
|
||||
|
||||
|
||||
print "
|
||||
In addition to completion, zsh can also perform correction of the
|
||||
current word, or approximate completion, i.e. completion where the part of
|
||||
the word typed so far can be corrected; or it can try correction, then
|
||||
approximate completion if that fails. Would you like:
|
||||
0: Just ordinary completion
|
||||
C: Correction
|
||||
A: Approximate completion
|
||||
B: Both?
|
||||
Please type one of the keys above:"
|
||||
while read -k type; do
|
||||
print
|
||||
case $type in
|
||||
0*) completer=_complete
|
||||
break
|
||||
;;
|
||||
[cC]*) completer=_complete:_correct
|
||||
break
|
||||
;;
|
||||
[aA]*) completer=_complete:_approximate
|
||||
break;
|
||||
;;
|
||||
[bB]*) completer=_complete:_correct:_approximate
|
||||
break
|
||||
;;
|
||||
*) print Try again
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
lines="${lines}compconf completer=$completer"
|
||||
|
||||
|
||||
if [[ $completer = *(correct|approx)* ]]; then
|
||||
print "
|
||||
Correction and approximation will normally allow up to two errors,
|
||||
and you will be able to use a numeric prefix (e.g. <Esc>4) to allow
|
||||
more. The standard prompt is \`correct to:'. Do you want to change
|
||||
any of this? [n]"
|
||||
if read -q; then
|
||||
print "Number of errors to accept normally (0 is OK):"
|
||||
read accept
|
||||
while [[ $accept != <-> ]]; do
|
||||
read accept"?Please enter a number: "
|
||||
done
|
||||
print \
|
||||
"How would you like the numeric prefix to be treated:
|
||||
0: Not used by correction
|
||||
U: Used to given the number of errors
|
||||
I: If present, and not 1, do not perform correction?
|
||||
Please type one of the keys above:"
|
||||
while read -k type; do
|
||||
print
|
||||
case $type in
|
||||
0*) break
|
||||
;;
|
||||
[uU]*) accept="${accept}n"
|
||||
break
|
||||
;;
|
||||
[Ii]*) accept="${accept}!n"
|
||||
break
|
||||
;;
|
||||
*) print Try again
|
||||
;;
|
||||
esac
|
||||
done
|
||||
lines="$lines \\\\
|
||||
correct_accept='$accept'"
|
||||
print "
|
||||
Instead of the prompt \`correct to:', you can have no prompt, or a
|
||||
prompt of your choosing which can display the number of errors found by
|
||||
containing the string \`%e'. Do you wish to change the correction
|
||||
prompt? [n]"
|
||||
if read -q; then
|
||||
cprompt=''
|
||||
print "Edit a new prompt (may be empty):"
|
||||
vared cprompt
|
||||
lines="$lines \\\\
|
||||
correct_prompt='${cprompt//\'/\'\\\'\'}'"
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
|
||||
lines="$lines\n"
|
||||
|
||||
|
||||
startline='# The following lines were added by compinstall'
|
||||
endline='# End of lines added by compinstall'
|
||||
|
||||
ifile=${ZDOTDIR:-~}/.zshrc
|
||||
[[ -f $ifile ]] || touch $ifile
|
||||
tmpf=${TMPPPREFIX:-/tmp/zsh}compinstall$$
|
||||
|
||||
if [[ ! -w $ifile ]]; then
|
||||
print "\nI can't write to $ifile. I will leave the lines to add in
|
||||
\`$tmpf' and you must add them by hand."
|
||||
print "\n$startline\n$lines\n$endline" >$tmpf
|
||||
return 0
|
||||
fi
|
||||
|
||||
if grep $endline $ifile >& /dev/null; then
|
||||
print -- "$startline\n$lines$endline" >$tmpf
|
||||
sed -e "/^$endline/r $tmpf
|
||||
/^$startline/,/^$endline/d" $ifile >${tmpf}2 && mv ${tmpf}2 $ifile &&
|
||||
print "\nSuccesfully modified old compinstall lines in $ifile."
|
||||
rm -f $tmpf ${tmpf}2
|
||||
else
|
||||
print "\n$startline\n$lines\n$endline" >>$ifile &&
|
||||
print "\nSuccessfully appended lines to $ifile."
|
||||
fi
|
Loading…
Reference in a new issue