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
b346c4796b
commit
59c3d242d5
10 changed files with 461 additions and 0 deletions
2
Completion/Commands/_history_complete_word
Normal file
2
Completion/Commands/_history_complete_word
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
#compdef -k complete-word \e/
|
||||||
|
compgen -Q -H 0 ''
|
158
Completion/Commands/_read_comp
Normal file
158
Completion/Commands/_read_comp
Normal file
|
@ -0,0 +1,158 @@
|
||||||
|
#compdef -k complete-word \C-x\C-r
|
||||||
|
|
||||||
|
# This allows an on-the-fly choice of completions. On typing the key
|
||||||
|
# sequence given above, you will be prompted for a string of arguments. If
|
||||||
|
# this string begins with `_', it will be taken as the name of a function to
|
||||||
|
# evaluate to generate the completions; unambiguous strings in the function
|
||||||
|
# name are automatically completed.
|
||||||
|
#
|
||||||
|
# Else it is taken to be a set of arguments for compgen to generate a list
|
||||||
|
# of choices. The possibilities are the same as the flags for generating
|
||||||
|
# completions given in the zshcompctl manual page. Note the arguments are
|
||||||
|
# verbatim: include minus signs, spaces, quotes, etc.
|
||||||
|
#
|
||||||
|
# On subsequent calls, the same completion will be re-performed. To
|
||||||
|
# force a new type of completion to be read, supply a numeric argument.
|
||||||
|
#
|
||||||
|
# For example,
|
||||||
|
# % bindkey | grep rever<C-xC-r>
|
||||||
|
# Completion: -b<RET>
|
||||||
|
# % bindkey | grep reverse-menu-complete _
|
||||||
|
#
|
||||||
|
# Global variables used:
|
||||||
|
# _read_comp Last completion string read from user
|
||||||
|
|
||||||
|
emulate -L zsh
|
||||||
|
setopt extendedglob nobadpattern # xtrace promptsubst
|
||||||
|
# local PS4='%N:%i:$((#key))> '
|
||||||
|
|
||||||
|
# Took me ages to work this out. If we're not on the first global
|
||||||
|
# matcher specification, we mustn't do any I/O.
|
||||||
|
if [[ compstate[matcher] -gt 1 && -z $_read_comp ]]; then
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ compstate[matcher] -gt 1 ||
|
||||||
|
( ${+NUMERIC} = 0 && -n $_read_comp ) ]]; then
|
||||||
|
if [[ $_read_comp = _* ]]; then
|
||||||
|
eval $_read_comp
|
||||||
|
else
|
||||||
|
eval "compgen $_read_comp"
|
||||||
|
fi
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
|
||||||
|
_read_comp=
|
||||||
|
|
||||||
|
local key search str str2 newch funcs funcs2 exact msg list
|
||||||
|
integer pos
|
||||||
|
|
||||||
|
msg="Completion: "
|
||||||
|
|
||||||
|
zle -R $msg
|
||||||
|
|
||||||
|
if ! read -k key; then
|
||||||
|
zle -cR ''
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
while [[ '#key' -ne 10 && '#key' -ne 13 ]]; do
|
||||||
|
if [[ '#key' -eq 0 && '#key' -eq 3 || '#key' -eq 7 ]]; then
|
||||||
|
zle -cR ''
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
if [[ ( '#key' -eq 8 || '#key' -eq 127 ) && -n $str ]]; then
|
||||||
|
# delete character
|
||||||
|
str="$str[1,-2]"
|
||||||
|
exact=
|
||||||
|
list=()
|
||||||
|
elif [[ '#key' -eq 21 ]]; then
|
||||||
|
# ^U: delete line
|
||||||
|
str=
|
||||||
|
exact=
|
||||||
|
list=()
|
||||||
|
elif [[ '#key' -eq 4 && $str = _[^\ ]# && $str != *' '* ]]; then
|
||||||
|
# ^D: list completions
|
||||||
|
list=(${$(whence -m "$str*" 2>/dev/null)%: function})
|
||||||
|
elif [[ ( -n $exact && $key != ' ' ) || '#key & 127' -lt 32 ]]; then
|
||||||
|
# If we've got an exact function, only allow a space after it.
|
||||||
|
# Don't try to insert non-printing characters.
|
||||||
|
if [[ -n $ZBEEP ]]; then
|
||||||
|
print -nb $ZBEEP
|
||||||
|
elif [[ -o beep ]]; then
|
||||||
|
print -n "\a"
|
||||||
|
fi
|
||||||
|
list=()
|
||||||
|
else
|
||||||
|
str="$str$key"
|
||||||
|
if [[ $str = _[^\ ]# ]]; then
|
||||||
|
# Rudimentary completion for function names.
|
||||||
|
# Allow arguments, i.e. don't do this after we've got a space.
|
||||||
|
funcs=(${$(whence -m "$str*" 2>/dev/null)%: function})
|
||||||
|
if [[ -o autolist && $#str -gt 1 ]]; then
|
||||||
|
list=($funcs)
|
||||||
|
else
|
||||||
|
list=()
|
||||||
|
fi
|
||||||
|
if (( $#funcs == 1 )); then
|
||||||
|
# Exact match; prompt the user for a newline to confirm
|
||||||
|
str=$funcs[1]
|
||||||
|
exact=" (Confirm)"
|
||||||
|
elif (( $#funcs == 0 )); then
|
||||||
|
# We can't call zle beep, because this isn't a zle widget.
|
||||||
|
if [[ -n $ZBEEP ]]; then
|
||||||
|
print -nb $ZBEEP
|
||||||
|
elif [[ -o beep ]]; then
|
||||||
|
print -n "\a"
|
||||||
|
fi
|
||||||
|
str="$str[1,-2]"
|
||||||
|
list=()
|
||||||
|
else
|
||||||
|
# Add characters to the string until a name doesn't
|
||||||
|
# match any more, then backtrack one character to get
|
||||||
|
# the longest unambiguous match.
|
||||||
|
str2=$str
|
||||||
|
pos=$#str2
|
||||||
|
while true; do
|
||||||
|
(( pos++ ))
|
||||||
|
newch=${funcs[1][pos]}
|
||||||
|
[[ -z $newch ]] && break
|
||||||
|
str2=$str2$newch
|
||||||
|
funcs2=(${funcs##$str2*})
|
||||||
|
(( $#funcs2 )) && break
|
||||||
|
str=$str2
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
exact=
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
if (( $#list )); then
|
||||||
|
zle -R "$msg$str$exact" $list
|
||||||
|
else
|
||||||
|
zle -cR "$msg$str$exact"
|
||||||
|
fi
|
||||||
|
if ! read -k key; then
|
||||||
|
zle -cR ''
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
if [[ -z $str ]]; then
|
||||||
|
# string must be non-zero
|
||||||
|
return 1
|
||||||
|
elif [[ $str = _* ]] && ! whence ${str%% *} >& /dev/null; then
|
||||||
|
# a function must be known to the shell
|
||||||
|
return 1
|
||||||
|
else
|
||||||
|
# remember the string for re-use
|
||||||
|
_read_comp=$str
|
||||||
|
fi
|
||||||
|
|
||||||
|
zle -cR ''
|
||||||
|
|
||||||
|
if [[ $str = _* ]]; then
|
||||||
|
eval $str
|
||||||
|
else
|
||||||
|
eval "compgen $str"
|
||||||
|
fi
|
10
Completion/User/_use_lo
Normal file
10
Completion/User/_use_lo
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
#compdef gls gdiff
|
||||||
|
|
||||||
|
# This is for GNU-like commands which understand the --help option,
|
||||||
|
# but which do not otherwise require special completion handling.
|
||||||
|
|
||||||
|
if [[ $PREFIX = --* ]]; then
|
||||||
|
_long_options
|
||||||
|
else
|
||||||
|
_default
|
||||||
|
fi
|
47
Config/funcinst.mk
Normal file
47
Config/funcinst.mk
Normal file
|
@ -0,0 +1,47 @@
|
||||||
|
#
|
||||||
|
# Makefile definitions for installing shell functions
|
||||||
|
#
|
||||||
|
# Copyright (c) 1999 Peter Stephenson
|
||||||
|
# All rights reserved.
|
||||||
|
#
|
||||||
|
# Permission is hereby granted, without written agreement and without
|
||||||
|
# license or royalty fees, to use, copy, modify, and distribute this
|
||||||
|
# software and to distribute modified versions of this software for any
|
||||||
|
# purpose, provided that the above copyright notice and the following
|
||||||
|
# two paragraphs appear in all copies of this software.
|
||||||
|
#
|
||||||
|
# In no event shall Peter Stephenson or the Zsh Development Group be liable
|
||||||
|
# to any party for direct, indirect, special, incidental, or consequential
|
||||||
|
# damages arising out of the use of this software and its documentation,
|
||||||
|
# even if Peter Stephenson and the Zsh Development Group have been advised of
|
||||||
|
# the possibility of such damage.
|
||||||
|
#
|
||||||
|
# Peter Stephenson and the Zsh Development Group specifically disclaim any
|
||||||
|
# warranties, including, but not limited to, the implied warranties of
|
||||||
|
# merchantability and fitness for a particular purpose. The software
|
||||||
|
# provided hereunder is on an "as is" basis, and Peter Stephenson and the
|
||||||
|
# Zsh Development Group have no obligation to provide maintenance,
|
||||||
|
# support, updates, enhancements, or modifications.
|
||||||
|
#
|
||||||
|
|
||||||
|
# install functions, including those in subdirectories, creating
|
||||||
|
# install directory if necessary
|
||||||
|
|
||||||
|
install.fns:
|
||||||
|
if test x$(fndir) != x && test x$(fndir) != xno; then \
|
||||||
|
sdir_top="$(sdir_top)" fndir="$(fndir)" sdir="$(sdir)" \
|
||||||
|
FUNCTIONS_INSTALL="$(FUNCTIONS_INSTALL)" \
|
||||||
|
FUNCTIONS_SUBDIRS="$(FUNCTIONS_SUBDIRS)" \
|
||||||
|
INSTALL_DATA="$(INSTALL_DATA)" \
|
||||||
|
$(SHELL) $(sdir_top)/Config/installfns.sh || exit 1; \
|
||||||
|
fi; \
|
||||||
|
exit 0
|
||||||
|
|
||||||
|
uninstall.fns:
|
||||||
|
if test x$(fndir) != x && test x$(fndir) != xno; then \
|
||||||
|
fndir="$(fndir)" sdir="$(sdir)" \
|
||||||
|
FUNCTIONS_INSTALL="$(FUNCTIONS_INSTALL)" \
|
||||||
|
FUNCTIONS_SUBDIRS="$(FUNCTIONS_SUBDIRS)" \
|
||||||
|
$(SHELL) $(sdir_top)/Config/uninstallfns.sh || exit 1; \
|
||||||
|
fi; \
|
||||||
|
exit 0
|
48
Config/installfns.sh
Executable file
48
Config/installfns.sh
Executable file
|
@ -0,0 +1,48 @@
|
||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
if test -d $fndir.old; then
|
||||||
|
add_old=1
|
||||||
|
fi
|
||||||
|
|
||||||
|
$sdir_top/mkinstalldirs $fndir || exit 1;
|
||||||
|
|
||||||
|
# If the source directory is somewhere else, we need to force
|
||||||
|
# the shell to expand it in that directory, then strip it off.
|
||||||
|
install=
|
||||||
|
for file in $FUNCTIONS_INSTALL; do
|
||||||
|
if test -f "$sdir/$file"; then
|
||||||
|
install="$install $file"
|
||||||
|
else
|
||||||
|
install="$install `echo $sdir/$file | sed -e \"s%$sdir/%%g\"`"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
for file in $install; do
|
||||||
|
if test -f $sdir/$file; then
|
||||||
|
if test x$FUNCTIONS_SUBDIRS != x -a x$FUNCTIONS_SUBDIRS != xno; then
|
||||||
|
subfile="$file"
|
||||||
|
subdir="`echo $file | sed -e 's%/[^/]*$%%'`"
|
||||||
|
olddir="$fndir.old/$subdir"
|
||||||
|
instdir="$fndir/$subdir"
|
||||||
|
else
|
||||||
|
subfile="`echo $file | sed -e 's%^.*/%%'`"
|
||||||
|
olddir="$fndir.old"
|
||||||
|
instdir="$fndir"
|
||||||
|
fi
|
||||||
|
if test -f $fndir/$subfile; then
|
||||||
|
if cmp $fndir/$subfile $sdir/$file >/dev/null; then :; else
|
||||||
|
$sdir_top/mkinstalldirs $olddir
|
||||||
|
mv $fndir/$subfile $olddir
|
||||||
|
: ${add_old:=1}
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
$sdir_top/mkinstalldirs $instdir || exit 1
|
||||||
|
$INSTALL_DATA $sdir/$file $instdir || exit 1
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
if test x$add_old != x1; then
|
||||||
|
rm -rf $fndir.old
|
||||||
|
fi
|
||||||
|
|
||||||
|
exit 0
|
31
Config/uninstallfns.sh
Executable file
31
Config/uninstallfns.sh
Executable file
|
@ -0,0 +1,31 @@
|
||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
# If the source directory is somewhere else, we need to force
|
||||||
|
# the shell to expand it in that directory, then strip it off.
|
||||||
|
install=
|
||||||
|
for file in $FUNCTIONS_INSTALL; do
|
||||||
|
if test -f "$sdir/$file"; then
|
||||||
|
install="$install $file"
|
||||||
|
else
|
||||||
|
install="$install `echo $sdir/$file | sed -e \"s%$sdir/%%g\"`"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
for file in $install; do
|
||||||
|
if test -f $sdir/$file; then
|
||||||
|
if test x$FUNCTIONS_SUBDIRS != x -a x$FUNCTIONS_SUBDIRS != xno; then
|
||||||
|
rm -f $fndir/$file;
|
||||||
|
if test -f $fndir.old/$file; then
|
||||||
|
mv $fndir.old/$file $fndir/$file
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
bfile="`echo $file | sed -e 's%^.*/%%'`"
|
||||||
|
rm -f "$fndir/$bfile"; \
|
||||||
|
if test -f $fndir.old/$bfile; then
|
||||||
|
mv $fndir.old/$bfile $fndir/$bfile
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
exit 0
|
3
Functions/Zle/.distfiles
Normal file
3
Functions/Zle/.distfiles
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
DISTFILES_SRC='
|
||||||
|
.distfiles incremental-complete-word insert-files
|
||||||
|
'
|
89
Functions/Zle/incremental-complete-word
Normal file
89
Functions/Zle/incremental-complete-word
Normal file
|
@ -0,0 +1,89 @@
|
||||||
|
# incremental-complete-word() {
|
||||||
|
|
||||||
|
# Autoload this function, run `zle -N <func-name>' and bind <func-name>
|
||||||
|
# to a key.
|
||||||
|
|
||||||
|
# This allows incremental completion of a word. After starting this
|
||||||
|
# command, a list of completion choices is shown after every character you
|
||||||
|
# type, which you can delete with ^h or DEL. RET will accept the
|
||||||
|
# completion so far. You can hit TAB to do normal completion and ^g to
|
||||||
|
# abort back to the state when you started.
|
||||||
|
#
|
||||||
|
# Completion keys:
|
||||||
|
# incremental_prompt Prompt to show in status line during icompletion;
|
||||||
|
# the sequence `%u' is replaced by the unambiguous
|
||||||
|
# part of all matches if there is any and it is
|
||||||
|
# different from the word on the line
|
||||||
|
# incremental_stop Pattern matching keys which will cause icompletion
|
||||||
|
# to stop and the key to be re-executed
|
||||||
|
# incremental_break Pattern matching keys which will cause icompletion
|
||||||
|
# to stop and the key to be discarded
|
||||||
|
# incremental_completer Set of completers, like the `completer' key
|
||||||
|
# incremental_list If set to a non-empty string, the matches will be
|
||||||
|
# listed on every key-press
|
||||||
|
|
||||||
|
emulate -L zsh
|
||||||
|
unsetopt autolist menucomplete automenu # doesn't work well
|
||||||
|
|
||||||
|
local key lbuf="$LBUFFER" rbuf="$RBUFFER" pmpt word lastl lastr wid twid
|
||||||
|
|
||||||
|
[[ -n "$compconfig[incremental_completer]" ]] &&
|
||||||
|
set ${(s.:.)compconfig[incremental_completer]}
|
||||||
|
pmpt="${compconfig[incremental_prompt]-incremental completion...}"
|
||||||
|
|
||||||
|
if [[ -n "$compconfig[incremental_list]" ]]; then
|
||||||
|
wid=list-choices
|
||||||
|
else
|
||||||
|
wid=complete-word
|
||||||
|
fi
|
||||||
|
|
||||||
|
zle $wid "$@"
|
||||||
|
LBUFFER="$lbuf"
|
||||||
|
RBUFFER="$rbuf"
|
||||||
|
if [[ "${LBUFFER}${RBUFFER}" = *${_lastcomp[unambiguous]}* ]]; then
|
||||||
|
word=''
|
||||||
|
else
|
||||||
|
word="${_lastcomp[unambiguous]}"
|
||||||
|
fi
|
||||||
|
zle -R "${pmpt//\\%u/$word}"
|
||||||
|
read -k key
|
||||||
|
|
||||||
|
while [[ '#key' -ne '#\\r' && '#key' -ne '#\\n' &&
|
||||||
|
'#key' -ne '#\\C-g' ]]; do
|
||||||
|
twid=$wid
|
||||||
|
if [[ "$key" = ${~compconfig[incremental_stop]} ]]; then
|
||||||
|
zle -U "$key"
|
||||||
|
return
|
||||||
|
elif [[ "$key" = ${~compconfig[incremental_break]} ]]; then
|
||||||
|
return
|
||||||
|
elif [[ '#key' -eq '#\\C-h' || '#key' -eq '#\\C-?' ]]; then
|
||||||
|
[[ $#LBUFFER -gt $#l ]] && LBUFFER="$LBUFFER[1,-2]"
|
||||||
|
elif [[ '#key' -eq '#\\t' ]]; then
|
||||||
|
zle complete-word "$@"
|
||||||
|
lbuf="$LBUFFER"
|
||||||
|
rbuf="$RBUFFER"
|
||||||
|
elif [[ '#key' -eq '#\\C-d' ]]; then
|
||||||
|
twid=list-choices
|
||||||
|
else
|
||||||
|
LBUFFER="$LBUFFER$key"
|
||||||
|
fi
|
||||||
|
lastl="$LBUFFER"
|
||||||
|
lastr="$RBUFFER"
|
||||||
|
zle $twid "$@"
|
||||||
|
LBUFFER="$lastl"
|
||||||
|
RBUFFER="$lastr"
|
||||||
|
if [[ "${LBUFFER}${RBUFFER}" = *${_lastcomp[unambiguous]}* ]]; then
|
||||||
|
word=''
|
||||||
|
else
|
||||||
|
word="${_lastcomp[unambiguous]}"
|
||||||
|
fi
|
||||||
|
zle -R "${pmpt//\\%u/$word}"
|
||||||
|
read -k key
|
||||||
|
done
|
||||||
|
|
||||||
|
if [[ '#key' -eq '#\\C-g' ]]; then
|
||||||
|
LBUFFER="$lbuf"
|
||||||
|
RBUFFER="$rbuf"
|
||||||
|
fi
|
||||||
|
zle -Rc
|
||||||
|
# }
|
42
Functions/Zle/insert-files
Normal file
42
Functions/Zle/insert-files
Normal file
|
@ -0,0 +1,42 @@
|
||||||
|
# insert-files() {
|
||||||
|
|
||||||
|
# Autoload this function, run `zle -N <func-name>' and bind <func-name>
|
||||||
|
# to a key.
|
||||||
|
|
||||||
|
# This function allows you type a file pattern, and see the results of the
|
||||||
|
# expansion at each step. When you hit return, they will be inserted into
|
||||||
|
# the command line.
|
||||||
|
|
||||||
|
emulate -L zsh
|
||||||
|
setopt nobadpattern
|
||||||
|
|
||||||
|
local key str files
|
||||||
|
|
||||||
|
files=( *(N) )
|
||||||
|
if (( $#files )); then
|
||||||
|
zle -R "files: ${str}_" "$files[@]"
|
||||||
|
else
|
||||||
|
zle -R "files: ${str}_ (failed)"
|
||||||
|
fi
|
||||||
|
read -k key
|
||||||
|
while [[ '#key' -ne '#\\r' && '#key' -ne '#\\n' &&
|
||||||
|
'#key' -ne '#\\C-g' ]]; do
|
||||||
|
if [[ '#key' -eq '#\\C-h' || '#key' -eq '#\\C-?' ]]; then
|
||||||
|
[[ -n "$str" ]] && str="$str[1,-2]"
|
||||||
|
else
|
||||||
|
str="$str$key"
|
||||||
|
fi
|
||||||
|
eval "files=( \${~str}*(N) )"
|
||||||
|
if (( $#files )); then
|
||||||
|
zle -R "files: ${str}_" "$files[@]"
|
||||||
|
else
|
||||||
|
zle -R "files: ${str}_ (failed)"
|
||||||
|
fi
|
||||||
|
read -k key
|
||||||
|
done
|
||||||
|
zle -Rc
|
||||||
|
if [[ '#key' -ne '#\\C-g' && $#files -gt 0 ]]; then
|
||||||
|
[[ "$LBUFFER[-1]" = ' ' ]] || files=('' "$files[@]")
|
||||||
|
LBUFFER="$LBUFFER$files "
|
||||||
|
fi
|
||||||
|
# }
|
31
Misc/job-control-tests
Normal file
31
Misc/job-control-tests
Normal file
|
@ -0,0 +1,31 @@
|
||||||
|
# These are some tests for the job control code. The code chunks
|
||||||
|
# have to be run interactively. Some use files in the zsh distribution.
|
||||||
|
|
||||||
|
# Try
|
||||||
|
# ^Z
|
||||||
|
# fg
|
||||||
|
if true; then cat Src/builtin.c | less; fi
|
||||||
|
|
||||||
|
# Try
|
||||||
|
# ^Z
|
||||||
|
# fg
|
||||||
|
fn() {
|
||||||
|
if true; then cat Src/builtin.c | less; fi
|
||||||
|
}
|
||||||
|
fn
|
||||||
|
|
||||||
|
# Try
|
||||||
|
# ^Z
|
||||||
|
# fg
|
||||||
|
# ^C
|
||||||
|
# then
|
||||||
|
# ^Z
|
||||||
|
# bg
|
||||||
|
# kill
|
||||||
|
while true; do sed -e 's/foo/bar/' Src/builtin.c >/dev/null; done
|
||||||
|
|
||||||
|
# Try
|
||||||
|
# ^C
|
||||||
|
# ignoring the error messages from sed.
|
||||||
|
# ^Z is more of a problem since you have to catch the sed.
|
||||||
|
while true; do sed -e 's/foo/bar/' non-existent-file >/dev/null; done
|
Loading…
Reference in a new issue