1
0
Fork 0
mirror of git://git.code.sf.net/p/zsh/code synced 2025-06-13 19:58:03 +02:00

zsh-3.1.5-pws-23

This commit is contained in:
Tanaka Akira 1999-06-27 06:54:32 +00:00
parent 346825df86
commit b09922bb06
58 changed files with 740 additions and 1490 deletions

156
ChangeLog
View file

@ -1,159 +1,3 @@
1999-06-25 Peter Stephenson <pws@ibmth.difi.unipi.it>
* pws: 6857: Completion/Core/compinit,
Completion/Core/compinstall, Doc/Zsh/compsys.yo: compinit and
compinstall are now functions which unfunction and autoload
themselves. _compdir is used by compinstall to record where
it found the completion directories. compinit is now otherwise
stuck with fpath.
* pws: 6851, 6853: typeset -g doesn't locallize parameters; bug
that unset parameters were recreated global instead of at
some higher local level; handle PM_AUTOLOAD consistent with other
flags.
* Sven: 6850: Src/init.c: always generate a new pgrp for the
shell, since the parent (e.g. xterm) may not have done that
and zsh now runs programs in its own pgrp.
* Sven: 6848: Src/exec.c: don't suspend if the shell is the
only thing to suspend (or something like that).
* Sven: 6841: Src/loop.c: %_ in else branches for PS4
1999-06-24 Peter Stephenson <pws@ibmth.difi.unipi.it>
* pws: 6834: Src/glob.c, Src/hashtable.c: dyncat() changed always
to use heap memory (as it erroneously claimed); hashtable element
tablename (used for debugging) freed.
* Bart: 6830: Src/params.c: don't create the hashtable for an
assoc array on assignment unless there is something to put in it.
* Sven: 6825: Src/Zle_tricky.c: make sure path prefix and suffix
are quoted in filename completion; recalculate length of match
string.
* Sven: 6824: Src/exec.c, Src/signals.c: functions got deleted
from the process table too early for job control.
* pws: 6823: Src/exec.c, Src/utils.c: names and line numbers
of functions printed for errors during execution.
* Sven: 6822: Src/Zle/complist.c, Src/Zle/zle_tricky.c: assorted
completion fixes: crash with old completion; too many spaces
with menu inserting; too many beeps with LISTBEEP.
* Sven: 6819: Src/exec.c, Src/jobs.c, Src/signals.c: Run
jobs inside shell constructs in the same process group as the
shell itself.
* Sven: 6817: Src/Zle/comp.h, Src/Zle/complist.c,
Src/Zle/zle_tricky.c: Change ZLS_SELECT to SELECTMIN;
don't automatically switch on select widget until there are
$SELECTMIN choices.
1999-06-23 Peter Stephenson <pws@ibmth.difi.unipi.it>
* pws: 6816: Doc/Zsh/params.yo, Src/utils.c: ZBEEP parameter
gives string to output instead of beeping.
* Sven: 6815: Src/Zle/complist.c: switch off menu-select for
hidden matches.
* pws: 6814: Doc/Zsh/mod_zle.yo, Doc/Zsh/options.yo,
Doc/Zsh/zle.yo, Src/Zle/deltochar.c, Src/Zle/iwidgets.list,
Src/Zle/zle_hist.c, Src/Zle/zle_main.c, Src/Zle/zle_misc.c,
Src/Zle/zle_move.c, Src/Zle/zle_thingy.c, Src/Zle/zle_tricky.c,
Src/Zle/zle_utils.c, Src/Zle/zle_vi.c, Src/Zle/zle_word.c:
Zle determines whether to feep by the return status (except
for some inner code loops); completion widgets return 1 if
something failed in the hierarchy outside the widget function;
the -n and -N options work properly.
* pws: 6812: Src/subst.c: ${(AA)foo=}, or anything that gives
a null string after the =, creates an empty assoc array.
* pws: 6806: Completion/Core/compdump, Completion/Core/compinit,
Completion/Core/compinstall, Doc/Zsh/compsys.yo: compdump is now
a function which unfunctions itself; default dumpfile location
is now ${ZDOTDIR:-$HOME}/.zcompdump
* Sven: 6807: Src/Zle/complist.c: accept-and-menu-complete
advances the menu-select selection too.
* Sven: 6802: Src/Zle/complist.c: change some default colours
* pws: 6801: Doc/Zsh/builtins.yo, Src/builtin.c: Make emulate -L
turn on LOCAL_TRAPS, too.
* Sven: 6796: Src/Zle/zle_main.c, Src/Zle/zle_thingy.c,
Doc/Zsh/mod_zle.yo, Completion/Core/compinit: zle -la lists
all widgets, just the name; zle -la <NAME> tests if <NAME> is
defined.
* Sven: 6793: Src/Zle/complist.c, Src/Zle/zle_keymap.c,
Src/Zle/zle_main.c, Doc/Zsh/mod_complist.yo: Local keymaps can be
defined, currently only used with menu-select.
1999-06-22 Peter Stephenson <pws@ibmth.difi.unipi.it>
* Sven: 6786: Src/Zle/zle_tricky.c, Doc/Zsh/compctl.yo: only use
a range when you are after the first pattern in it.
* Sven: 6780: Src/Zle/complist.c: wasn't showinglist when it
thought it was.
* Sven: 6778: don't delete function from job tables
* pws: 6776: Doc/Makefile.in, Doc/Zsh/compsys.yo,
Doc/Zsh/mod_complist.yo: Tweakchen for menu-select patch;
also (unposted) changed name collist to complist wherever it
occurs.
* Sven: 6774, 6775: Src/Zle/collist.c, Src/Zle/comp.h,
Src/Zle/zle.h, Src/Zle/zle_main.c, Src/Zle/zle_tricky.c,
Doc/Zsh/compsys.yo, Doc/Zsh/mod_collist.yo,
Doc/Zsh/mod_compctl.yo, Doc/Zsh/mod_deltochar.yo,
Doc/Zsh/modules.yo, Completion/Core/_path_files: Improvements
for menu-select widget; ZLS_SELECT turns menu-completion
into menu-selection; key bindings more natural; highlighting
more useful
* Oliver: 6772: Src/Zle/zle_tricky.c: use the whole
command text for job completion.
1999-06-21 Peter Stephenson <pws@ibmth.difi.unipi.it>
* Sven: 6760: Src/Zle/zle_tricky.c: menucompletion displaying new
list of matches sometimes got confused.
* Sven: 6755: Src/jobs.c: status of restarted job including
current shell processes was wrong.
* Sven: 6753: Src/Zle/collist.c, Src/xmods.conf:
load collist
* Sven: 6747: Src/Zle/collist.c, Src/Zle/zle_main.c,
Src/Zle/zle_tricky.c: menu-select allows you to move
cursor to select completions; uses ma list colouring
capability.
* Sven: 6742: Src/Zle/collist.c, Src/Zle/collist.mdd,
Src/Zle/zle_main.c, Src/Zle/zle_tricky.c, Src/module.c,
Src/zsh.h, Doc/Zsh/mod_collist.yo, Doc/Zsh/mod_compctly.yo,
Doc/Zsh/mod_deltochar.yo, Doc/Zsh/modules.yo,
Util/zsh-development-guide: collist module: colour completion
lists by setting ZLS_COLOURS (or even ZLS_COLORS) variables.
* pws: 6737: Doc/Zsh/builtins.yo, Doc/Zsh/zle.yo: simplifications
suggested by Bart.
* Bart: 6732: Doc/Zsh/compsys.yo: restore missing bits of Sven's
patches (not the zle_tricky.c hunk).
* Bart: 6731: Doc/Zsh/compctl.yo: spelling correction
1999-06-20 Peter Stephenson <pws@ibmth.difi.unipi.it>
* zsh-3.1.5-pws-23 made available

View file

@ -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

View file

@ -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

View file

@ -1,3 +1,3 @@
DISTFILES_SRC='
.distfiles _correct_filename _most_recent_file
.distfiles _correct_filename _correct_word _most_recent_file
'

View file

@ -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] ]]

View file

@ -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

View file

@ -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

View file

@ -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 -L zsh
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
}
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

View file

@ -1 +0,0 @@
defs.mk

View file

@ -27,5 +27,5 @@
# This must also serve as a shell script, so do not add spaces around the
# `=' signs.
VERSION=3.1.5-pws-24
VERSION_DATE='June 26, 1999'
VERSION=3.1.5-pws-23
VERSION_DATE='June 20, 1999'

View file

@ -2,11 +2,13 @@ DISTFILES_SRC='
.cvsignore .distfiles Makefile.in
META-FAQ.yo intro.ms
version.yo zmacros.yo zman.yo ztexi.yo
zsh.yo zshbuiltins.yo zshcompctl.yo zshexpn.yo zshmisc.yo
zshmodules.yo zshoptions.yo zshparam.yo zshzle.yo
zsh.yo zshbuiltins.yo zshcompctl.yo zshcompsys.yo zshcompwid.yo
zshexpn.yo zshmisc.yo zshmodules.yo zshoptions.yo zshparam.yo
zshzftpsys.yo zshzle.yo
zsh.texi
zsh.1 zshbuiltins.1 zshcompctl.1 zshexpn.1 zshmisc.1 zshmodules.1
zshoptions.1 zshparam.1 zshzle.1 zshall.1
zsh.1 zshbuiltins.1 zshcompctl.1 zshcompsys.1 zshcompwid.1
zshexpn.1 zshmisc.1 zshmodules.1 zshoptions.1 zshparam.1
zshzftpsys.1 zshzle.1 zshall.1
'
DISTFILES_DOC='

View file

@ -56,9 +56,9 @@ Zsh/compat.yo Zsh/compctl.yo Zsh/cond.yo Zsh/exec.yo Zsh/expn.yo \
Zsh/filelist.yo Zsh/files.yo Zsh/func.yo Zsh/grammar.yo Zsh/guide.yo \
Zsh/index.yo Zsh/intro.yo Zsh/invoke.yo Zsh/jobs.yo Zsh/metafaq.yo \
Zsh/modules.yo Zsh/mod_cap.yo Zsh/compwid.yo Zsh/compsys.yo \
Zsh/mod_clone.yo Zsh/mod_comp1.yo Zsh/mod_compctl.yo Zsh/mod_complist.yo \
Zsh/mod_deltochar.yo Zsh/mod_example.yo Zsh/mod_files.yo \
Zsh/mod_mapfile.yo Zsh/mod_stat.yo Zsh/mod_zle.yo Zsh/options.yo \
Zsh/mod_clone.yo Zsh/mod_comp1.yo Zsh/mod_compctl.yo Zsh/mod_deltochar.yo \
Zsh/mod_example.yo Zsh/mod_files.yo Zsh/mod_mapfile.yo Zsh/mod_stat.yo \
Zsh/mod_zle.yo Zsh/options.yo \
Zsh/params.yo Zsh/prompt.yo Zsh/redirect.yo Zsh/restricted.yo \
Zsh/seealso.yo Zsh/zftpsys.yo Zsh/zle.yo
@ -131,10 +131,9 @@ zshmisc.1: Zsh/grammar.yo Zsh/redirect.yo Zsh/exec.yo Zsh/func.yo \
Zsh/prompt.yo Zsh/restricted.yo
zshmodules.1: Zsh/modules.yo Zsh/mod_cap.yo Zsh/mod_clone.yo \
Zsh/mod_comp1.yo Zsh/mod_complist.yo Zsh/mod_compctl.yo \
Zsh/mod_deltochar.yo Zsh/mod_example.yo Zsh/mod_files.yo \
Zsh/mod_mapfile.yo Zsh/mod_sched.yo Zsh/mod_stat.yo \
Zsh/mod_zftp.yo Zsh/mod_zle.yo
Zsh/mod_comp1.yo Zsh/mod_compctl.yo Zsh/mod_deltochar.yo \
Zsh/mod_example.yo Zsh/mod_files.yo Zsh/mod_mapfile.yo \
Zsh/mod_sched.yo Zsh/mod_stat.yo Zsh/mod_zftp.yo Zsh/mod_zle.yo
zshoptions.1: Zsh/options.yo

View file

@ -3,7 +3,7 @@ DISTFILES_SRC='
arith.yo builtins.yo compat.yo compctl.yo compsys.yo compwid.yo
cond.yo exec.yo expn.yo filelist.yo files.yo func.yo grammar.yo
guide.yo index.yo intro.yo invoke.yo jobs.yo metafaq.yo
mod_cap.yo mod_clone.yo mod_comp1.yo mod_complist.yo
mod_cap.yo mod_clone.yo mod_comp1.yo
mod_compctl.yo mod_deltochar.yo mod_example.yo mod_files.yo
mod_mapfile.yo mod_parameter.yo mod_sched.yo mod_stat.yo
mod_zftp.yo mod_zle.yo

View file

@ -224,11 +224,10 @@ are reset to their default value corresponding to the specified emulation
mode, except for certain options describing the interactive
environment; otherwise, only those options likely to cause portability
problems in scripts and functions are altered. If the tt(-L) option
is given, the options tt(LOCAL_OPTIONS) and tt(LOCAL_TRAPS) will be set as
well, causing the effects of the tt(emulate) command and any tt(setopt) and
tt(trap) commands to be local to the immediately surrounding shell
function, if any; normally these options are turned off in all emulation
modes except tt(ksh).
is given, the option tt(LOCAL_OPTIONS) will be set as well, causing
the effect of the tt(emulate) command to be local to the immediately
surrounding shell function, if any; normally this is turned off in all
emulation modes except tt(ksh).
)
findex(enable)
cindex(enabling commands)
@ -264,7 +263,8 @@ findex(export)
item(tt(export) [ var(name)[tt(=)var(value)] ... ])(
The specified var(name)s are marked for automatic export
to the environment of subsequently executed commands.
Equivalent to tt(typeset -gx).
Equivalent to tt(typeset -x), except that no parameter will be created
to hide an existing one in an outer scope.
If a parameter specified does not
already exist, it is created in the global scope.
)
@ -428,7 +428,7 @@ added by explicit specification. If has no effect if used with tt(-f).
)
alias(history)(fc -l)
findex(integer)
item(tt(integer) [ {tt(PLUS())|tt(-)}tt(glrtux) ] [ var(name)[tt(=)var(value)] ... ])(
item(tt(integer) [ {tt(PLUS())|tt(-)}tt(lrtux) ] [ var(name)[tt(=)var(value)] ... ])(
Equivalent to tt(typeset -i), except that options irrelevant to
integers are not permitted.
)
@ -522,7 +522,7 @@ endsitem()
)
findex(local)
item(tt(local) [ {tt(PLUS())|tt(-)}tt(ALRUZailrtu) [var(n)]] [ var(name)[tt(=)var(value)] ] ...)(
Same as tt(typeset), except that the options tt(-g), tt(-x) and
Same as tt(typeset), except that the options tt(-x) and
tt(-f) are not permitted.
)
findex(log)
@ -682,13 +682,15 @@ Read only one character from the terminal and set var(name) to
With this flag set the return value is zero only if the character was
`tt(y)' or `tt(Y)'. Note that this always reads from the terminal, even
if used with the tt(-p) or tt(-u) or tt(-z) flags or with redirected input.
This option may also be used within zle widgets.
May be called from a zle widget, in which case it will use zle to retrieve
a key.
)
item(tt(-k) [ var(num) ])(
Read only one (or var(num)) characters. All are assigned to the first
var(name), without word splitting. This flag is ignored when tt(-q) is
present. Input is read from the terminal unless one of tt(-u) or tt(-p)
is present. This option may also be used within zle widgets.
is present. May be called from a zle widget with no tt(-u)
or tt(-p) argument, in which case it will use zle to retrieve a key.
)
item(tt(-z))(
Read one entry from the editor buffer stack and assign it to the first
@ -903,7 +905,7 @@ Equivalent to tt(whence -v).
findex(typeset)
cindex(parameters, setting)
cindex(parameters, declaring)
xitem(tt(typeset) [ {tt(PLUS())|tt(-)}tt(ALRUZafgilrtuxm) [var(n)]] [ \
xitem(tt(typeset) [ {tt(PLUS())|tt(-)}tt(ALRUZafilrtuxm) [var(n)]] [ \
var(name)[tt(=)var(value)] ... ])
item(tt(typeset) -T [ {tt(PLUS()|tt(-))}tt(LRUZrux) ] \
var(SCALAR)[tt(=)var(value)] var(array))(
@ -942,14 +944,6 @@ to var(array) sets it to be a single-element array. Note that
both tt(typeset -xT ...) and tt(export -T ...) work, but only the
scalar will be marked for export.
The flag tt(-g) (global) flag is treated specially: it means that any
resulting parameter will not be restricted to local scope. Note that this
does not necessarily mean that the parameter will be global, as the flag
will apply to any existing parameter (even if unset) from an enclosing
function. This flag does not affect the parameter after creation, hence it
has no effect when listing existing parameters, nor does the flag tt(+g)
have any effect.
If no var(name) is present, the names and values of all parameters are
printed. In this case the attribute flags restrict the display to
only those parameters that have the specified attributes. Using
@ -1198,7 +1192,6 @@ findex(zmodload)
cindex(modules, loading)
cindex(loading modules)
xitem(tt(zmodload) [ tt(-dL) ] [ ... ])
xitem(tt(zmodload -e) [ ... ])
xitem(tt(zmodload) [ tt(-a) [ tt(-bcp) [ tt(-I) ] ] ] [ tt(-iL) ] ...)
item(tt(zmodload) tt(-u) [ tt(-abcdp) [ tt(-I) ] ] [ tt(-iL) ] ...)(
tt(zmodload) performs operations relating to zsh's loadable modules.
@ -1294,21 +1287,6 @@ xitem(tt(zmodload) tt(-a) [ tt(-i) ] var(name) [ var(builtin) ... ])
item(tt(zmodload) tt(-ua) [ tt(-i) ] var(builtin) ...)(
Equivalent to tt(-ab) and tt(-ub).
)
item(tt(zmodload -e) [ var(string) ... ])(
The tt(-e) option without arguments lists all modules loaded or linked
into the shell. With arguments only the return status is set to zero
if all var(string)s given as arguments are names of modules loaded or
linked in and to one if at least on var(string) is not the name of a
module loaded or linked. This can be used to test for the availability
of things implemented by modules.
)
enditem()
In a shell without dynamic loading only the tt(-e) option is
supported. In such a shell the return status of tt(zmodload) without
arguments or options is one whereas in a shell with dynamic loading
the return status without arguments or options is always zero. This
can be used to test if the shell supports dynamic loading of modules
or not.
enditem()
)
enditem()

View file

@ -13,7 +13,7 @@ tt(compctl) command.
)\
ifnzman(\
sect(Types of completion)
This version of zsh has two ways of performing completion of words on the
This version of zsh has two ways of performing completino of words on the
command line. New users of the shell may prefer to use the newer
and more powerful system based on shell functions; this is described
in noderef(Completion System), and the basic shell mechanisms which support
@ -633,8 +633,7 @@ var(max) inclusive.
)
item(tt(r[)var(str1)tt(,)var(str2)tt(])...)(
Matches if the cursor is after a word with prefix var(str1). If there
is also a word with prefix var(str2) on the command line after the one
matched by var(str1) it matches
is also a word with prefix var(str2) on the command line it matches
only if the cursor is before this word. If the comma and var(str2) are
omitted, it matches if the cursor is after a word with prefix var(str1).
)

View file

@ -49,7 +49,7 @@ endmenu()
texinode(Initialization)(Control Functions)()(Completion System)
sect(Initialization)
The function tt(compinstall) can be run by a user to set up the completion
The script tt(compinstall) can be run by a user to set up the completion
system for use. It will usually insert code into tt(.zshrc), although if
that is not writable it will save it in another file and tell you that
file's locations. Note that it is up to you to make sure that the lines
@ -62,10 +62,10 @@ this section by hand is likely to be lost if you rerun tt(compinstall).
The new code will take effect next time you start the shell, or run
tt(.zshrc) by hand.
To run it, you will need to make sure it is in a directory mentioned in your
tt($fpath) parameter, and that it is autoloaded (`tt(autoload -U
compinstall)' is recommended). It will ask you various questions about how
you would like completion set up. It is in two parts; the basic part
You can run it as `tt(source )var(<path>)tt(/compinstall)' or
`tt(. )var(<path>)tt(/compinstall)', where var(<path>) is where the
completion functions are stored. It will ask you various questions about
how you would like completion set up. It is in two parts; the basic part
locates the completion files and decides where to put your personal
dumpfile, used to speed up initialization after the first time. After
that, you will be asked if you wish to go on to the advanced set-up; if you
@ -86,24 +86,30 @@ This section describes the use of tt(compinit) to initialize completion for
the current session when run directly by the user; if you have run
tt(compinstall) it will be called automatically from your tt(.zshrc).
To initialize the system, the function tt(compinit) should be in a
directory mentioned in the tt($fpath) variable, and should be autoloaded
(`tt(autoload -U compinit)' is recommended). When run, it will define a
few utility functions, arrange for all the necessary shell functions to be
autoloaded, and will then re-bind all keys that do completion to use the
new system.
To initialize the system, the script tt(compinit) should be sourced with
`tt(source )var(<path>)tt(/compinit)' or
`tt(. )var(<path>)tt(/compinit)'. This will define a few utility functions,
arrange for all the necessary shell functions to be autoloaded, and will
then re-bind all keys that do completion to use the new system.
To speed up the running of tt(compinit), it can be made to produce a dumped
configuration which will be read in on future invocations. The easiest way
to do this is by adding the option tt(-d) whenever tt(compinit) is run.
In this case the dumped file is tt(.zcompdump) in the same directory as the
startup files (i.e. tt($ZDOTDIR) or tt($HOME)); alternatively, an explicit
file name can be given following the tt(-d). On the next call to
tt(compinit -d), the dumped file will be read instead.
to do this is by adding the option tt(-d) whenever tt(compinit) is sourced.
In this case the dumped file will have the same name as the sourced file,
but with tt(.dump) appended to the end, or, if that is not writable by the
user, the file tt(.zcompdump) in the same directory as the startup files
(i.e. tt($ZDOTDIR) or tt($HOME)); alternatively, an explicit file name can
be given following the tt(-d). On the next call to tt(compinit -d), the
dumped file will be read instead.
If the parameter tt(_compdir) is set, tt(compinit) uses it has a directory
where completion functions can be found; this is only necessary if they are
not already in the function search path.
The other option accepted by tt(compinit) is tt(-f )var(dir), which gives
the directory in which tt(compinit) resides. If you source tt(compinit) by
its full pathname, and the option tt(FUNCTION_ARGZERO) is set, as it is by
default unless tt(zsh) is emulating tt(sh) or tt(ksh), this is unnecessary
as tt(compinit) can deduce the directory for itself. It is used in two
ways: to find the program tt(compdump) used by the tt(-d) option, and to
check if the directory should be added to the function search path to find
the completion functions (see below).
If the number of completion files changes, tt(compinit) will recognise this
and produce a new dump file. However, if the name of a function or the
@ -111,30 +117,27 @@ arguments in the first line of a tt(#compdef) function (as described below)
change, it is easiest to delete the dump file by hand so that the next time
tt(compinit) will re-create it.
The dumping is actually done by another function, tt(compdump), but you
will only need to run this yourself if you change the configuration
The dumping is actually done by another script, tt(compdump), but you will
only need to source this yourself if you change the configuration
(e.g. using tt(compdef)) and then want to dump the new one. The name of
the old dumped file will be remembered for this purpose.
the old dumped file will be remembered for this.
subsect(Autoloaded files)
The convention for autoloaded functions used in completion is that they
start with an underscore; as already mentioned, the tt(fpath/FPATH)
parameter must contain the directory in which they are stored. If tt(zsh)
was properly installed on your system, then tt(fpath/FPATH) automatically
contains the required directories.
For incomplete installations, if tt(compinit) does not find enough files
beginning with an underscore (fewer than twenty) in the search path, it
will try to find more by adding the directory tt(_compdir) to the search
path; if you have run tt(compinstall), this will be set automatically.
parameter must contain the directory in which they are stored. If
tt(compinit) does not find enough files beginning with an underscore (fewer
than twenty) in the search path, it will try to find more by adding its own
directory to the search path. If you keep all the completion files in this
directory, this means you never have to alter tt(fpath/FPATH) yourself.
Furthermore, if the directory in question ends in the path segment
tt(Core), or has a subdirectory named tt(Core), tt(compinit) will add all
subdirectories of the directory where tt(Core) is to the path: this allows
the functions to be in the same format as in the tt(zsh) source
distribution.
When tt(compinit) is run, it searches all such files accessible via
When tt(compinit) is sourced, it searches all such files accessible via
tt(fpath/FPATH) and reads the first line of each of them. This line should
contain one of the tags described below. Files whose first line does not
start with one of these tags are not considered to be part of the
@ -162,11 +165,7 @@ var(key-sequences). It creates a widget behaving like the builtin widget
var(style), which must be one of those that perform completion, namely
tt(complete-word), tt(delete-char-or-list), tt(expand-or-complete),
tt(expand-or-complete-prefix), tt(list-choices), tt(menu-complete),
tt(menu-expand-or-complete), or tt(reverse-menu-complete). If the
tt(complist) module is loaded (see
ifzman(zmanref(zshmodules))\
ifnzman(noderef(The complist Module))\
), the tt(menu-select) widget can be used, too.
tt(menu-expand-or-complete), or tt(reverse-menu-complete).
The widget is then bound to all the var(key-sequences) given, if any: when
one of the var(key-sequences) is typed, the function in the file will
@ -475,12 +474,6 @@ configuration key tt(match_original) has a value of `tt(only)', no
`tt(*)' will be inserted. If tt(match_original) has any other non-empty
string as its value, this completer will first try to generate matches
without, then with a `tt(*)' inserted at the cursor position.
The generated matches will be offered in a menucompletion unless the
tt(match_insert) configuration key is set to a string starting with
`tt(unambig)'. In this case menucompletion will only be started if no
unambiguous string could be generated that is at least as long as the
original string.
)
item(tt(_expand))(
This completer function does not really do completion, but instead
@ -714,13 +707,10 @@ These functions also accept the `tt(-J)', `tt(-V)', `tt(-X)', `tt(-P)',
`tt(-S)', `tt(-q)', `tt(-r)', and `tt(-R)' options from the
tt(compadd) builtin.
Finally, the tt(_path_files) function supports two configuration keys.
If tt(path_expand) is set to any non-empty string, the partially
Finally, the tt(_path_files) function supports one configuration key:
tt(path_expand). If this is set to any non-empty string, the partially
typed path from the line will be expanded as far as possible even if
trailing pathname components can not be completed. And if
tt(path_cursor) is set to a non-empty string, the cursor will be left
after the first ambiguous pathname component even when menucompletion
is used.
trailing pathname components can not be completed.
)
item(tt(_parameters))(
This should be used to complete parameter names if you need some of the

View file

@ -1,4 +1,4 @@
texinode(The compctl Module)(The complist Module)(The comp1 Module)(Zsh Modules)
texinode(The compctl Module)(The deltochar Module)(The comp1 Module)(Zsh Modules)
sect(The compctl Module)
The tt(compctl) module makes available several builtin commands. tt(compctl),
is the standard way to control completions for ZLE. See

View file

@ -1,4 +1,4 @@
texinode(The deltochar Module)(The example Module)(The complist Module)(Zsh Modules)
texinode(The deltochar Module)(The example Module)(The compctl Module)(Zsh Modules)
sect(The deltochar Module)
The tt(deltochar) module makes available one ZLE function:

View file

@ -161,7 +161,7 @@ cindex(widgets, calling)
cindex(calling widgets)
cindex(widgets, defining)
cindex(defining widgets)
xitem(tt(zle) tt(-l) [ tt(-L) ] [ tt(-a) ] [ var(string) ... ])
xitem(tt(zle) tt(-l) [ tt(-L) ])
xitem(tt(zle) tt(-D) var(widget) ...)
xitem(tt(zle) tt(-A) var(old-widget) var(new-widget))
xitem(tt(zle) tt(-N) var(widget) [ var(function) ])
@ -176,15 +176,7 @@ item(tt(-l) [ tt(-L) ])(
List all existing user-defined widgets. If the tt(-L)
option is used, list in the form of tt(zle)
commands to create the widgets.
When combined with the tt(-a) option, all widget names are listed,
including the builtin ones. In this case the tt(-L) option is ignored.
If at least one var(string) is given, nothing will be printed but the
return status will be zero if all var(string)s are names of existing
widgets (or of user-defined widgets if the tt(-a) flag is not given)
and non-zero if at least one var(string) is not a name of an defined
widget.
Built-in widgets are not listed.
)
item(tt(-D) var(widget) ...)(
Delete the named var(widget)s.
@ -242,12 +234,7 @@ them.
The return status reflects the success or failure of the operation carried
out by the widget, or if it is a user-defined widget the return status of
the shell function.
A non-zero return status causes the shell to beep when the widget exits,
unless the tt(BEEP) options was unset or the widget was called via the
tt(zle) command. Thus if a user defined widget requires an immediate beep,
it should call the tt(beep) widget directly.
the shell function.
)
enditem()
)

View file

@ -22,9 +22,6 @@ item(tt(compctl))(
The tt(compctl) builtin for controlling completion and the builtins for
completion widgets.
)
item(tt(complist))(
Completion listing extensions.
)
item(tt(deltochar))(
A ZLE function duplicating EMACS' tt(zap-to-char).
)
@ -58,7 +55,6 @@ menu(The cap Module)
menu(The clone Module)
menu(The comp1 Module)
menu(The compctl Module)
menu(The complist Module)
menu(The deltochar Module)
menu(The example Module)
menu(The files Module)
@ -73,7 +69,6 @@ includefile(Zsh/mod_cap.yo)
includefile(Zsh/mod_clone.yo)
includefile(Zsh/mod_comp1.yo)
includefile(Zsh/mod_compctl.yo)
includefile(Zsh/mod_complist.yo)
includefile(Zsh/mod_deltochar.yo)
includefile(Zsh/mod_example.yo)
includefile(Zsh/mod_files.yo)

View file

@ -557,10 +557,7 @@ pindex(LIST_BEEP)
cindex(beep, ambiguous completion)
cindex(completion, beep on ambiguous)
item(tt(LIST_BEEP))(
Beep on an ambiguous completion. More accurately, this forces the
completion widgets to return status 1 on an ambiguous completion, which
causes the shell to beep if the option tt(BEEP) is also set; this may
be modified if completion is called from a user-defined widget.
Beep on an ambiguous completion.
)
pindex(LIST_TYPES)
cindex(marking file types)

View file

@ -858,19 +858,6 @@ item(tt(WORDCHARS) <S>)(
A list of non-alphanumeric characters considered part of a word
by the line editor.
)
vindex(ZBEEP)
item(tt(ZBEEP))(
If set, this gives a string of characters, which can use all the same codes
as the tt(bindkey) command as described in
ifzman(zmanref(zshzle))\
ifnzman(noderef(Zsh Line Editor))\
, that will be output to the terminal
instead of beeping. This may have a visible instead of an audible effect;
for example, the string `tt(\e[?5h\e[?5l)' on a vt100 or xterm will have
the effect of flashing reverse video on and off (if you usually use reverse
video, you should use the string `tt(\e[?5l\e[?5h)' instead). This takes
precedence over the tt(NOBEEP) option.
)
vindex(ZDOTDIR)
item(tt(ZDOTDIR))(
The directory to search for shell startup files (.zshrc, etc),

View file

@ -103,7 +103,8 @@ User-defined widgets, being implemented as shell functions,
can execute any normal shell command. They can also run other widgets
(whether built-in or user-defined) using the tt(zle) builtin command.
They can use tt(read -k) or tt(read -q) to read characters from standard
input. Finally, they can examine and edit the ZLE buffer being edited by
input, which will use the appropriate tt(zle) key input mechanism.
Finally, they can examine and edit the ZLE buffer being edited by
reading and setting the special parameters described below.
cindex(parameters, editor)
@ -956,10 +957,6 @@ item(tt(accept-line-and-down-history) (^O) (unbound) (unbound))(
Execute the current line, and push the next history
event on the the buffer stack.
)
tindex(beep)
item(tt(beep))(
Beep, unless the tt(BEEP) option is unset.
)
tindex(vi-cmd-mode)
item(tt(vi-cmd-mode) (^X^V) (unbound) (^[))(
Enter command mode; that is, select the `tt(vicmd)' keymap.

View file

@ -0,0 +1,3 @@
manpage(ZSHZFTPSYS)(1)(date())(zsh version())
manpagename(zshzftpsys)(zftp function front-end)
includefile(Zsh/zftpsys.yo)

View file

@ -49,11 +49,22 @@ description(
mydit(Archive-Name:) unix-faq/shell/zsh
mydit(Last-Modified:) 1999/05/24
mydit(Submitted-By:) email(pws@ibmth.df.unipi.it (Peter Stephenson))
mydit(Version:) $Id: FAQ.yo,v 1.1.1.5 1999/06/27 05:33:49 akr Exp $
mydit(Version:) $Id: FAQ.yo,v 1.1.1.6 1999/06/27 06:54:50 akr Exp $
mydit(Posting-Frequency:) Monthly
mydit(Copyright:) (C) P.W. Stephenson, 1995--1999 (see end of document)
)
bf(Changes since issue posted April 1999:)
description(
mydit(*.*) Orthography for option names standardised.
mydit(1.4) don't change config.h.in, change acconfig.h
mydit(1.6) email zefram@zsh.org
mydit(2.4) new widget version of tcsh run-fg-editor
mydit(3.7) should have mentioned tt(PRINT_EIGHT_BIT) is new in 3.1
mydit(3.23) new: describe tt(PROMPT_CR) option.
mydit(5.1) Description of tt(LIST_AMBIGUOUS) corrected.
)
This document contains a list of frequently-asked (or otherwise
significant) questions concerning the Z-shell, a command interpreter
for many UNIX systems which is freely available to anyone with FTP
@ -114,7 +125,6 @@ Chapter 3: How to get various things to work
3.21. Why is my history not being saved?
3.22. How do I get a variable's value to be evaluated as another variable?
3.23. How do I prevent the prompt overwriting output when there is no newline?
3.24. What's wrong with cut and paste on my xterm?
Chapter 4: The mysteries of completion
4.1. What is completion?
@ -299,11 +309,11 @@ sect(What's the latest version?)
list of incompatibilities at the end of link(5.1)(51). This is longer
than usual due to enhanced sh, ksh and POSIX compatibility.
The beta version 3.1.5 is also available, and 3.1.6 should appear over
the summer. Development of zsh is usually patch by patch, with each
intermediate version publicly available. Note that this `open'
development system does mean bugs are sometimes introduced into the most
recent archived version. These are usually fixed quickly.
The beta version 3.1.5 is also available. Development of zsh is
usually patch by patch, with each intermediate version publicly
available. Note that this `open' development system does mean bugs
are sometimes introduced into the most recent archived version.
These are usually fixed quickly.
Note also that as the shell changes, it may become incompatible with
older versions; see the end of question link(5.1)(51) for a partial list.
@ -316,20 +326,17 @@ sect(What's the latest version?)
sect(Where do I get it?)
label(16)
The coordinator of development is currently me; the alias
email(coordinator@zsh.org) can be used to contact whoever is in the hot
seat. The following are known mirrors (kept frequently up to date); the
The archive is now run by email(Andrew Main <zefram@zsh.org>).
The following are known mirrors (kept frequently up to date); the
first is the official archive site, currently in Australia. All are
available by anonymous FTP. The major sites keep test versions in the
`testing' subdirectory: such up-to-the-minute development versions should
only be retrieved if you actually plan to help test the latest version of
the shell. The following list also appears on the WWW at
url(http://www.zsh.org)(http://www.zsh.org) .
available by anonymous FTP. The major sites keep test versions in
the 'testing' subdirectory: such up-to-the-minute development
versions should only be retrieved if you actually plan to help test
the latest version of the shell. The following list also appears
on the WWW at url(http://www.zsh.org)(http://www.zsh.org) .
description(
mydit(Home site) url(ftp://ftp.zsh.org)(ftp://ftp.zsh.org)
mydit() url(http://www.zsh.org/pub/zsh/)
(http://www.zsh.org/pub/zsh/)
mydit(Australia) url(ftp://ftp.ips.gov.au/mirror/zsh/)
(ftp://ftp.ips.gov.au/mirror/zsh/)
mydit(Denmark) url(ftp://sunsite.auc.dk/pub/unix/shells/zsh)
@ -347,9 +354,7 @@ label(16)
mydit(Hungary) url(ftp://ftp.cs.elte.hu/pub/zsh/)
(ftp://ftp.cs.elte.hu/pub/zsh/)
mydit() (also url(http://www.cs.elte.hu/pub/zsh/)
(http://www.cs.elte.hu/pub/zsh/) )
mydit() url(ftp://ftp.kfki.hu/pub/packages/zsh/)
(ftp://ftp.kfki.hu/pub/packages/zsh/)
(http://www.cs.elte.hu/pub/zsh/) )
mydit(Israel) \
url(ftp://ftp.math.technion.ac.il/mirror/ftp.zsh.org/pub/zsh/)
(ftp://ftp.math.technion.ac.il/mirror/ftp.zsh.org/pub/zsh/)
@ -358,7 +363,7 @@ url(http://www.math.technion.ac.il/mirror/ftp.zsh.org/pub/zsh/)
(http://www.math.technion.ac.il/mirror/ftp.zsh.org/pub/zsh/)
mydit(Japan) url(ftp://ftp.tohoku.ac.jp/mirror/zsh/)
(ftp://ftp.tohoku.ac.jp/mirror/zsh/)
mydit() url(ftp://ftp.nisiq.net/pub/shells/zsh/)
mydit() url(ftp://ftp.nis.co.jp/pub/shells/zsh/)
(ftp://ftp.nis.co.jp/pub/shells/zsh/)
mydit() url(ftp://ftp.win.ne.jp/pub/shell/zsh/)
(ftp://ftp.win.ne.jp/pub/shell/zsh/)
@ -373,8 +378,8 @@ url(http://www.math.technion.ac.il/mirror/ftp.zsh.org/pub/zsh/)
mydit(UK) url(ftp://ftp.net.lut.ac.uk/zsh/)
(ftp://ftp.net.lut.ac.uk/zsh/)
mydit() (also by FSP at port 21)
mydit() url(ftp://sunsite.org.uk/packages/zsh/)
(ftp://sunsite.org.uk/packages/zsh/)
mydit() url(ftp://src.doc.ic.ac.uk/packages/unix/shells/zsh/)
(ftp://src.doc.ic.ac.uk/packages/unix/shells/zsh/)
mydit(USA) url(ftp://ftp.math.gatech.edu/pub/zsh/)
(ftp://ftp.math.gatech.edu/pub/zsh/)
mydit() url(ftp://uiarchive.uiuc.edu/pub/packages/shells/zsh/)
@ -383,10 +388,6 @@ url(http://www.math.technion.ac.il/mirror/ftp.zsh.org/pub/zsh/)
(ftp://ftp.sterling.com/zsh/)
mydit() url(ftp://ftp.rge.com/pub/shells/zsh/)
(ftp://ftp.rge.com/pub/shells/zsh/)
mydit() url(ftp://foad.org/pub/zsh/)
(ftp://foad.org/pub/zsh/)
mydit() url(http://foad.org/zsh/)
(http://foad.org/zsh/)
)
The Windows port mentioned above is maintained separately by email(Amol
@ -463,6 +464,7 @@ sect(I don't have root access: how do I make zsh my login shell?)
endif
)
It's not a good idea to put this (even without the -l) into .cshrc,
at least without some tests on what the csh is supposed to be doing,
as that will cause _every_ instance of csh to turn into a zsh and
@ -575,6 +577,10 @@ tt(SH_OPTION_LETTERS),
it()* The results of parameter substitutions are treated as plain text:
mytt(foo="*"; print $foo) prints all files in ksh but mytt(*) in zsh
(uset tt(GLOB_SUBST)).
it() The backslash in tt($(echo '\$x')) is treated differently: in \
ksh, it
is not stripped, in zsh it is. (The tt(`...`) form gives the same in
both shells.)
it()* tt($PSn) do not do parameter substitution by default (use \
PROMPT_SUBST).
it()* Standard globbing does not allow ksh-style `pattern-lists'.
@ -635,11 +641,11 @@ link(2.3)(23).
it()* Options are not local to functions (use LOCAL_OPTIONS; note this
may always be unset locally to propagate options settings from a
function to the calling level).
it() Function definitions themselves are not local to functions.
)
it() Traps and signals:
itemize(
it()* Traps are not local to functions. The option LOCAL_TRAPS will
be available from 3.1.6.
it() Traps are not local to functions.
it() TRAPERR has become TRAPZERR (this was forced by UNICOS which
has SIGERR).
)
@ -654,8 +660,6 @@ link(2.3)(23).
release either.)
it() Management of histories in multiple shells is different:
the history list is not saved and restored after each command.
(The option tt(SHARE_HISTORY) will appear in 3.1.6 and will be
set in ksh compatibility mode to remedy this.)
it() mytt(\) does not escape editing chars (use mytt(^V)).
it() Not all ksh bindings are set (e.g. mytt(<ESC>#); try mytt(<ESC>q)).
it()* mytt(#) in an interactive shell is not treated as a comment by
@ -1151,16 +1155,15 @@ sect(How do I automatically display the directory in my xterm title bar?)
sect(How do I make the completion list use eight bit characters?)
If you are sure your terminal handles this, the easiest way from versions
3.0.6 and 3.1 of the shell is to set the option tt(PRINT_EIGHT_BIT). In
principle, this will work automatically if your computer uses the
`locale' system and your locale variables are set properly, as zsh
understands this. However, it is quite complicated, so if it isn't
already set up, trying the option is a lot easier. For earlier versions
of zsh 3, you are stuck with trying to understand locales, see the
tt(setlocale(3)) and tt(zshparam(1)) manual pages: the simplest
possibility may be to set tt(LC_ALL=en_US). For older versions of the
shell, there is no easy way out.
If you are sure your terminal handles this, the easiest way from version
3.1 of the shell is to set the option tt(PRINT_EIGHT_BIT). In principle,
this will work automatically if your computer uses the `locale' system
and your locale variables are set properly, as zsh understands this.
However, it is quite complicated, so if it isn't already set up, trying
the option is a lot easier. For 3.0, you are stuck with trying to
understand locales, see the tt(setlocale(3)) and tt(zshparam(1)) manual
pages: the simplest possibility may be to set tt(LC_ALL=en_US). For older
versions of the shell, there is no easy way out.
sect(Why do the cursor (arrow) keys not work?)
@ -1535,8 +1538,8 @@ sect(How do I get a variable's value to be evaluated as another variable?)
)
produces the same result.
Versions 3.1.6 of zsh will allow you to do this directly with a new flag;
mytt(${(P)E}).
Future versions of zsh will probably allow you to do this directly,
with a new flag; mytt(${(P)E}).
As a slight aside, sometimes people note that the syntax mytt(${${E}})
is valid and expect it to have this effect. It probably ought to, but
@ -1566,39 +1569,6 @@ sect(How do I prevent the prompt overwriting output when there is no newline?)
prompt (see question link(3.13)(313) for that).
sect(What's wrong with cut and paste on my xterm?)
On the majority of modern UNIX systems, cutting text from one window and
pasting it into another should work fine. On a few, however, there are
problems due to issues about how the terminal is handled: most programs
expect the terminal to be in `canonical input mode', which means that the
program is passed a whole line of input at a time, while for editing
the shell needs a single character at a time and must be in
`non-canonical input mode'. On the systems in question, input can be
lost or re-ordered when the mode changes. There are actually two
slightly different problems:
enumerate(
myeit() When you paste something in while a programme is running, so that
the shell only retrieves it later. Traditionally, there was a test
which was used only on systems where the problem was known to exist,
so it is possible some other systems were not handled (for example,
certain versions of IRIX, it appears); also, continuation lines were
not handled properly. A more reliable approach will appear in
versions 3.0.6 and 3.1.6.
myeit() When the shell is waiting for input, and you paste in a chunk of
text consisting of more than one complete set of commands.
Unfortunately, this is a much harder problem: the line editor is
already active, and needs to be turned off when the first command is
executed. The shell doesn't even know if the remaining text is input
to a command or for the shell, so there's simply nothing it can do.
However, if you have problems you can trick it: type `tt({)' on a line
by itself, then paste the input, then type `tt(})' on a line by
itself. The shell will not execute anything until the final brace is
read; all input is read as continuation lines (this may require the
fixes referred to above in order to be reliable).
)
chapter(The mysteries of completion)
Programmable completion using the `compctl' command is one of the most
@ -1703,7 +1673,7 @@ sect(How does zsh deal with ambiguous completions?)
flexibility for what it does here via its options. The default is
for it to beep and completion to stop until you type another
character. You can type tt(\C-D) to see all the possible completions.
(That's assuming you're at the end of the line, otherwise tt(\C-D) will
(That's assuming your at the end of the line, otherwise tt(\C-D) will
delete the next character and you have to use tt(ESC-\C-D).) This can be
changed by the following options, among others:
itemize(
@ -1917,15 +1887,13 @@ this applies
itemize(
it() mytt(time) is ignored with builtins and can't be used with mytt({...}).
it() mytt(set -x) (mytt(setopt xtrace)) still has a few glitches; these
are mostly fixed in 3.1.6.
it() mytt(set -x) (mytt(setopt xtrace)) still has a few glitches.
it() Zsh's notion of the current line number (via tt($LINENO)) is
sometimes not well handled, particularly when using functions and traps.
This should also work reliably from 3.1.6.
it() In vi mode, mytt(u) can go past the original modification point.
it() The singlelinezle option has problems with prompts containing escapes.
it() The mytt(r) command does not work inside mytt($(...)) or mytt(`...`)
expansions. This is fixed in 3.1.
expansions. (This is fixed in 3.1.)
it() mytt(typeset) handling is non-optimal, particularly with regard to
flags, and is ksh-incompatible in unpredictable ways.
it() Nested closures in extended globbing and pattern matching, such as
@ -1933,8 +1901,8 @@ this applies
[[ fofo = (fo#)# ]]
)
were not correctly handled, and there were problems with
complicated exclusions using mytt(^) or mytt(~). These
are fixed in version 3.1.3.
complicated exclusions using mytt(^) or mytt(~). (These
are fixed in version 3.1.3.)
)
Note that a few recent changes introduce incompatibilities (these
@ -1950,7 +1918,7 @@ this applies
zsh features are never noticed by many users. To turn them off,
just put mytt(unsetopt alwayslastprompt listambiguous) in your
tt(.zshrc) file.
it() In 3.1.5, tt(history-search-{forward,backward}) only find previous
it() tt(history-search-{forward,backward}) now only find previous
lines where the first word is the same as the current one. For
example,
verb(
@ -2083,7 +2051,11 @@ label(52)
email(zsh-workers-owner@sunsite.auc.dk). The list maintainer's
real name is email(Karsten Thygesen <karthy@kom.auc.dk>).
An archive of mailings for the last few years can be found at
The list from May 1992 to May 1995 is archived in
url(ftp://ftp.sterling.com/zsh/zsh-list/YY-MM)
(ftp://ftp.sterling.com/zsh/zsh-list/YY-MM)
where YY-MM are the year and month in digits. More recent
mailings up to date are to be found at
url(http://www.zsh.org/mla/)(http://www.zsh.org/mla/)
at the main zsh archive in Australia.
@ -2117,8 +2089,7 @@ sect(What's on the wish-list?)
case-insensitive matching and wild card anchors, e.g. mytt(z_t<TAB>)
can allow a wildcard before the mytt(_) so that this will expand
to mytt(zle_tricky.c) --- all under user control; completions can
be grouped; a new completion command, menu-select, allows real menu
selection --- you can move the cursor around to choose a completion.
be grouped.
it() Case-insensitive and approximate matching in the globbing code:
for example, mytt((#ia2)readme) matches the string mytt(readme)
case-insensitively with up to two errors, such as tt(README),

View file

@ -2,7 +2,6 @@ DISTFILES_SRC='
.cvsignore .distfiles .exrc
comp1.mdd comp.h comp1.c comp1.export
compctl.mdd compctl.c
complist.mdd complist.c
deltochar.mdd deltochar.c
zle.mdd iwidgets.list zle.h zle_bindings.c zle_hist.c
zle_keymap.c zle_main.c zle_misc.c zle_move.c zle_params.c

View file

@ -36,7 +36,6 @@ typedef struct patcomp *Patcomp;
typedef struct cmatcher *Cmatcher;
typedef struct cmlist *Cmlist;
typedef struct cpattern *Cpattern;
typedef struct menuinfo *Menuinfo;
/* node for compctl hash table (compctltab) */
@ -267,19 +266,6 @@ struct cpattern {
#define CFN_FIRST 1
#define CFN_DEFAULT 2
/* Information about menucompletion stuff. */
struct menuinfo {
Cmgroup group; /* position in the group list */
Cmatch *cur; /* match currently inserted */
int pos; /* begin on line */
int len; /* length of inserted string */
int end; /* end on the line */
int we; /* non-zero if the cursor was at the end */
int insc; /* length of suffix inserted */
int asked; /* we asked if the list should be shown */
};
/* Flags for compadd and addmatches(). */
#define CAF_QUOTE 1
@ -313,16 +299,6 @@ struct cadata {
char *dpar; /* array to delete non-matches in (-D) */
};
/* Data given to hooks. */
typedef struct chdata *Chdata;
struct chdata {
Cmgroup matches; /* the matches generated */
int num; /* the number of matches */
Cmatch cur; /* current match or NULL */
};
/* Flags for special parameters. */
#define CPN_WORDS 0

View file

@ -2221,8 +2221,7 @@ static void
addcompparams(struct compparam *cp, Param *pp)
{
for (; cp->name; cp++, pp++) {
Param pm = createparam(cp->name,
cp->type |PM_SPECIAL|PM_REMOVABLE|PM_LOCAL);
Param pm = createparam(cp->name, cp->type | PM_SPECIAL | PM_REMOVABLE);
if (!pm)
pm = (Param) paramtab->getnode(paramtab, cp->name);
DPUTS(!pm, "param not set in addcompparams");
@ -2262,8 +2261,7 @@ makecompparams(void)
addcompparams(comprparams, comprpms);
if (!(cpm = createparam(COMPSTATENAME,
PM_SPECIAL|PM_REMOVABLE|PM_LOCAL|PM_HASHED)))
if (!(cpm = createparam(COMPSTATENAME, PM_SPECIAL|PM_REMOVABLE|PM_HASHED)))
cpm = (Param) paramtab->getnode(paramtab, COMPSTATENAME);
DPUTS(!cpm, "param not set in makecompparams");

View file

@ -67,6 +67,8 @@ deltochar(char **args)
}
}
}
if (!ok)
feep();
return !ok;
}

View file

@ -19,7 +19,6 @@
"backward-kill-line", backwardkillline, ZLE_KILL | ZLE_KEEPSUFFIX
"backward-kill-word", backwardkillword, ZLE_KILL | ZLE_KEEPSUFFIX
"backward-word", backwardword, 0
"beep", handlefeep, 0
"beginning-of-buffer-or-history", beginningofbufferorhistory, 0
"beginning-of-history", beginningofhistory, 0
"beginning-of-line", beginningofline, 0

View file

@ -1,44 +1,10 @@
#!
acceptlast
addzlefunction
backdel
backkill
bindkey
clearflag
clearscreen
deletezlefunction
do_menucmp
do_single
feep
foredel
forekill
getkey
getkeycmd
getzlequery
linkkeymap
listshown
menucomplete
menucur
menugrp
minfo
newkeymap
nlnct
printfmt
redisplay
refthingy
reversemenucomplete
selectlocalmap
showinglist
skipnolist
spaceinline
tcmultout
tcout
thingies
trashzle
ungetkeycmd
unlinkkeymap
zlenoargs
zmod
zrefresh
zsetterm
ztat

View file

@ -143,9 +143,3 @@ typedef struct cutbuffer *Cutbuffer;
#define CUTBUFFER_LINE 1 /* for vi: buffer contains whole lines of data */
#define KRINGCT 8 /* number of buffers in the kill ring */
/* Convenience macros for the hooks */
#define LISTMATCHESHOOK (zlehooks + 0)
#define INSERTMATCHHOOK (zlehooks + 1)
#define MENUSTARTHOOK (zlehooks + 2)

View file

@ -77,8 +77,10 @@ int
uphistory(char **args)
{
int nodups = isset(HISTIGNOREDUPS);
if (!zle_goto_hist(histline, -zmult, nodups) && isset(HISTBEEP))
if (!zle_goto_hist(histline, -zmult, nodups) && isset(HISTBEEP)) {
feep();
return 1;
}
return 0;
}
@ -126,8 +128,10 @@ uplineorhistory(char **args)
int m = zmult, ret;
cs = ocs;
if (virangeflag || !histallowed)
if (virangeflag || !histallowed) {
feep();
return 1;
}
zmult = n;
ret = uphistory(args);
zmult = m;
@ -156,8 +160,10 @@ uplineorsearch(char **args)
int m = zmult, ret;
cs = ocs;
if (virangeflag || !histallowed)
if (virangeflag || !histallowed) {
feep();
return 1;
}
zmult = n;
ret = historysearchbackward(args);
zmult = m;
@ -210,8 +216,10 @@ downlineorhistory(char **args)
int m = zmult, ret;
cs = ocs;
if (virangeflag || !histallowed)
if (virangeflag || !histallowed) {
feep();
return 1;
}
zmult = n;
ret = downhistory(args);
zmult = m;
@ -240,8 +248,10 @@ downlineorsearch(char **args)
int m = zmult, ret;
cs = ocs;
if (virangeflag || !histallowed)
if (virangeflag || !histallowed) {
feep();
return 1;
}
zmult = n;
ret = historysearchforward(args);
zmult = m;
@ -256,8 +266,10 @@ acceptlineanddownhistory(char **args)
{
Histent he;
if (!(he = movehistent(quietgethist(histline), 1, HIST_FOREIGN)))
if (!(he = movehistent(quietgethist(histline), 1, HIST_FOREIGN))) {
feep();
return 1;
}
pushnode(bufstack, ztrdup(ZLETEXT(he)));
done = 1;
stackhist = he->histnum;
@ -269,8 +281,10 @@ int
downhistory(char **args)
{
int nodups = isset(HISTIGNOREDUPS);
if (!zle_goto_hist(histline, zmult, nodups) && isset(HISTBEEP))
if (!zle_goto_hist(histline, zmult, nodups) && isset(HISTBEEP)) {
feep();
return 1;
}
return 0;
}
@ -322,6 +336,7 @@ historysearchbackward(char **args)
}
}
}
feep();
return 1;
}
@ -370,6 +385,7 @@ historysearchforward(char **args)
}
}
}
feep();
return 1;
}
@ -388,8 +404,10 @@ beginningofbufferorhistory(char **args)
int
beginningofhistory(char **args)
{
if (!zle_goto_hist(firsthist(), 0, 0) && isset(HISTBEEP))
if (!zle_goto_hist(firsthist(), 0, 0) && isset(HISTBEEP)) {
feep();
return 1;
}
return 0;
}
@ -439,15 +457,19 @@ insertlastword(char **args)
zsfree(lastinsert);
lastinsert = NULL;
}
if (!(he = quietgethist(evhist)) || !he->nwords)
if (!(he = quietgethist(evhist)) || !he->nwords) {
feep();
return 1;
}
if (zmult > 0) {
n = he->nwords - (zmult - 1);
} else {
n = 1 - zmult;
}
if (n < 1 || n > he->nwords)
if (n < 1 || n > he->nwords) {
feep();
return 1;
}
s = he->text + he->words[2*n-2];
t = he->text + he->words[2*n-1];
save = *t;
@ -569,6 +591,7 @@ getline(char **args)
char *s = (char *)getlinknode(bufstack);
if (!s) {
feep();
return 1;
} else {
int cc;
@ -670,7 +693,7 @@ doisearch(char **args, int dir)
int sbptr = 0, top_spot = 0, pos, sibuf = 80;
int nomatch = 0, skip_line = 0, skip_pos = 0;
int odir = dir, sens = zmult == 1 ? 3 : 1;
int hl = histline, savekeys = -1, feep = 0;
int hl = histline, savekeys = -1;
Thingy cmd;
char *okeymap = curkeymapname;
static char *previous_search = NULL;
@ -739,7 +762,7 @@ doisearch(char **args, int dir)
get_isrch_spot(top_spot, &hl, &pos, &cs, &sbptr,
&dir, &nomatch);
if (!nomatch) {
feep = 1;
feep();
nomatch = 1;
}
he = quietgethist(hl);
@ -780,7 +803,7 @@ doisearch(char **args, int dir)
goto ref;
} else if(cmd == Th(z_vicmdmode)) {
if(selectkeymap(invicmdmode() ? "main" : "vicmd", 0))
feep = 1;
feep();
goto ref;
} else if(cmd == Th(z_vibackwarddeletechar) ||
cmd == Th(z_backwarddeletechar)) {
@ -788,7 +811,7 @@ doisearch(char **args, int dir)
get_isrch_spot(--top_spot, &hl, &pos, &cs, &sbptr,
&dir, &nomatch);
else
feep = 1;
feep();
if (nomatch) {
statusline = ibuf;
skip_pos = 1;
@ -855,7 +878,7 @@ doisearch(char **args, int dir)
zrefresh();
}
if ((c = getkey(0)) == EOF)
feep = 1;
feep();
else
goto ins;
} else {
@ -873,7 +896,7 @@ doisearch(char **args, int dir)
}
ins:
if (sbptr == PATH_MAX) {
feep = 1;
feep();
continue;
}
set_isrch_spot(top_spot++, hl, pos, cs, sbptr, dir, nomatch);
@ -884,9 +907,7 @@ doisearch(char **args, int dir)
}
sbuf[sbptr++] = c;
}
if (feep)
handlefeep(zlenoargs);
feep = 0;
handlefeep();
}
if (sbptr) {
zfree(previous_search, previous_search_len);
@ -936,6 +957,7 @@ infernexthistory(char **args)
return 0;
}
}
feep();
return 1;
}
@ -954,6 +976,7 @@ vifetchhistory(char **args)
}
if (!zle_goto_hist((zmod.flags & MOD_MULT) ? zmult : curhist, 0, 0) &&
isset(HISTBEEP)) {
feep();
return 1;
}
return 0;
@ -969,7 +992,7 @@ static int
getvisrchstr(void)
{
char *sbuf = zhalloc(80);
int sptr = 1, ret = 0, ssbuf = 80, feep = 0;
int sptr = 1, ret = 0, ssbuf = 80;
Thingy cmd;
char *okeymap = curkeymapname;
@ -1022,7 +1045,7 @@ getvisrchstr(void)
zrefresh();
}
if ((c = getkey(0)) == EOF)
feep = 1;
feep();
else
goto ins;
} else if(cmd == Th(z_selfinsertunmeta) || cmd == Th(z_selfinsert)) {
@ -1039,11 +1062,9 @@ getvisrchstr(void)
}
sbuf[sptr++] = c;
} else {
feep = 1;
feep();
}
if (feep)
handlefeep(zlenoargs);
feep = 0;
handlefeep();
}
statusline = NULL;
selectkeymap(okeymap, 1);
@ -1101,8 +1122,10 @@ virepeatsearch(char **args)
int n = zmult;
char *s;
if (!visrchstr)
if (!visrchstr) {
feep();
return 1;
}
if (zmult < 0) {
n = -n;
visrchsense = -visrchsense;
@ -1122,6 +1145,7 @@ virepeatsearch(char **args)
}
}
}
feep();
return 1;
}
@ -1170,6 +1194,7 @@ historybeginningsearchbackward(char **args)
}
}
}
feep();
return 1;
}
@ -1206,5 +1231,6 @@ historybeginningsearchforward(char **args)
}
}
}
feep();
return 1;
}

View file

@ -98,7 +98,7 @@ struct bindstate {
/* currently selected keymap, and its name */
/**/
Keymap curkeymap, localkeymap;
Keymap curkeymap;
/**/
char *curkeymapname;
@ -216,7 +216,7 @@ freekeynode(HashNode hn)
static HashTable copyto;
/**/
Keymap
static Keymap
newkeymap(Keymap tocopy, char *kmname)
{
Keymap km = zcalloc(sizeof(*km));
@ -250,7 +250,7 @@ scancopykeys(HashNode hn, int flags)
}
/**/
void
static void
deletekeymap(Keymap km)
{
int i;
@ -322,21 +322,21 @@ openkeymap(char *name)
}
/**/
int
unlinkkeymap(char *name, int ignm)
static int
unlinkkeymap(char *name)
{
KeymapName n = (KeymapName) keymapnamtab->getnode(keymapnamtab, name);
if(!n)
return 2;
if(!ignm && (n->flags & KMN_IMMORTAL))
if(n->flags & KMN_IMMORTAL)
return 1;
keymapnamtab->freenode(keymapnamtab->removenode(keymapnamtab, name));
return 0;
}
/**/
int
linkkeymap(Keymap km, char *name, int imm)
static int
linkkeymap(Keymap km, char *name)
{
KeymapName n = (KeymapName) keymapnamtab->getnode(keymapnamtab, name);
if(n) {
@ -347,12 +347,9 @@ linkkeymap(Keymap km, char *name, int imm)
if(!--n->keymap->rc)
deletekeymap(n->keymap);
n->keymap = km;
} else {
n = makekeymapnamnode(km);
if (imm)
n->flags |= KMN_IMMORTAL;
keymapnamtab->addnode(keymapnamtab, ztrdup(name), n);
}
} else
keymapnamtab->addnode(keymapnamtab, ztrdup(name),
makekeymapnamnode(km));
km->rc++;
return 0;
}
@ -382,15 +379,6 @@ selectkeymap(char *name, int fb)
return 0;
}
/* Select a local key map. */
/**/
void
selectlocalmap(Keymap m)
{
localkeymap = m;
}
/* Reopen the currently selected keymap, in case it got deleted. This *
* should be called after doing anything that might have run an *
* arbitrary user-specified command. */
@ -654,7 +642,7 @@ bin_bindkey(char *name, char **argv, char *ops, int func)
return 1;
}
if(ops['e'] || ops['v'])
linkkeymap(km, "main", 0);
linkkeymap(km, "main");
} else {
kmname = NULL;
km = NULL;
@ -727,7 +715,7 @@ bin_bindkey_del(char *name, char *kmname, Keymap km, char **argv, char *ops, cha
int ret = 0;
do {
int r = unlinkkeymap(*argv, 0);
int r = unlinkkeymap(*argv);
if(r == 1)
zwarnnam(name, "keymap name `%s' is protected", *argv, 0);
else if(r == 2)
@ -747,7 +735,7 @@ bin_bindkey_link(char *name, char *kmname, Keymap km, char **argv, char *ops, ch
if(!km) {
zwarnnam(name, "no such keymap `%s'", argv[0], 0);
return 1;
} else if(linkkeymap(km, argv[1], 0)) {
} else if(linkkeymap(km, argv[1])) {
zwarnnam(name, "keymap name `%s' is protected", argv[1], 0);
return 1;
}
@ -774,7 +762,7 @@ bin_bindkey_new(char *name, char *kmname, Keymap km, char **argv, char *ops, cha
}
} else
km = NULL;
linkkeymap(newkeymap(km, argv[0]), argv[0], 0);
linkkeymap(newkeymap(km, argv[0]), argv[0]);
return 0;
}
@ -1120,18 +1108,20 @@ default_bindings(void)
* will be linked to the "emacs" keymap, except that if VISUAL *
* or EDITOR contain the string "vi" then it will be linked to *
* the "viins" keymap. */
linkkeymap(vmap, "viins", 0);
linkkeymap(emap, "emacs", 0);
linkkeymap(amap, "vicmd", 0);
linkkeymap(smap, ".safe", 1);
linkkeymap(vmap, "viins");
linkkeymap(emap, "emacs");
linkkeymap(amap, "vicmd");
linkkeymap(smap, ".safe");
if (((ed = zgetenv("VISUAL")) && strstr(ed, "vi")) ||
((ed = zgetenv("EDITOR")) && strstr(ed, "vi")))
linkkeymap(vmap, "main", 0);
linkkeymap(vmap, "main");
else
linkkeymap(emap, "main", 0);
linkkeymap(emap, "main");
/* the .safe map cannot be modified or deleted */
smap->flags |= KM_IMMUTABLE;
((KeymapName) keymapnamtab->getnode(keymapnamtab, ".safe"))->flags
|= KMN_IMMORTAL;
}
/*************************/
@ -1152,12 +1142,7 @@ getkeymapcmd(Keymap km, Thingy *funcp, char **strp)
keybuf[0] = 0;
while((c = getkeybuf(!!lastlen)) != EOF) {
char *s;
Thingy f;
int loc = 1;
if (!localkeymap ||
(f = keybind(localkeymap, keybuf, &s)) == t_undefinedkey)
loc = 0, f = keybind(km, keybuf, &s);
Thingy f = keybind(km, keybuf, &s);
if(f != t_undefinedkey) {
lastlen = keybuflen;
@ -1165,7 +1150,7 @@ getkeymapcmd(Keymap km, Thingy *funcp, char **strp)
str = s;
lastc = c;
}
if(!keyisprefix((loc ? localkeymap : km), keybuf))
if(!keyisprefix(km, keybuf))
break;
}
if(!lastlen && keybuflen)

View file

@ -106,7 +106,13 @@ struct modifier zmod;
/**/
int prefixflag;
/* != 0 if there is a pending beep (usually indicating an error) */
/**/
int feepflag;
/* Number of characters waiting to be read by the ungetkeys mechanism */
/**/
int kungetct;
@ -501,7 +507,6 @@ zleread(char *lp, char *rp, int flags)
viinsbegin = 0;
statusline = NULL;
selectkeymap("main", 1);
selectlocalmap(NULL);
fixsuffix();
if ((s = (unsigned char *)getlinknode(bufstack))) {
setline((char *)s);
@ -530,21 +535,20 @@ zleread(char *lp, char *rp, int flags)
lastcol = -1;
initmodifier(&zmod);
prefixflag = 0;
feepflag = 0;
zrefresh();
while (!done && !errflag) {
statusline = NULL;
vilinerange = 0;
reselectkeymap();
selectlocalmap(NULL);
bindk = getkeycmd();
if (!ll && isfirstln && c == eofchar) {
eofsent = 1;
break;
}
if (bindk) {
if (execzlefunc(bindk, zlenoargs))
handlefeep(zlenoargs);
execzlefunc(bindk, zlenoargs);
handleprefixes();
/* for vi mode, make sure the cursor isn't somewhere illegal */
if (invicmdmode() && cs > findbol() &&
@ -569,6 +573,7 @@ zleread(char *lp, char *rp, int flags)
#endif
if (!kungetct)
zrefresh();
handlefeep();
}
statusline = NULL;
invalidatelist();
@ -608,7 +613,7 @@ execzlefunc(Thingy func, char **args)
zsfree(nm);
showmsg(msg);
zsfree(msg);
ret = 1;
feep();
} else if((w = func->widget)->flags & (WIDGET_INT|WIDGET_NCOMP)) {
int wflags = w->flags;
@ -641,7 +646,7 @@ execzlefunc(Thingy func, char **args)
zsfree(nm);
showmsg(msg);
zsfree(msg);
ret = 1;
feep();
} else {
int osc = sfcontext, osi = movefd(0), olv = lastval;
LinkList largs = NULL;
@ -948,17 +953,7 @@ trashzle(void)
static struct builtin bintab[] = {
BUILTIN("bindkey", 0, bin_bindkey, 0, -1, 0, "evaMldDANmrsLR", NULL),
BUILTIN("vared", 0, bin_vared, 1, 7, 0, NULL, NULL),
BUILTIN("zle", 0, bin_zle, 0, -1, 0, "lDANCLmMgGcRa", NULL),
};
/* The order of the entries in this table has to match the *HOOK
* macros in zle.h */
/**/
struct hookdef zlehooks[] = {
HOOKDEF("list_matches", ilistmatches, 0),
HOOKDEF("insert_match", NULL, HOOKF_ALL),
HOOKDEF("menu_start", NULL, HOOKF_ALL),
BUILTIN("zle", 0, bin_zle, 0, -1, 0, "lDANCLmMgGcR", NULL),
};
/**/
@ -1004,7 +999,6 @@ int
boot_zle(Module m)
{
addbuiltins(m->nam, bintab, sizeof(bintab)/sizeof(*bintab));
addhookdefs(m->nam, zlehooks, sizeof(zlehooks)/sizeof(*zlehooks));
return 0;
}
@ -1020,7 +1014,6 @@ cleanup_zle(Module m)
return 1;
}
deletebuiltins(m->nam, bintab, sizeof(bintab)/sizeof(*bintab));
deletehookdefs(m->nam, zlehooks, sizeof(zlehooks)/sizeof(*zlehooks));
return 0;
}

View file

@ -98,6 +98,7 @@ deletechar(char **args)
backdel(zmult);
return 0;
}
feep();
return 1;
}
@ -181,6 +182,7 @@ gosmacstransposechars(char **args)
if (cs == ll || line[cs] == '\n' ||
((cs + 1 == ll || line[cs + 1] == '\n') &&
(!cs || line[cs - 1] == '\n'))) {
feep();
return 1;
}
cs += (cs == 0 || line[cs - 1] == '\n') ? 2 : 1;
@ -203,8 +205,10 @@ transposechars(char **args)
n = -n;
while (n--) {
if (!(ct = cs) || line[cs - 1] == '\n') {
if (ll == cs || line[cs] == '\n')
if (ll == cs || line[cs] == '\n') {
feep();
return 1;
}
if (!neg)
cs++;
ct++;
@ -221,8 +225,10 @@ transposechars(char **args)
}
if (ct == ll || line[ct] == '\n')
ct--;
if (ct < 1 || line[ct - 1] == '\n')
if (ct < 1 || line[ct - 1] == '\n') {
feep();
return 1;
}
cc = line[ct - 1];
line[ct - 1] = line[ct];
line[ct] = cc;
@ -344,8 +350,10 @@ yank(char **args)
return 1;
if (zmod.flags & MOD_VIBUF)
buf = &vibuf[zmod.vibuf];
if (!buf->buf)
if (!buf->buf) {
feep();
return 1;
}
mark = cs;
yankb = cs;
while (n--) {
@ -364,8 +372,10 @@ yankpop(char **args)
{
int cc;
if (!(lastcmd & ZLE_YANK) || !kring[kct].buf)
if (!(lastcmd & ZLE_YANK) || !kring[kct].buf) {
feep();
return 1;
}
cs = yankb;
foredel(yanke - yankb);
cc = kring[kct].len;
@ -428,6 +438,7 @@ whatcursorposition(char **args)
int
undefinedkey(char **args)
{
feep();
return 1;
}
@ -446,9 +457,10 @@ quotedinsert(char **args)
#ifndef HAS_TIO
zsetterm();
#endif
if (c < 0)
if (c < 0) {
feep();
return 1;
else
} else
return selfinsert(args);
}
@ -458,8 +470,10 @@ digitargument(char **args)
{
int sign = (zmult < 0) ? -1 : 1;
if (c < '0' || c > '9')
if (c < '0' || c > '9') {
feep();
return 1;
}
if (!(zmod.flags & MOD_TMULT))
zmod.tmult = 0;
@ -479,8 +493,10 @@ digitargument(char **args)
int
negargument(char **args)
{
if (zmod.flags & MOD_TMULT)
if (zmod.flags & MOD_TMULT) {
feep();
return 1;
}
zmod.tmult = -1;
zmod.flags |= MOD_TMULT|MOD_NEG;
prefixflag = 1;
@ -639,7 +655,7 @@ Thingy
executenamedcommand(char *prmt)
{
Thingy cmd;
int len, l = strlen(prmt), ols = listshown, feep = 0;
int len, l = strlen(prmt), ols = listshown;
char *ptr;
char *okeymap = curkeymapname;
@ -672,12 +688,12 @@ executenamedcommand(char *prmt)
zrefresh();
c = getkey(0);
if(c == EOF || !c || len == NAMLEN)
feep = 1;
feep();
else
*ptr++ = c, len++;
} else if(cmd == Th(z_quotedinsert)) {
if((c = getkey(0)) == EOF || !c || len == NAMLEN)
feep = 1;
feep();
else
*ptr++ = c, len++;
} else if(cmd == Th(z_backwarddeletechar) ||
@ -728,7 +744,7 @@ executenamedcommand(char *prmt)
scanhashtable(thingytab, 1, 0, DISABLED, scancompcmd, 0);
} LASTALLOC;
if (empty(cmdll))
feep = 1;
feep();
else if (cmd == Th(z_listchoices) ||
cmd == Th(z_deletecharorlist)) {
int zmultsav = zmult;
@ -750,7 +766,7 @@ executenamedcommand(char *prmt)
!(isset(LISTAMBIGUOUS) && cmdambig > len)) {
int zmultsav = zmult;
if (isset(LISTBEEP))
feep = 1;
feep();
statusll = l + cmdambig + 1;
zmult = 1;
listlist(cmdll);
@ -760,14 +776,12 @@ executenamedcommand(char *prmt)
}
} else {
if (len == NAMLEN || icntrl(c) || cmd != Th(z_selfinsert))
feep = 1;
feep();
else
*ptr++ = c, len++;
}
}
if (feep)
handlefeep(zlenoargs);
feep = 0;
handlefeep();
}
}

View file

@ -228,6 +228,7 @@ vimatchbracket(char **args)
otog:
if (cs == ll || line[cs] == '\n') {
feep();
cs = ocs;
return 1;
}
@ -272,6 +273,7 @@ vimatchbracket(char **args)
ct++;
}
if (cs < 0 || cs >= ll) {
feep();
cs = ocs;
return 1;
} else if(dir > 0 && virangeflag)
@ -293,8 +295,10 @@ viforwardchar(char **args)
zmult = n;
return ret;
}
if (cs >= lim)
if (cs >= lim) {
feep();
return 1;
}
while (n-- && cs < lim)
cs++;
return 0;
@ -313,8 +317,10 @@ vibackwardchar(char **args)
zmult = n;
return ret;
}
if (cs == findbol())
if (cs == findbol()) {
feep();
return 1;
}
while (n--) {
cs--;
if (cs < 0 || line[cs] == '\n') {
@ -331,11 +337,14 @@ viendofline(char **args)
{
int oldcs = cs, n = zmult;
if (n < 1)
if (n < 1) {
feep();
return 1;
}
while(n--) {
if (cs > ll) {
cs = oldcs;
feep();
return 1;
}
cs = findeol() + 1;
@ -376,7 +385,7 @@ vifindprevchar(char **args)
tailadd = 0;
return virepeatfind(args);
}
return 1;
return 0;
}
/**/
@ -409,8 +418,10 @@ virepeatfind(char **args)
{
int ocs = cs, n = zmult;
if (!vfinddir)
if (!vfinddir) {
feep();
return 1;
}
if (n < 0) {
int ret;
zmult = -n;
@ -423,6 +434,7 @@ virepeatfind(char **args)
cs += vfinddir;
while (cs >= 0 && cs < ll && line[cs] != vfindchar && line[cs] != '\n');
if (cs < 0 || cs >= ll || line[cs] == '\n') {
feep();
cs = ocs;
return 1;
}
@ -468,8 +480,10 @@ visetmark(char **args)
int ch;
ch = getkey(0);
if (ch < 'a' || ch > 'z')
if (ch < 'a' || ch > 'z') {
feep();
return 1;
}
ch -= 'a';
vimarkcs[ch] = cs;
vimarkline[ch] = histline;
@ -486,14 +500,19 @@ vigotomark(char **args)
if (ch == c)
ch = 26;
else {
if (ch < 'a' || ch > 'z')
if (ch < 'a' || ch > 'z') {
feep();
return 1;
}
ch -= 'a';
}
if (!vimarkline[ch])
if (!vimarkline[ch]) {
feep();
return 1;
}
if (curhist != vimarkline[ch] && !zle_goto_hist(vimarkline[ch], 0, 0)) {
vimarkline[ch] = 0;
feep();
return 1;
}
cs = vimarkcs[ch];

View file

@ -84,7 +84,7 @@ makezleparams(int ro)
for(zp = zleparams; zp->name; zp++) {
Param pm = createparam(zp->name, (zp->type |PM_SPECIAL|PM_REMOVABLE|
PM_LOCAL|(ro ? PM_READONLY : 0)));
(ro ? PM_READONLY : 0)));
if (!pm)
pm = (Param) paramtab->getnode(paramtab, zp->name);
DPUTS(!pm, "param not set in makezleparams");

View file

@ -318,10 +318,9 @@ deletezlefunction(Widget w)
/*
* The available operations are:
*
* -l list widgets/test for existence
* -l list user-defined widgets (no arguments)
* -D delete widget names
* -A link the two named widgets (2 arguments)
* -C create completion widget (3 arguments)
* -N create new user-defined widget (1 or 2 arguments)
* invoke a widget (1 argument)
*/
@ -335,7 +334,7 @@ bin_zle(char *name, char **args, char *ops, int func)
int (*func) _((char *, char **, char *, char));
int min, max;
} const opns[] = {
{ 'l', bin_zle_list, 0, -1 },
{ 'l', bin_zle_list, 0, 0 },
{ 'D', bin_zle_del, 1, -1 },
{ 'A', bin_zle_link, 2, 2 },
{ 'N', bin_zle_new, 1, 2 },
@ -374,21 +373,8 @@ bin_zle(char *name, char **args, char *ops, int func)
static int
bin_zle_list(char *name, char **args, char *ops, char func)
{
if (!*args) {
scanhashtable(thingytab, 1, 0, DISABLED, scanlistwidgets,
(ops['a'] ? -1 : ops['L']));
return 0;
} else {
int ret = 0;
Thingy t;
for (; *args && !ret; args++) {
if (!(t = (Thingy) thingytab->getnode2(thingytab, *args)) ||
(!ops['a'] && (t->widget->flags & WIDGET_INT)))
ret = 1;
}
return ret;
}
scanhashtable(thingytab, 1, 0, DISABLED, scanlistwidgets, ops['L']);
return 0;
}
/**/
@ -419,10 +405,6 @@ scanlistwidgets(HashNode hn, int list)
Thingy t = (Thingy) hn;
Widget w = t->widget;
if(list < 0) {
printf("%s\n", hn->nam);
return;
}
if(w->flags & WIDGET_INT)
return;
if(list) {
@ -554,7 +536,6 @@ bin_zle_call(char *name, char **args, char *ops, char func)
Thingy t;
struct modifier modsave;
int ret, saveflag = 0;
char *wname = *args++;
if(!zleactive || incompctlfunc || incompfunc) {
zerrnam(name, "widgets can only be called when ZLE is active",
@ -562,12 +543,6 @@ bin_zle_call(char *name, char **args, char *ops, char func)
return 1;
}
if (!wname) {
zwarnnam(name, "wrong number of arguments", NULL, 0);
if (saveflag)
zmod = modsave;
return 1;
}
while (*args && **args == '-') {
char *num;
if (!args[0][1] || args[0][1] == '-') {
@ -602,8 +577,14 @@ bin_zle_call(char *name, char **args, char *ops, char func)
}
args++;
}
if (!args[0]) {
zwarnnam(name, "wrong number of arguments", NULL, 0);
if (saveflag)
zmod = modsave;
return 1;
}
t = rthingy(wname);
t = rthingy(*args++);
PERMALLOC {
ret = execzlefunc(t, args);
} LASTALLOC;

View file

@ -110,10 +110,20 @@ static int movetoend;
static int menucmp;
/* Information about menucompletion. */
/* Pointers to the current position in the groups list and in the menu- *
* completion array (the one that was put in the command line last). */
/**/
struct menuinfo minfo;
static Cmgroup menugrp;
static Cmatch *menucur;
/* menupos is the point (in the command line) where the menu-completion *
* strings are inserted. menulen is the length of the string that was *
* inserted last. menuend is the end position of this string in the *
* command line. menuwe is non-zero if the cursor was at the end of the *
* word (meaning that suffixes should go before the cursor). menuinsc is *
* the length of any suffix that has been temporarily added. */
static int menupos, menulen, menuend, menuwe, menuinsc;
/* This is for completion inside a brace expansion. brbeg and brend hold *
* strings that were temporarily removed from the string to complete. *
@ -378,8 +388,7 @@ completecall(char **args)
cfargs = args;
cfret = 0;
compfunc = compwidget->u.comp.func;
if (compwidget->u.comp.fn(zlenoargs) && !cfret)
cfret = 1;
compwidget->u.comp.fn(zlenoargs);
compfunc = NULL;
return cfret;
@ -437,8 +446,8 @@ spellword(char **args)
int
deletecharorlist(char **args)
{
Cmgroup mg = minfo.group;
Cmatch *mc = minfo.cur;
Cmgroup mg = menugrp;
Cmatch *mc = menucur;
int ret;
usemenu = !!isset(MENUCOMPLETE);
@ -449,8 +458,8 @@ deletecharorlist(char **args)
} else
ret = docomplete(COMP_LIST_COMPLETE);
minfo.cur = mc;
minfo.group = mg;
menucur = mc;
menugrp = mg;
return ret;
}
@ -513,16 +522,16 @@ reversemenucomplete(char **args)
return menucomplete(args);
HEAPALLOC {
if (minfo.cur == (minfo.group)->matches) {
if (menucur == menugrp->matches) {
do {
if (!(minfo.group = (minfo.group)->prev))
minfo.group = lmatches;
} while (!(minfo.group)->mcount);
minfo.cur = (minfo.group)->matches + (minfo.group)->mcount - 1;
if (!(menugrp = menugrp->prev))
menugrp = lmatches;
} while (!menugrp->mcount);
menucur = menugrp->matches + menugrp->mcount - 1;
} else
minfo.cur--;
menucur--;
metafy_line();
do_single(*(minfo.cur));
do_single(*menucur);
unmetafy_line();
} LASTALLOC;
return 0;
@ -532,8 +541,7 @@ reversemenucomplete(char **args)
* with the next completions. This gives you a way to *
* accept several selections from the list of matches. */
/**/
void
static void
acceptlast(void)
{
if (brbeg && *brbeg) {
@ -549,13 +557,13 @@ acceptlast(void)
brbeg[l] = ',';
brbeg[l + 1] = '\0';
} else {
cs = minfo.pos + minfo.len + minfo.insc;
cs = menupos + menulen + menuinsc;
iremovesuffix(' ', 1);
inststrlen(" ", 1, 1);
minfo.insc = minfo.len = 0;
minfo.pos = cs;
minfo.we = 1;
menuinsc = menulen = 0;
menupos = cs;
menuwe = 1;
}
}
@ -563,8 +571,10 @@ acceptlast(void)
int
acceptandmenucomplete(char **args)
{
if (!menucmp)
if (!menucmp) {
feep();
return 1;
}
acceptlast();
return menucomplete(args);
}
@ -797,7 +807,7 @@ static int
docomplete(int lst)
{
char *s, *ol;
int olst = lst, chl = 0, ne = noerrs, ocs, ret = 0, omc = menucmp;
int olst = lst, chl = 0, ne = noerrs, ocs, ret = 0;;
if (showagain && validlist)
showinglist = -2;
@ -879,6 +889,7 @@ docomplete(int lst)
ll = strlen((char *) line);
cs = ocs;
unmetafy_line();
feep();
return 1;
}
ocs = cs;
@ -1051,15 +1062,6 @@ docomplete(int lst)
popheap();
zsfree(qword);
unmetafy_line();
if (menucmp && !omc) {
struct chdata dat;
dat.matches = amatches;
dat.num = nmatches;
dat.cur = NULL;
runhookdef(MENUSTARTHOOK, (void *) &dat);
}
return ret;
}
@ -1069,7 +1071,7 @@ docomplete(int lst)
* insert the next completion. */
/**/
void
static void
do_menucmp(int lst)
{
/* Just list the matches if the list was requested. */
@ -1079,16 +1081,16 @@ do_menucmp(int lst)
}
/* Otherwise go to the next match in the array... */
HEAPALLOC {
if (!*++(minfo.cur)) {
if (!*++menucur) {
do {
if (!(minfo.group = (minfo.group)->next))
minfo.group = amatches;
} while (!(minfo.group)->mcount);
minfo.cur = minfo.group->matches;
if (!(menugrp = menugrp->next))
menugrp = amatches;
} while (!menugrp->mcount);
menucur = menugrp->matches;
}
/* ... and insert it into the command line. */
metafy_line();
do_single(*(minfo.cur));
do_single(*menucur);
unmetafy_line();
} LASTALLOC;
}
@ -1442,6 +1444,7 @@ get_comp_string(void)
lexrestore();
goto start;
}
feep();
noaliases = 0;
lexrestore();
LASTALLOC_RETURN NULL;
@ -1754,8 +1757,11 @@ doexpansion(char *s, int lst, int olst, int explincmd)
}
if (errflag)
goto end;
if (empty(vl) || !*(char *)peekfirst(vl))
if (empty(vl) || !*(char *)peekfirst(vl)) {
if (!noerrs)
feep();
goto end;
}
if (peekfirst(vl) == (void *) ss ||
(olst == COMP_EXPAND_COMPLETE &&
!nextnode(firstnode(vl)) && *s == Tilde &&
@ -1765,6 +1771,8 @@ doexpansion(char *s, int lst, int olst, int explincmd)
* expandorcomplete was called, otherwise, just beep. */
if (lst == COMP_EXPAND_COMPLETE)
docompletion(s, COMP_COMPLETE, explincmd);
else
feep();
goto end;
}
if (lst == COMP_LIST_EXPAND) {
@ -3816,10 +3824,6 @@ addmatches(Cadata dat, char **argv)
lpre = quotename(lpre, NULL);
lsuf = quotename(lsuf, NULL);
}
if (dat->ppre)
dat->ppre = quotename(dat->ppre, NULL);
if (dat->psuf)
dat->psuf = quotename(dat->psuf, NULL);
}
/* Walk through the matches given. */
for (; (s = *argv); argv++) {
@ -3845,10 +3849,8 @@ addmatches(Cadata dat, char **argv)
}
}
if (!(dat->aflags & CAF_MATCH)) {
if (dat->aflags & CAF_QUOTE)
ms = dupstring(s);
else
sl = strlen(ms = quotename(s, NULL));
ms = ((dat->aflags & CAF_QUOTE) ? dupstring(s) :
quotename(s, NULL));
lc = bld_parts(ms, sl, -1, NULL);
isexact = 0;
} else if (!(ms = comp_match(lpre, lsuf, s, cp, &lc,
@ -4356,6 +4358,7 @@ docompletion(char *s, int lst, int incmd)
foredel(ll);
inststr(origline);
cs = origcs;
feep();
clearlist = 1;
ret = 1;
goto compend;
@ -4367,17 +4370,17 @@ docompletion(char *s, int lst, int incmd)
showinglist = -2;
else if (useline) {
/* We have matches. */
if (nmatches > 1) {
if (nmatches > 1)
/* There is more than one match. */
ret = do_ambiguous();
} else if (nmatches == 1) {
do_ambiguous();
else if (nmatches == 1) {
/* Only one match. */
Cmgroup m = amatches;
while (!m->mcount)
m = m->next;
minfo.cur = NULL;
minfo.asked = 0;
menucur = NULL;
do_single(m->matches[0]);
invalidatelist();
}
@ -4391,7 +4394,7 @@ docompletion(char *s, int lst, int incmd)
int up = 0, tr = 1, nn = 0;
if (!nmatches)
ret = 1;
feep();
while (g) {
if ((e = g->expls))
@ -4633,8 +4636,8 @@ callcompfunc(char *s, char *fn)
else
compoldlist = "yes";
kset |= CP_OLDLIST;
if (minfo.cur) {
sprintf(buf, "%d", (*(minfo.cur))->gnum);
if (menucur) {
sprintf(buf, "%d", (*menucur)->gnum);
compoldins = buf;
kset |= CP_OLDINS;
} else
@ -4715,7 +4718,7 @@ callcompfunc(char *s, char *fn)
movetoend = 2;
oldlist = (hasperm && compoldlist && !strcmp(compoldlist, "keep"));
oldins = (hasperm && minfo.cur &&
oldins = (hasperm && menucur &&
compoldins && !strcmp(compoldins, "keep"));
zfree(comprpms, CP_REALPARAMS * sizeof(Param));
@ -5632,7 +5635,7 @@ makecomplistext(Compctl occ, char *os, int incmd)
case CCT_RANGEPAT:
if (cc->type == CCT_RANGEPAT)
tokenize(sc = dupstring(cc->u.l.a[i]));
for (j = clwpos - 1; j > 0; j--) {
for (j = clwpos; j; j--) {
untokenize(s = ztrdup(clwords[j]));
if (cc->type == CCT_RANGESTR)
sc = rembslash(cc->u.l.a[i]);
@ -6362,14 +6365,20 @@ makecomplistflags(Compctl cc, char *s, int incmd, int compadd)
if (cc->mask & (CC_JOBS | CC_RUNNING | CC_STOPPED)) {
/* Get job names. */
int i;
char *j;
char *j, *jj;
for (i = 0; i < MAXJOB; i++)
if ((jobtab[i].stat & STAT_INUSE) &&
jobtab[i].procs && jobtab[i].procs->text) {
int stopped = jobtab[i].stat & STAT_STOPPED;
j = dupstring(jobtab[i].procs->text);
j = jj = dupstring(jobtab[i].procs->text);
/* Find the first word. */
for (; *jj; jj++)
if (*jj == ' ') {
*jj = '\0';
break;
}
if ((cc->mask & CC_JOBS) ||
(stopped && (cc->mask & CC_STOPPED)) ||
(!stopped && (cc->mask & CC_RUNNING)))
@ -6616,8 +6625,7 @@ invalidatelist(void)
if (validlist)
freematches();
lastambig = menucmp = validlist = showinglist = fromcomp = 0;
minfo.cur = NULL;
minfo.asked = 0;
menucur = NULL;
compwidget = NULL;
}
@ -7384,20 +7392,19 @@ instmatch(Cmatch m, int *scs)
/* Handle the case were we found more than one match. */
/**/
static int
static void
do_ambiguous(void)
{
int ret = 0;
menucmp = 0;
/* If we have to insert the first match, call do_single(). This is *
* how REC_EXACT takes effect. We effectively turn the ambiguous *
* completion into an unambiguous one. */
if (ainfo && ainfo->exact == 1 && useexact && !(fromcomp & FC_LINE)) {
minfo.cur = NULL;
menucur = NULL;
do_single(ainfo->exactm);
invalidatelist();
return ret;
return;
}
/* Setting lastambig here means that the completion is ambiguous and *
* AUTO_MENU might want to start a menu completion next time round, *
@ -7417,8 +7424,7 @@ do_ambiguous(void)
int atend = (cs == we), oll = ll, la, eq, tcs;
VARARR(char, oline, ll);
minfo.cur = NULL;
minfo.asked = 0;
menucur = NULL;
/* Copy the line buffer to be able to easily test if it changed. */
memcpy(oline, line, ll);
@ -7467,21 +7473,19 @@ do_ambiguous(void)
fromcomp = fc;
lastambig = 0;
clearlist = 1;
return ret;
return;
}
} else
return ret;
return;
/* At this point, we might want a completion listing. Show the listing *
* if it is needed. */
if (isset(LISTBEEP))
ret = 1;
if (uselist && (usemenu != 2 || (!showinglist && !oldlist)) &&
((!showinglist && (!listshown || !oldlist)) ||
(usemenu == 3 && !oldlist)) &&
feep();
if (uselist && usemenu != 2 &&
(!showinglist || (usemenu == 3 && !oldlist)) &&
(smatches >= 2 || (compforcelist && *compforcelist)))
showinglist = -2;
return ret;
}
/* This is a stat that ignores backslashes in the filename. The `ls' *
@ -7491,7 +7495,7 @@ do_ambiguous(void)
* (l)stat(). */
/**/
int
static int
ztat(char *nam, struct stat *buf, int ls)
{
char b[PATH_MAX], *p;
@ -7509,7 +7513,7 @@ ztat(char *nam, struct stat *buf, int ls)
/* Insert a single match in the command line. */
/**/
void
static void
do_single(Cmatch m)
{
int l, sr = 0, scs;
@ -7522,39 +7526,39 @@ do_single(Cmatch m)
fixsuffix();
if (!minfo.cur) {
if (!menucur) {
/* We are currently not in a menu-completion, *
* so set the position variables. */
minfo.pos = wb;
minfo.we = (movetoend >= 2 || (movetoend == 1 && !menucmp));
minfo.end = we;
menupos = wb;
menuwe = (movetoend >= 2 || (movetoend == 1 && !menucmp));
menuend = we;
}
/* If we are already in a menu-completion or if we have done a *
* glob completion, we have to delete some of the stuff on the *
* command line. */
if (minfo.cur)
l = minfo.len + minfo.insc;
if (menucur)
l = menulen + menuinsc;
else
l = we - wb;
minfo.insc = 0;
cs = minfo.pos;
menuinsc = 0;
cs = menupos;
foredel(l);
/* And then we insert the new string. */
minfo.len = instmatch(m, &scs);
minfo.end = cs;
cs = minfo.pos + minfo.len;
menulen = instmatch(m, &scs);
menuend = cs;
cs = menupos + menulen;
if (m->suf) {
havesuff = 1;
minfo.insc = ztrlen(m->suf);
minfo.len -= minfo.insc;
if (minfo.we) {
minfo.end += minfo.insc;
menuinsc = ztrlen(m->suf);
menulen -= menuinsc;
if (menuwe) {
menuend += menuinsc;
if (m->flags & CMF_REMOVE) {
makesuffixstr(m->remf, m->rems, minfo.insc);
if (minfo.insc == 1)
makesuffixstr(m->remf, m->rems, menuinsc);
if (menuinsc == 1)
suffixlen[STOUC(m->suf[0])] = 1;
}
}
@ -7570,11 +7574,11 @@ do_single(Cmatch m)
cs += eparq;
for (pq = parq; pq; pq--)
inststrlen("\"", 1, 1);
minfo.insc += parq;
menuinsc += parq;
inststrlen("}", 1, 1);
minfo.insc++;
if (minfo.we)
minfo.end += minfo.insc;
menuinsc++;
if (menuwe)
menuend += menuinsc;
}
if ((m->flags & CMF_FILE) || (m->ripre && isset(AUTOPARAMSLASH))) {
/* If we have a filename or we completed a parameter name *
@ -7610,10 +7614,10 @@ do_single(Cmatch m)
/* It is a directory, so add the slash. */
havesuff = 1;
inststrlen("/", 1, 1);
minfo.insc++;
if (minfo.we)
minfo.end++;
if (!menucmp || minfo.we) {
menuinsc++;
if (menuwe)
menuend++;
if (!menucmp || menuwe) {
if (m->remf || m->rems)
makesuffixstr(m->remf, m->rems, 1);
else if (isset(AUTOREMOVESLASH)) {
@ -7623,8 +7627,8 @@ do_single(Cmatch m)
}
}
}
if (!minfo.insc)
cs = minfo.pos + minfo.len;
if (!menuinsc)
cs = menupos + menulen;
}
/* If completing in a brace expansion... */
if (brbeg) {
@ -7640,9 +7644,9 @@ do_single(Cmatch m)
cs = scs;
havesuff = 1;
inststrlen(",", 1, 1);
minfo.insc++;
menuinsc++;
makesuffix(1);
if ((!menucmp || minfo.we) && isset(AUTOPARAMKEYS))
if ((!menucmp || menuwe) && isset(AUTOPARAMKEYS))
suffixlen[','] = suffixlen['}'] = 1;
}
} else if (!havesuff && (!(m->flags & CMF_FILE) || !sr)) {
@ -7651,33 +7655,20 @@ do_single(Cmatch m)
* the string doesn't name an existing file. */
if (m->autoq && (!m->isuf || m->isuf[0] != m->autoq)) {
inststrlen(&(m->autoq), 1, 1);
minfo.insc++;
menuinsc++;
}
if (!menucmp && usemenu != 3) {
if (!menucmp) {
inststrlen(" ", 1, 1);
minfo.insc++;
if (minfo.we)
menuinsc++;
if (menuwe)
makesuffix(1);
}
}
if (minfo.we && m->ripre && isset(AUTOPARAMKEYS))
makeparamsuffix(((m->flags & CMF_PARBR) ? 1 : 0), minfo.insc - parq);
if (menuwe && m->ripre && isset(AUTOPARAMKEYS))
makeparamsuffix(((m->flags & CMF_PARBR) ? 1 : 0), menuinsc - parq);
if ((menucmp && !minfo.we) || !movetoend)
cs = minfo.end;
{
Cmatch *om = minfo.cur;
struct chdata dat;
dat.matches = amatches;
dat.num = nmatches;
dat.cur = m;
if (menucmp)
minfo.cur = &m;
runhookdef(INSERTMATCHHOOK, (void *) &dat);
minfo.cur = om;
}
if ((menucmp && !menuwe) || !movetoend)
cs = menuend;
}
/* This maps the value in v into the range [0,m-1], decrementing v
@ -7707,42 +7698,40 @@ do_ambig_menu(void)
if (usemenu != 3) {
menucmp = 1;
minfo.cur = NULL;
menucur = NULL;
} else {
if (oldlist) {
if (oldins)
acceptlast();
} else
minfo.cur = NULL;
menucur = NULL;
}
if (insgroup) {
insgnum = comp_mod(insgnum, permgnum);
for (minfo.group = amatches;
minfo.group && (minfo.group)->num != insgnum + 1;
minfo.group = (minfo.group)->next);
if (!minfo.group || !(minfo.group)->mcount) {
minfo.cur = NULL;
minfo.asked = 0;
for (menugrp = amatches;
menugrp && menugrp->num != insgnum + 1;
menugrp = menugrp->next);
if (!menugrp || !menugrp->mcount) {
menucur = NULL;
return;
}
insmnum = comp_mod(insmnum, (minfo.group)->mcount);
insmnum = comp_mod(insmnum, menugrp->mcount);
} else {
int c = 0;
insmnum = comp_mod(insmnum, permmnum);
for (minfo.group = amatches;
minfo.group && (c += (minfo.group)->mcount) <= insmnum;
minfo.group = (minfo.group)->next)
insmnum -= (minfo.group)->mcount;
if (!minfo.group) {
minfo.cur = NULL;
minfo.asked = 0;
for (menugrp = amatches;
menugrp && (c += menugrp->mcount) <= insmnum;
menugrp = menugrp->next)
insmnum -= menugrp->mcount;
if (!menugrp) {
menucur = NULL;
return;
}
}
mc = (minfo.group)->matches + insmnum;
mc = menugrp->matches + insmnum;
do_single(*mc);
minfo.cur = mc;
menucur = mc;
}
/* Return the length of the common prefix of s and t. */
@ -7781,7 +7770,7 @@ sfxlen(char *s, char *t)
* It returns the number of lines printed. */
/**/
int
static int
printfmt(char *fmt, int n, int dopr)
{
char *p = fmt, nc[DIGBUFSIZE];
@ -7864,8 +7853,7 @@ printfmt(char *fmt, int n, int dopr)
/* This skips over matches that are not to be listed. */
/**/
Cmatch *
static Cmatch *
skipnolist(Cmatch *p)
{
while (*p && ((*p)->flags & CMF_NOLIST))
@ -7880,7 +7868,11 @@ skipnolist(Cmatch *p)
void
listmatches(void)
{
struct chdata dat;
Cmgroup g;
Cmatch *p, m;
Cexpl *e;
int nlines = 0, ncols, nlist = 0, longest = 1, pnl = 0;
int of = isset(LISTTYPES), opl = 0;
#ifdef DEBUG
/* Sanity check */
@ -7890,22 +7882,6 @@ listmatches(void)
}
#endif
dat.matches = amatches;
dat.num = nmatches;
dat.cur = NULL;
runhookdef(LISTMATCHESHOOK, (void *) &dat);
}
/**/
int
ilistmatches(Hookdef dummy, Chdata dat)
{
Cmgroup g;
Cmatch *p, m;
Cexpl *e;
int nlines = 0, ncols, nlist = 0, longest = 1, pnl = 0;
int of = isset(LISTTYPES), opl = 0;
/* Set the cursor below the prompt. */
trashzle();
showinglist = listshown = 0;
@ -7990,9 +7966,8 @@ ilistmatches(Hookdef dummy, Chdata dat)
}
/* Maybe we have to ask if the user wants to see the list. */
if ((!minfo.cur || !minfo.asked) &&
((complistmax && nlist > complistmax) ||
(!complistmax && nlines >= lines))) {
if ((complistmax && nlist > complistmax) ||
(!complistmax && nlines >= lines)) {
int qup;
zsetterm();
qup = printfmt("zsh: do you wish to see all %n possibilities? ", nlist, 1);
@ -8006,9 +7981,7 @@ ilistmatches(Hookdef dummy, Chdata dat)
tcmultout(TCUP, TCMULTUP, nlnct);
} else
putc('\n', shout);
if (minfo.cur)
minfo.asked = 2;
return 0;
return;
}
if (clearflag) {
putc('\r', shout);
@ -8018,8 +7991,6 @@ ilistmatches(Hookdef dummy, Chdata dat)
} else
putc('\n', shout);
settyinfo(&shttyinfo);
if (minfo.cur)
minfo.asked = 1;
}
/* Now print the matches. */
@ -8139,7 +8110,6 @@ ilistmatches(Hookdef dummy, Chdata dat)
clearflag = 0, putc('\n', shout);
} else
putc('\n', shout);
return 0;
}
/* This is used to print expansions. */
@ -8149,9 +8119,9 @@ void
listlist(LinkList l)
{
struct cmgroup dg;
Cmgroup am = amatches;
int vl = validlist, sm = smatches;
char *oclp = complastprompt;
Cmgroup am = amatches;
if (listshown)
showagain = 1;
@ -8159,12 +8129,12 @@ listlist(LinkList l)
complastprompt = ((zmult == 1) == !!isset(ALWAYSLASTPROMPT) ? "yes" : NULL);
smatches = 1;
validlist = 1;
amatches = &dg;
memset(&dg, 0, sizeof(struct cmgroup));
dg.ylist = (char **) makearray(l, 1, &(dg.lcount), NULL);
amatches = &dg;
ilistmatches(NULL, NULL);
amatches = am;
listmatches();
amatches = am;
validlist = vl;
smatches = sm;
complastprompt = oclp;
@ -8251,8 +8221,10 @@ magicspace(char **args)
int
expandhistory(char **args)
{
if (!doexpandhist())
if (!doexpandhist()) {
feep();
return 1;
}
return 0;
}
@ -8304,8 +8276,10 @@ processcmd(char **args)
int m = zmult;
s = getcurcmd();
if (!s)
if (!s) {
feep();
return 1;
}
zmult = 1;
pushline(zlenoargs);
zmult = m;
@ -8330,12 +8304,16 @@ expandcmdpath(char **args)
noaliases = 1;
s = getcurcmd();
noaliases = na;
if (!s || cmdwb < 0 || cmdwe < cmdwb)
if (!s || cmdwb < 0 || cmdwe < cmdwb) {
feep();
return 1;
}
str = findcmd(s, 1);
zsfree(s);
if (!str)
if (!str) {
feep();
return 1;
}
cs = cmdwb;
foredel(cmdwe - cmdwb);
spaceinline(strlen(str));

View file

@ -409,11 +409,19 @@ showmsg(char const *msg)
/* handle the error flag */
/**/
int
handlefeep(char **args)
void
feep(void)
{
zbeep();
return 0;
feepflag = 1;
}
/**/
void
handlefeep(void)
{
if(feepflag)
zbeep();
feepflag = 0;
}
/***************/
@ -551,8 +559,10 @@ undo(char **args)
{
handleundo();
do {
if(!curchange->prev)
if(!curchange->prev) {
feep();
return 1;
}
unapplychange(curchange = curchange->prev);
} while(curchange->flags & CH_PREV);
setlastline();
@ -588,8 +598,10 @@ redo(char **args)
{
handleundo();
do {
if(!curchange->next)
if(!curchange->next) {
feep();
return 1;
}
applychange(curchange);
curchange = curchange->next;
} while(curchange->prev->flags & CH_NEXT);

View file

@ -102,8 +102,10 @@ vigetkey(void)
char m[3], *str;
Thingy cmd;
if((c = getkey(0)) == EOF)
if((c = getkey(0)) == EOF) {
feep();
return -1;
}
m[0] = c;
metafy(m, 1, META_NOALLOC);
@ -113,10 +115,13 @@ vigetkey(void)
cmd = t_undefinedkey;
if (!cmd || cmd == Th(z_sendbreak)) {
feep();
return -1;
} else if (cmd == Th(z_quotedinsert)) {
if ((c = getkey(0)) == EOF)
if ((c = getkey(0)) == EOF) {
feep();
return -1;
}
} else if(cmd == Th(z_viquotedinsert)) {
char sav = line[cs];
@ -124,8 +129,10 @@ vigetkey(void)
zrefresh();
c = getkey(0);
line[cs] = sav;
if(c == EOF)
if(c == EOF) {
feep();
return -1;
}
} else if (cmd == Th(z_vicmdmode))
return -1;
return c;
@ -135,7 +142,7 @@ vigetkey(void)
static int
getvirange(int wf)
{
int pos = cs, ret = 0;
int pos = cs;
int mult1 = zmult, hist1 = histline;
Thingy k2;
@ -161,37 +168,39 @@ getvirange(int wf)
k2 == Th(z_sendbreak)) {
wordflag = 0;
virangeflag = 0;
feep();
return -1;
}
/*
* With k2 == bindk, the command key is repeated:
* a number of lines is used. If the function used
* returns 1, we fail.
*/
if ((k2 == bindk) ? dovilinerange() : execzlefunc(k2, zlenoargs))
ret = -1;
if(k2 == bindk)
/* The command key is repeated: a number of lines is used. */
dovilinerange();
else
execzlefunc(k2, zlenoargs);
if(vichgrepeat)
zmult = mult1;
else
zmult = mult1 * zmod.tmult;
} while(prefixflag && !ret);
} while(prefixflag);
wordflag = 0;
virangeflag = 0;
/* It is an error to use a non-movement command to delimit the *
* range. We here reject the case where the command modified *
* the line, or selected a different history line. */
if (histline != hist1 || ll != lastll || memcmp(line, lastline, ll)) {
if(histline != hist1 || ll != lastll || memcmp(line, lastline, ll)) {
histline = hist1;
memcpy(line, lastline, ll = lastll);
cs = pos;
feep();
return -1;
}
/* Can't handle an empty file. Also, if the movement command *
* failed, or didn't move, it is an error. */
if (!ll || (cs == pos && virangeflag != 2) || ret == -1)
if (!ll || (cs == pos && virangeflag != 2)) {
feep();
return -1;
}
/* vi-match-bracket changes the value of virangeflag when *
* moving to the opening bracket, meaning that we need to *
@ -224,7 +233,7 @@ getvirange(int wf)
}
/**/
static int
static void
dovilinerange(void)
{
int pos = cs, n = zmult;
@ -234,14 +243,17 @@ dovilinerange(void)
* downward, otherwise upward. The repeat count gives the *
* number of lines. */
vilinerange = 1;
if (!n)
return 1;
if (!n) {
feep();
return;
}
if (n > 0) {
while(n-- && cs <= ll)
cs = findeol() + 1;
if (n != -1) {
cs = pos;
return 1;
feep();
return;
}
cs--;
} else {
@ -249,12 +261,12 @@ dovilinerange(void)
cs = findbol() - 1;
if (n != 1) {
cs = pos;
return 1;
feep();
return;
}
cs++;
}
virangeflag = 2;
return 0;
}
/**/
@ -297,12 +309,11 @@ viinsertbol(char **args)
int
videlete(char **args)
{
int c2, ret = 1;
int c2;
startvichange(1);
if ((c2 = getvirange(0)) != -1) {
forekill(c2 - cs, 0);
ret = 0;
if (vilinerange && ll) {
if (cs == ll)
cs--;
@ -311,7 +322,7 @@ videlete(char **args)
}
}
vichgflag = 0;
return ret;
return 0;
}
/**/
@ -330,8 +341,10 @@ videletechar(char **args)
return ret;
}
/* it is an error to be on the end of line */
if (cs == ll || line[cs] == '\n')
if (cs == ll || line[cs] == '\n') {
feep();
return 1;
}
/* Put argument into the acceptable range -- it is not an error to *
* specify a greater count than the number of available characters. */
if (n > findeol() - cs)
@ -345,17 +358,16 @@ videletechar(char **args)
int
vichange(char **args)
{
int c2, ret = 1;
int c2;
startvichange(1);
if ((c2 = getvirange(1)) != -1) {
ret = 0;
forekill(c2 - cs, 0);
selectkeymap("main", 1);
viinsbegin = cs;
undoing = 0;
}
return ret;
return 0;
}
/**/
@ -365,11 +377,15 @@ visubstitute(char **args)
int n = zmult;
startvichange(1);
if (n < 0)
if (n < 0) {
feep();
return 1;
}
/* it is an error to be on the end of line */
if (cs == ll || line[cs] == '\n')
if (cs == ll || line[cs] == '\n') {
feep();
return 1;
}
/* Put argument into the acceptable range -- it is not an error to *
* specify a greater count than the number of available characters. */
if (n > findeol() - cs)
@ -420,8 +436,10 @@ viyankeol(char **args)
int x = findeol();
startvichange(-1);
if (x == cs)
if (x == cs) {
feep();
return 1;
}
cut(cs, x - cs, 0);
return 0;
}
@ -438,6 +456,7 @@ viyankwholeline(char **args)
return 1;
while(n--) {
if (cs > ll) {
feep();
cs = oldcs;
return 1;
}
@ -479,18 +498,23 @@ vireplacechars(char **args)
startvichange(1);
/* check argument range */
if (n < 1 || n + cs > findeol()) {
if(vichgrepeat)
if(vichgrepeat) {
int ofeep = feepflag;
vigetkey();
feepflag = ofeep;
}
if(vichgflag) {
free(vichgbuf);
vichgbuf = NULL;
vichgflag = 0;
}
feep();
return 1;
}
/* get key */
if((ch = vigetkey()) == -1) {
vichgflag = 0;
feep();
return 1;
}
/* do change */
@ -513,7 +537,7 @@ int
vicmdmode(char **args)
{
if (invicmdmode() || selectkeymap("vicmd", 0))
return 1;
feep();
undoing = 1;
vichgflag = 0;
if (cs != findbol())
@ -549,7 +573,7 @@ viopenlineabove(char **args)
int
vioperswapcase(char **args)
{
int oldcs, c2, ret = 1;
int oldcs, c2;
/* get the range */
startvichange(1);
@ -565,13 +589,12 @@ vioperswapcase(char **args)
}
/* go back to the first line of the range */
cs = oldcs;
ret = 0;
#if 0
vifirstnonblank();
#endif
}
vichgflag = 0;
return ret;
return 0;
}
/**/
@ -579,8 +602,10 @@ int
virepeatchange(char **args)
{
/* make sure we have a change to repeat */
if (!vichgbuf || vichgflag)
if (!vichgbuf || vichgflag) {
feep();
return 1;
}
/* restore or update the saved count and buffer */
if (zmod.flags & MOD_MULT) {
lastmod.mult = zmod.mult;
@ -612,6 +637,7 @@ viindent(char **args)
vichgflag = 0;
/* must be a line range */
if (!vilinerange) {
feep();
cs = oldcs;
return 1;
}
@ -643,6 +669,7 @@ viunindent(char **args)
vichgflag = 0;
/* must be a line range */
if (!vilinerange) {
feep();
cs = oldcs;
return 1;
}
@ -678,6 +705,7 @@ vibackwarddeletechar(char **args)
/* It is an error to be at the beginning of the line, or (in *
* insert mode) to delete past the beginning of insertion. */
if ((!invicmdmode() && cs - n < viinsbegin) || cs == findbol()) {
feep();
return 1;
}
/* Put argument into the acceptable range -- it is not an error to *
@ -693,8 +721,10 @@ vibackwarddeletechar(char **args)
int
vikillline(char **args)
{
if (viinsbegin > cs)
if (viinsbegin > cs) {
feep();
return 1;
}
backdel(cs - viinsbegin);
return 0;
}
@ -711,8 +741,10 @@ viputbefore(char **args)
return 1;
if (zmod.flags & MOD_VIBUF)
buf = &vibuf[zmod.vibuf];
if (!buf->buf)
if (!buf->buf) {
feep();
return 1;
}
if(buf->flags & CUTBUFFER_LINE) {
cs = findbol();
spaceinline(buf->len + 1);
@ -743,8 +775,10 @@ viputafter(char **args)
return 1;
if (zmod.flags & MOD_VIBUF)
buf = &vibuf[zmod.vibuf];
if (!buf->buf)
if (!buf->buf) {
feep();
return 1;
}
if(buf->flags & CUTBUFFER_LINE) {
cs = findeol();
spaceinline(buf->len + 1);
@ -772,8 +806,10 @@ vijoin(char **args)
int x;
startvichange(-1);
if ((x = findeol()) == ll)
if ((x = findeol()) == ll) {
feep();
return 1;
}
cs = x + 1;
for (x = 1; cs != ll && iblank(line[cs]); cs++, x++);
backdel(x);
@ -830,8 +866,10 @@ visetbuffer(char **args)
if ((zmod.flags & MOD_VIBUF) ||
(((ch = getkey(0)) < '1' || ch > '9') &&
(ch < 'a' || ch > 'z') && (ch < 'A' || ch > 'Z')))
(ch < 'a' || ch > 'z') && (ch < 'A' || ch > 'Z'))) {
feep();
return 1;
}
if (ch >= 'A' && ch <= 'Z') /* needed in cut() */
zmod.flags |= MOD_VIAPP;
else
@ -851,6 +889,7 @@ vikilleol(char **args)
startvichange(-1);
if (!n) {
/* error -- line already empty */
feep();
return 1;
}
/* delete to end of line */
@ -902,9 +941,10 @@ viquotedinsert(char **args)
zsetterm();
#endif
foredel(1);
if(c < 0)
if(c < 0) {
feep();
return 1;
else
} else
return selfinsert(args);
}

View file

@ -300,8 +300,10 @@ vibackwardkillword(char **args)
int x = cs, lim = (viinsbegin > findbol()) ? viinsbegin : findbol();
int n = zmult;
if (n < 0)
if (n < 0) {
feep();
return 1;
}
/* this taken from "vibackwardword" */
while (n--) {
while ((x > lim) && iblank(line[x - 1]))
@ -477,16 +479,22 @@ transposewords(char **args)
x = cs;
while (x && line[x - 1] != '\n' && !iword(line[x]))
x--;
if (!x || line[x - 1] == '\n')
if (!x || line[x - 1] == '\n') {
feep();
return 1;
}
}
for (p4 = x; p4 != ll && iword(line[p4]); p4++);
for (p3 = p4; p3 && iword(line[p3 - 1]); p3--);
if (!p3)
if (!p3) {
feep();
return 1;
}
for (p2 = p3; p2 && !iword(line[p2 - 1]); p2--);
if (!p2)
if (!p2) {
feep();
return 1;
}
for (p1 = p2; p1 && iword(line[p1 - 1]); p1--);
pp = temp = (char *)zhalloc(p4 - p1 + 1);
struncpy(&pp, (char *) line + p3, p4 - p3);

View file

@ -50,7 +50,7 @@ static struct builtin builtins[] =
BUILTIN("cd", 0, bin_cd, 0, 2, BIN_CD, NULL, NULL),
BUILTIN("chdir", 0, bin_cd, 0, 2, BIN_CD, NULL, NULL),
BUILTIN("continue", BINF_PSPECIAL, bin_break, 0, 1, BIN_CONTINUE, NULL, NULL),
BUILTIN("declare", BINF_TYPEOPTS | BINF_MAGICEQUALS | BINF_PSPECIAL, bin_typeset, 0, -1, 0, "ALRTUZafgilrtux", NULL),
BUILTIN("declare", BINF_TYPEOPTS | BINF_MAGICEQUALS | BINF_PSPECIAL, bin_typeset, 0, -1, 0, "ALRTUZafilrtux", NULL),
BUILTIN("dirs", 0, bin_dirs, 0, -1, 0, "v", NULL),
BUILTIN("disable", 0, bin_enable, 0, -1, BIN_DISABLE, "afmr", NULL),
BUILTIN("disown", 0, bin_fg, 0, -1, BIN_DISOWN, NULL, NULL),
@ -60,7 +60,7 @@ static struct builtin builtins[] =
BUILTIN("enable", 0, bin_enable, 0, -1, BIN_ENABLE, "afmr", NULL),
BUILTIN("eval", BINF_PSPECIAL, bin_eval, 0, -1, BIN_EVAL, NULL, NULL),
BUILTIN("exit", BINF_PSPECIAL, bin_break, 0, 1, BIN_EXIT, NULL, NULL),
BUILTIN("export", BINF_TYPEOPTS | BINF_MAGICEQUALS | BINF_PSPECIAL, bin_typeset, 0, -1, BIN_EXPORT, "LRTUZafilrtu", "xg"),
BUILTIN("export", BINF_TYPEOPTS | BINF_MAGICEQUALS | BINF_PSPECIAL, bin_typeset, 0, -1, BIN_EXPORT, "LRTUZafilrtu", "x"),
BUILTIN("false", 0, bin_false, 0, -1, 0, NULL, NULL),
BUILTIN("fc", BINF_FCOPTS, bin_fc, 0, -1, BIN_FC, "nlreIRWAdDfEim", NULL),
BUILTIN("fg", 0, bin_fg, 0, -1, BIN_FG, NULL, NULL),
@ -74,7 +74,7 @@ static struct builtin builtins[] =
#endif
BUILTIN("history", 0, bin_fc, 0, -1, BIN_FC, "nrdDfEim", "l"),
BUILTIN("integer", BINF_TYPEOPTS | BINF_MAGICEQUALS | BINF_PSPECIAL, bin_typeset, 0, -1, 0, "glrtux", "i"),
BUILTIN("integer", BINF_TYPEOPTS | BINF_MAGICEQUALS | BINF_PSPECIAL, bin_typeset, 0, -1, 0, "lrtux", "i"),
BUILTIN("jobs", 0, bin_fg, 0, -1, BIN_JOBS, "dlpZrs", NULL),
BUILTIN("kill", 0, bin_kill, 0, -1, 0, NULL, NULL),
BUILTIN("let", 0, bin_let, 1, -1, 0, NULL, NULL),
@ -93,7 +93,7 @@ static struct builtin builtins[] =
BUILTIN("pwd", 0, bin_pwd, 0, 0, 0, "rLP", NULL),
BUILTIN("r", BINF_R, bin_fc, 0, -1, BIN_FC, "nrl", NULL),
BUILTIN("read", 0, bin_read, 0, -1, 0, "rzu0123456789pkqecnAlE", NULL),
BUILTIN("readonly", BINF_TYPEOPTS | BINF_MAGICEQUALS | BINF_PSPECIAL, bin_typeset, 0, -1, 0, "ALRTUZafgiltux", "r"),
BUILTIN("readonly", BINF_TYPEOPTS | BINF_MAGICEQUALS | BINF_PSPECIAL, bin_typeset, 0, -1, 0, "ALRTUZafiltux", "r"),
BUILTIN("rehash", 0, bin_hash, 0, 0, 0, "dfv", "r"),
BUILTIN("return", BINF_PSPECIAL, bin_break, 0, 1, BIN_RETURN, NULL, NULL),
BUILTIN("set", BINF_PSPECIAL, bin_set, 0, -1, 0, NULL, NULL),
@ -107,7 +107,7 @@ static struct builtin builtins[] =
BUILTIN("trap", BINF_PSPECIAL, bin_trap, 0, -1, 0, NULL, NULL),
BUILTIN("true", 0, bin_true, 0, -1, 0, NULL, NULL),
BUILTIN("type", 0, bin_whence, 0, -1, 0, "ampfsw", "v"),
BUILTIN("typeset", BINF_TYPEOPTS | BINF_MAGICEQUALS | BINF_PSPECIAL, bin_typeset, 0, -1, 0, "ALRTUZafgilrtuxm", NULL),
BUILTIN("typeset", BINF_TYPEOPTS | BINF_MAGICEQUALS | BINF_PSPECIAL, bin_typeset, 0, -1, 0, "ALRTUZafilrtuxm", NULL),
BUILTIN("umask", 0, bin_umask, 0, 1, 0, "S", NULL),
BUILTIN("unalias", 0, bin_unhash, 1, -1, 0, "m", "a"),
BUILTIN("unfunction", 0, bin_unhash, 1, -1, 0, "m", "f"),
@ -120,9 +120,7 @@ static struct builtin builtins[] =
BUILTIN("which", 0, bin_whence, 0, -1, 0, "ampsw", "c"),
#ifdef DYNAMIC
BUILTIN("zmodload", 0, bin_zmodload, 0, -1, 0, "ILabcdipue", NULL),
#else
BUILTIN("zmodload", 0, bin_zmodload, 0, -1, 0, "e", NULL),
BUILTIN("zmodload", 0, bin_zmodload, 0, -1, 0, "ILabcdipu", NULL),
#endif
};
@ -1494,14 +1492,8 @@ typeset_single(char *cname, char *pname, Param pm, int func,
{
int usepm, tc, keeplocal = 0;
/*
* Do we use the existing pm? Note that this isn't the end of the
* story, because if we try and create a new pm at the same
* locallevel as an unset one we use the pm struct anyway: that's
* handled in createparam(). Here we just avoid using it for the
* present tests if it's unset.
*/
usepm = pm && !(pm->flags & PM_UNSET);
/* use the existing pm? */
usepm = pm && !(pm->flags & (PM_UNSET | PM_AUTOLOAD));
/* Always use an existing pm if special at current locallevel */
if (pm && (pm->flags & PM_SPECIAL) && pm->level == locallevel)
@ -1510,15 +1502,15 @@ typeset_single(char *cname, char *pname, Param pm, int func,
/*
* Don't use a non-special existing param if
* - the local level has changed, and
* - we are really locallizing the parameter
* - the function is not `export'.
*/
if (usepm && !(pm->flags & PM_SPECIAL) &&
locallevel != pm->level && (on & PM_LOCAL))
locallevel != pm->level && func != BIN_EXPORT)
usepm = 0;
/* attempting a type conversion, or making a tied colonarray? */
if ((tc = usepm && (((off & pm->flags) | (on & ~pm->flags)) &
(PM_INTEGER|PM_HASHED|PM_ARRAY|PM_TIED|PM_AUTOLOAD))))
(PM_INTEGER|PM_HASHED|PM_ARRAY|PM_TIED))))
usepm = 0;
if (tc && (pm->flags & PM_SPECIAL)) {
zerrnam(cname, "%s: can't change type of a special parameter",
@ -1527,7 +1519,6 @@ typeset_single(char *cname, char *pname, Param pm, int func,
}
if (usepm) {
on &= ~PM_LOCAL;
if (!on && !roff && !value) {
paramtab->printnode((HashNode)pm, 0);
return pm;
@ -1614,7 +1605,7 @@ typeset_single(char *cname, char *pname, Param pm, int func,
if (keeplocal)
pm->level = keeplocal;
else if (on & PM_LOCAL)
else if (func != BIN_EXPORT)
pm->level = locallevel;
if (value && !(pm->flags & (PM_ARRAY|PM_HASHED)))
setsparam(pname, ztrdup(value));
@ -1687,9 +1678,6 @@ bin_typeset(char *name, char **argv, char *ops, int func)
return 0;
}
if (!ops['g'])
on |= PM_LOCAL;
if (on & PM_TIED) {
Param apm;
struct asgment asg0;
@ -3086,7 +3074,7 @@ bin_emulate(char *nam, char **argv, char *ops, int func)
{
emulate(*argv, ops['R']);
if (ops['L'])
opts[LOCALOPTIONS] = opts[LOCALTRAPS] = 1;
dosetopt(LOCALOPTIONS, 1, 0);
return 0;
}

View file

@ -901,9 +901,6 @@ execpline(Sublist l, int how, int last1)
DPUTS(!list_pipe_pid, "invalid list_pipe_pid");
addproc(list_pipe_pid, list_pipe_text);
if (!jn->procs->next)
jn->gleader = mypgrp;
for (pn = jobtab[jn->other].procs; pn; pn = pn->next)
if (WIFSTOPPED(pn->status))
break;
@ -917,10 +914,8 @@ execpline(Sublist l, int how, int last1)
jn->stat |= STAT_STOPPED | STAT_CHANGED;
printjob(jn, !!isset(LONGLISTJOBS), 1);
}
else if (newjob != list_pipe_job)
deletejob(jn);
else
lastwj = -1;
deletejob(jn);
}
for (; !nowait;) {
@ -936,10 +931,7 @@ execpline(Sublist l, int how, int last1)
lastval2 & 0200)
killpg(mypgrp, lastval2 & ~0200);
if ((list_pipe || last1 || pline_level) &&
!list_pipe_child &&
((jn->stat & STAT_STOPPED) ||
(list_pipe_job && pline_level &&
(jobtab[list_pipe_job].stat & STAT_STOPPED)))) {
!list_pipe_child && jn->stat & STAT_STOPPED) {
pid_t pid;
int synch[2];
@ -965,28 +957,22 @@ execpline(Sublist l, int how, int last1)
close(synch[1]);
read(synch[0], &dummy, 1);
close(synch[0]);
/* If this job has finished, we leave it as a
* normal (non-super-) job. */
if (!(jn->stat & STAT_DONE)) {
jobtab[list_pipe_job].other = newjob;
jobtab[list_pipe_job].stat |= STAT_SUPERJOB;
jn->stat |= STAT_SUBJOB | STAT_NOPRINT;
jn->other = pid;
}
if ((list_pipe || last1) && jobtab[list_pipe_job].procs)
jobtab[list_pipe_job].other = newjob;
jobtab[list_pipe_job].stat |= STAT_SUPERJOB;
jn->stat |= STAT_SUBJOB | STAT_NOPRINT;
jn->other = pid;
if (list_pipe || last1)
killpg(jobtab[list_pipe_job].gleader, SIGSTOP);
break;
}
else {
close(synch[0]);
entersubsh(Z_ASYNC, 0, 0);
if (jobtab[list_pipe_job].procs)
setpgrp(0L, mypgrp = jobtab[list_pipe_job].gleader);
setpgrp(0L, mypgrp = jobtab[list_pipe_job].gleader);
close(synch[1]);
kill(getpid(), SIGSTOP);
list_pipe = 0;
list_pipe_child = 1;
opts[INTERACTIVE] = 0;
break;
}
}
@ -2208,9 +2194,8 @@ entersubsh(int how, int cl, int fake)
attachtty(jobtab[thisjob].gleader);
}
}
else if (!(list_pipe || list_pipe_child || pline_level > 1) &&
(!jobtab[thisjob].gleader ||
setpgrp(0L, jobtab[thisjob].gleader) == -1)) {
else if (!jobtab[thisjob].gleader ||
(setpgrp(0L, jobtab[thisjob].gleader) == -1)) {
jobtab[thisjob].gleader = getpid();
if (list_pipe_job != thisjob &&
!jobtab[list_pipe_job].gleader)
@ -2798,13 +2783,14 @@ execshfunc(Cmd cmd, Shfunc shf, LinkList args)
if (errflag)
return;
if (!list_pipe && thisjob != list_pipe_job) {
if (!list_pipe) {
/* Without this deletejob the process table *
* would be filled by a recursive function. */
last_file_list = jobtab[thisjob].filelist;
jobtab[thisjob].filelist = NULL;
deletejob(jobtab + thisjob);
}
if (isset(XTRACE)) {
LinkNode lptr;
printprompt4();
@ -2883,7 +2869,7 @@ doshfunc(char *name, List list, LinkList doshargs, int flags, int noreturnval)
{
char **tab, **x, *oargv0 = NULL;
int oldzoptind, oldlastval;
char saveopts[OPT_SIZE], *oldscriptname;
char saveopts[OPT_SIZE];
int obreaks = breaks;
HEAPALLOC {
@ -2895,8 +2881,6 @@ doshfunc(char *name, List list, LinkList doshargs, int flags, int noreturnval)
starttrapscope();
tab = pparams;
oldscriptname = scriptname;
scriptname = name;
oldzoptind = zoptind;
zoptind = 1;
@ -2939,7 +2923,6 @@ doshfunc(char *name, List list, LinkList doshargs, int flags, int noreturnval)
argzero = oargv0;
}
zoptind = oldzoptind;
scriptname = oldscriptname;
pparams = tab;
if (isset(LOCALOPTIONS)) {

View file

@ -1993,7 +1993,7 @@ dyncat(char *s1, char *s2)
char *ptr;
int l1 = strlen(s1);
ptr = (char *)zhalloc(l1 + strlen(s2) + 1);
ptr = (char *)ncalloc(l1 + strlen(s2) + 1);
strcpy(ptr, s1);
strcpy(ptr + l1, s2);
return ptr;

View file

@ -133,7 +133,6 @@ deletehashtable(HashTable ht)
ht->last->next = ht->next;
else
firstht = ht->next;
zsfree(ht->tablename);
#endif /* ZSH_HASH_DEBUG */
zfree(ht->nodes, ht->hsize * sizeof(HashNode));
zfree(ht, sizeof(*ht));

View file

@ -390,16 +390,7 @@ init_io(void)
#ifdef JOB_CONTROL
/* If interactive, make the shell the foreground process */
if (opts[MONITOR] && interact && (SHTTY != -1)) {
/* Since we now sometimes execute programs in the process group
* of the parent shell even when using job-control, we have to
* make sure that we run in our own process group. Otherwise if
* we are called from a program that doesn't put us in our own
* group a SIGTSTP that we ignore might stop our parent process.
* Instead of the two calls below we once had:
* attachtty(GETPGRP());
*/
attachtty(getpid());
setpgrp(0L, 0L);
attachtty(GETPGRP());
if ((mypgrp = GETPGRP()) > 0) {
while ((ttpgrp = gettygrp()) != -1 && ttpgrp != mypgrp) {
sleep(1);

View file

@ -92,13 +92,9 @@ makerunning(Job jn)
jn->stat &= ~STAT_STOPPED;
for (pn = jn->procs; pn; pn = pn->next)
#if 0
if (WIFSTOPPED(pn->status) &&
(!(jn->stat & STAT_SUPERJOB) || pn->next))
pn->status = SP_RUNNING;
#endif
if (WIFSTOPPED(pn->status))
pn->status = SP_RUNNING;
if (jn->stat & STAT_SUPERJOB)
makerunning(jobtab + jn->other);
@ -185,9 +181,8 @@ update_job(Job jn)
for (i = 1; i < MAXJOB; i++)
if ((jobtab[i].stat & STAT_SUPERJOB) &&
jobtab[i].other == job &&
jobtab[i].gleader) {
killpg(jobtab[i].gleader, SIGTSTP);
jobtab[i].other == job) {
killpg(jobtab[i].gleader, SIGSTOP);
break;
}
}

View file

@ -378,7 +378,7 @@ execif(Cmd cmd, LinkList args, int flags)
noerrexit = olderrexit;
if (*t) {
cmdpush(*i ? (s ? CS_ELIFTHEN : CS_IFTHEN) : CS_ELSE);
cmdpush(s ? CS_ELIFTHEN : CS_IFTHEN);
execlist(*t, 1, flags & CFLAG_EXEC);
cmdpop();
} else

View file

@ -709,14 +709,7 @@ bin_zmodload(char *nam, char **args, char *ops, int func)
zwarnnam(nam, "what do you want to unload?", NULL, 0);
return 1;
}
if (ops['e'] && (ops['I'] || ops['L'] || ops['a'] || ops['d'] ||
ops['i'] || ops['u'])) {
zwarnnam(nam, "-e cannot be combined with other options", NULL, 0);
return 1;
}
if (ops['e'])
return bin_zmodload_exist(nam, args, ops);
else if (ops['d'])
if (ops['d'])
return bin_zmodload_dep(nam, args, ops);
else if ((ops['a'] || ops['b']) && !(ops['c'] || ops['p']))
return bin_zmodload_auto(nam, args, ops);
@ -732,46 +725,6 @@ bin_zmodload(char *nam, char **args, char *ops, int func)
return 1;
}
/**/
static int
bin_zmodload_exist(char *nam, char **args, char *ops)
{
LinkNode node;
Module m;
if (!*args) {
for (node = firstnode(bltinmodules); node; incnode(node)) {
nicezputs((char *) getdata(node), stdout);
putchar('\n');
}
for (node = firstnode(modules); node; incnode(node)) {
m = (Module) getdata(node);
if (m->handle && !(m->flags & MOD_UNLOAD)) {
nicezputs(m->nam, stdout);
putchar('\n');
}
}
return 0;
} else {
int ret = 0, f;
for (; !ret && *args; args++) {
f = 0;
for (node = firstnode(bltinmodules);
!f && node; incnode(node))
f = !strcmp(*args, (char *) getdata(node));
for (node = firstnode(modules);
!f && node; incnode(node)) {
m = (Module) getdata(node);
if (m->handle && !(m->flags & MOD_UNLOAD))
f = !strcmp(*args, m->nam);
}
ret = !f;
}
return ret;
}
}
/**/
static int
bin_zmodload_dep(char *nam, char **args, char *ops)
@ -1162,37 +1115,6 @@ bin_zmodload_load(char *nam, char **args, char *ops)
}
}
/**/
#else /* DYNAMIC */
/* This is the version for shells without dynamic linking. */
/**/
int
bin_zmodload(char *nam, char **args, char *ops, int func)
{
/* We understand only the -e option. */
if (ops['e']) {
LinkNode node;
if (!*args) {
for (node = firstnode(bltinmodules); node; incnode(node)) {
nicezputs((char *) getdata(node), stdout);
putchar('\n');
}
} else {
for (; *args; args++)
for (node = firstnode(bltinmodules); node; incnode(node))
if (strcmp(*args, (char *) getdata(node)))
return 1;
}
return 0;
}
/* Otherwise we return 1 -- different from the dynamic version. */
return 1;
}
/**/
#endif /* DYNAMIC */
@ -1284,180 +1206,6 @@ addconddefs(char const *nam, Conddef c, int size)
return hadf ? hads : 1;
}
/* This list of hook functions defined. */
/**/
Hookdef hooktab;
/* Find a hook definition given the name. */
/**/
Hookdef
gethookdef(char *n)
{
Hookdef p;
for (p = hooktab; p; p = p->next)
if (!strcmp(n, p->name))
return p;
return NULL;
}
/* This adds the given hook definition. The return value is zero on *
* success and 1 on failure. */
/**/
int
addhookdef(Hookdef h)
{
if (gethookdef(h->name))
return 1;
h->next = hooktab;
hooktab = h;
PERMALLOC {
h->funcs = newlinklist();
} LASTALLOC;
return 0;
}
/* This adds multiple hook definitions. This is like addbuiltins(). */
/**/
int
addhookdefs(char const *nam, Hookdef h, int size)
{
int hads = 0, hadf = 0;
while (size--) {
if (addhookdef(h)) {
zwarnnam(nam, "name clash when adding condition `%s'", h->name, 0);
hadf = 1;
} else
hads = 2;
h++;
}
return hadf ? hads : 1;
}
/* Delete hook definitions. */
/**/
int
deletehookdef(Hookdef h)
{
Hookdef p, q;
for (p = hooktab, q = NULL; p && p != h; q = p, p = p->next);
if (!p)
return 1;
if (q)
q->next = p->next;
else
hooktab = p->next;
freelinklist(p->funcs, NULL);
return 0;
}
/**/
int
deletehookdefs(char const *nam, Hookdef h, int size)
{
while (size--) {
deletehookdef(h);
h++;
}
return 1;
}
/* Add a function to a hook. */
/**/
int
addhookdeffunc(Hookdef h, Hookfn f)
{
PERMALLOC {
addlinknode(h->funcs, (void *) f);
} LASTALLOC;
return 0;
}
/**/
int
addhookfunc(char *n, Hookfn f)
{
Hookdef h = gethookdef(n);
if (h)
return addhookdeffunc(h, f);
return 1;
}
/* Delete a function from a hook. */
/**/
int
deletehookdeffunc(Hookdef h, Hookfn f)
{
LinkNode p;
for (p = firstnode(h->funcs); p; incnode(p))
if (f == (Hookfn) getdata(p)) {
remnode(h->funcs, p);
return 0;
}
return 1;
}
/**/
int
deletehookfunc(char *n, Hookfn f)
{
Hookdef h = gethookdef(n);
if (h)
return deletehookdeffunc(h, f);
return 1;
}
/* Run the function(s) for a hook. */
/**/
int
runhookdef(Hookdef h, void *d)
{
if (empty(h->funcs)) {
if (h->def)
return h->def(h, d);
return 0;
} else if (h->flags & HOOKF_ALL) {
LinkNode p;
int r;
for (p = firstnode(h->funcs); p; incnode(p))
if ((r = ((Hookfn) getdata(p))(h, d)))
return r;
if (h->def)
return h->def(h, d);
return 0;
} else
return ((Hookfn) getdata(lastnode(h->funcs)))(h, d);
}
/**/
int
runhook(char *n, void *d)
{
Hookdef h = gethookdef(n);
if (h)
return runhookdef(h, d);
return 0;
}
/* This adds the given parameter definition. The return value is zero on *
* success and 1 on failure. */

View file

@ -588,7 +588,7 @@ createparam(char *name, int flags)
DPUTS(oldpm && oldpm->level > locallevel,
"BUG: old local parameter not deleteed");
if (oldpm && (oldpm->level == locallevel || !(flags & PM_LOCAL))) {
if (oldpm && oldpm->level == locallevel) {
if (!(oldpm->flags & PM_UNSET) || (oldpm->flags & PM_SPECIAL)) {
oldpm->flags &= ~PM_UNSET;
return NULL;
@ -616,7 +616,7 @@ createparam(char *name, int flags)
pm = (Param) alloc(sizeof *pm);
pm->nam = nulstring;
}
pm->flags = flags & ~PM_LOCAL;
pm->flags = flags;
if(!(pm->flags & PM_SPECIAL))
assigngetset(pm);
@ -1898,7 +1898,7 @@ arrhashsetfn(Param pm, char **val)
* since that could cause trouble for special hashes. This way, *
* it's up to pm->sets.hfn() what to do. */
int alen = arrlen(val);
HashTable opmtab = paramtab, ht = 0;
HashTable opmtab = paramtab, ht;
char **aptr = val;
Value v = (Value) hcalloc(sizeof *v);
v->b = -1;
@ -1909,8 +1909,7 @@ arrhashsetfn(Param pm, char **val)
NULL, 0);
return;
}
if (alen)
ht = paramtab = newparamtable(17, pm->nam);
ht = paramtab = newparamtable(17, pm->nam);
while (*aptr) {
/* The parameter name is ztrdup'd... */
v->pm = createparam(*aptr, PM_SCALAR|PM_UNSET);

View file

@ -1328,15 +1328,10 @@ paramsubst(LinkList l, LinkNode n, char **str, int qt, int ssub)
else
t = aval;
} else if (!isarr) {
if (!*val && arrasg > 1) {
arr[0] = NULL;
l = 0;
} else {
arr[0] = val;
arr[1] = NULL;
l = 1;
}
arr[0] = val;
arr[1] = NULL;
t = aval = arr;
l = 1;
} else
l = arrlen(aval), t = aval;
p = a = zalloc(sizeof(char *) * (l + 1));

View file

@ -62,10 +62,9 @@ zerr(const char *fmt, const char *str, int num)
/*
* scriptname is set when sourcing scripts, so that we get the
* correct name instead of the generic name of whatever
* program/script is running. It's also set in shell functions,
* so test locallevel, too.
* program/script is running.
*/
nicezputs((isset(SHINSTDIN) && !locallevel) ? "zsh" :
nicezputs(isset(SHINSTDIN) ? "zsh" :
scriptname ? scriptname : argzero, stderr);
fputs(": ", stderr);
zerrnam(NULL, fmt, str, num);
@ -80,7 +79,7 @@ zerrnam(const char *cmd, const char *fmt, const char *str, int num)
return;
errflag = 1;
trashzle();
if (unset(SHINSTDIN) || locallevel) {
if(unset(SHINSTDIN)) {
nicezputs(scriptname ? scriptname : argzero, stderr);
fputs(": ", stderr);
}
@ -134,7 +133,7 @@ zerrnam(const char *cmd, const char *fmt, const char *str, int num)
putc(*fmt == Meta ? *++fmt ^ 32 : *fmt, stderr);
fmt++;
}
if ((unset(SHINSTDIN) || locallevel) && lineno)
if (unset(SHINSTDIN) && lineno)
fprintf(stderr, " [%ld]\n", (long)lineno);
else
putc('\n', stderr);
@ -2134,12 +2133,7 @@ mkarray(char *s)
void
zbeep(void)
{
char *vb;
if ((vb = getsparam("ZBEEP"))) {
int len;
vb = getkeystring(vb, &len, 2, NULL);
write(SHTTY, vb, len);
} else if (isset(BEEP))
if (isset(BEEP))
write(SHTTY, "\07", 1);
}

View file

@ -3,4 +3,3 @@ comp1
zle
compctl
sched
complist

View file

@ -5,8 +5,6 @@ addconddefs
addedx
addhashnode
addhistnum
addhookdefs
addhookfunc
addparamdefs
addwrapper
arrvargetfn
@ -45,8 +43,6 @@ current_limits
deletebuiltins
deleteconddefs
deletehashtable
deletehookdefs
deletehookfunc
deleteparamdefs
deleteparamtable
deletewrapper
@ -211,7 +207,6 @@ resetneeded
restoredir
reswdtab
retflag
runhookdef
runshfunc
scancountparams
scanhashtable

View file

@ -278,9 +278,8 @@ typedef struct heapstack *Heapstack;
typedef struct histent *Histent;
typedef struct forcmd *Forcmd;
typedef struct autofn *AutoFn;
typedef struct hookdef *Hookdef;
typedef struct asgment *Asgment;
typedef struct asgment *Asgment;
/********************************/
@ -888,22 +887,6 @@ struct module {
#define MOD_UNLOAD (1<<1)
#define MOD_SETUP (1<<2)
/* C-function hooks */
typedef int (*Hookfn) _((Hookdef, void *));
struct hookdef {
Hookdef next;
char *name;
Hookfn def;
int flags;
LinkList funcs;
};
#define HOOKF_ALL 1
#define HOOKDEF(name, func, flags) { NULL, name, (Hookfn) func, flags, NULL }
/* node used in parameter hash table (paramtab) */
struct param {
@ -976,13 +959,12 @@ struct param {
#define PM_UNALIASED (1<<11) /* do not expand aliases when autoloading */
#define PM_TIED (1<<12) /* array tied to colon-path or v.v. */
#define PM_LOCAL (1<<13) /* this parameter will be made local */
#define PM_SPECIAL (1<<14) /* special builtin parameter */
#define PM_DONTIMPORT (1<<15) /* do not import this variable */
#define PM_RESTRICTED (1<<16) /* cannot be changed in restricted mode */
#define PM_UNSET (1<<17) /* has null value */
#define PM_REMOVABLE (1<<18) /* special can be removed from paramtab */
#define PM_AUTOLOAD (1<<19) /* autoloaded from module */
#define PM_SPECIAL (1<<13) /* special builtin parameter */
#define PM_DONTIMPORT (1<<14) /* do not import this variable */
#define PM_RESTRICTED (1<<15) /* cannot be changed in restricted mode */
#define PM_UNSET (1<<16) /* has null value */
#define PM_REMOVABLE (1<<17) /* special can be removed from paramtab */
#define PM_AUTOLOAD (1<<18) /* autoloaded from module */
/* Flags for extracting elements of arrays and associative arrays */
#define SCANPM_WANTVALS (1<<0)

View file

@ -397,154 +397,6 @@ builtins and condition codes:
...
}
Modules can also define function hooks. Other modules can then add
functions to these hooks to make the first module call these functions
instead of the default.
Again, an array is used to define hooks:
static struct hookdef foohooks[] = {
HOOKDEF("foo", foofunc, 0),
};
The first argument of the macro is the name of the hook. This name
is used whenever the hook is used. The second argument is the default
function for the hook or NULL if no default function exists. The
last argument is used to define flags for the hook. Currently only one
such flag is defined: `HOOKF_ALL'. If this flag is given and more than
one function was added to the hook, all functions will be called
(including the default function). Otherwise only the last function
added will be called.
The functions that can be used as default functions or that can be
added to a hook have to be defined like:
/**/
static int
foofunc(Hookdef h, void *data)
{
...
}
The first argument is a pointer to the struct defining the hook. The
second argument is an arbitrary pointer that is given to the function
used to invoke hooks (see below).
The functions to register and de-register hooks look like those for
the other things that can be defined by modules:
/**/
int
boot_foo(Module m)
{
int ret;
ret = addhookdefs(m->nam, foohooks, sizeof(foohooks)/sizeof(*foohooks))
...
}
...
/**/
int
cleanup_foo(Module m)
{
deletehookdefs(m->nam, foohooks, sizeof(foohooks)/sizeof(*foohooks));
...
}
Modules that define hooks can invoke the function(s) registered for
them by calling the function `runhook(name, data)'. The first argument
is the name of the hook and the second one is the pointer given to the
hook functions as their second argument. Hooks that have the `HOOKF_ALL'
flag call all function defined for them until one returns non-zero.
The return value of `runhook()' is the return value of the last hook
function called or zero if none was called.
To add a function to a hook, the function `addhookfunc(name, func)' is
called with the name of the hook and a hook function as arguments.
Deleting them is done by calling `deletehookfunc(name, func)' with the
same arguments as for the corresponding call to `addhookfunc()'.
Alternative forms of the last three function are provided for hooks
that are changed or called very often. These functions,
`runhookdef(def, data)', `addhookdeffunc(def, func)', and
`deletehookdeffunc(def, func)' get a pointer to the `hookdef'
structure defining the hook instead of the name and otherwise behave
like their counterparts.
Modules can also define function hooks. Other modules can then add
functions to these hooks to make the first module call these functions
instead of the default.
Again, an array is used to define hooks:
static struct hookdef foohooks[] = {
HOOKDEF("foo", foofunc, 0),
};
The first argument of the macro is the name of the hook. This name
is used whenever the hook is used. The second argument is the default
function for the hook or NULL if no default function exists. The
last argument is used to define flags for the hook. Currently only one
such flag is defined: `HOOKF_ALL'. If this flag is given and more than
one function was added to the hook, all functions will be called
(including the default function). Otherwise only the last function
added will be called.
The functions that can be used as default functions or that can be
added to a hook have to be defined like:
/**/
static int
foofunc(Hookdef h, void *data)
{
...
}
The first argument is a pointer to the struct defining the hook. The
second argument is an arbitrary pointer that is given to the function
used to invoke hooks (see below).
The functions to register and de-register hooks look like those for
the other things that can be defined by modules:
/**/
int
boot_foo(Module m)
{
int ret;
ret = addhookdefs(m->nam, foohooks, sizeof(foohooks)/sizeof(*foohooks))
...
}
...
/**/
int
cleanup_foo(Module m)
{
deletehookdefs(m->nam, foohooks, sizeof(foohooks)/sizeof(*foohooks));
...
}
Modules that define hooks can invoke the function(s) registered for
them by calling the function `runhook(name, data)'. The first argument
is the name of the hook and the second one is the pointer given to the
hook functions as their second argument. Hooks that have the `HOOKF_ALL'
flag call all function defined for them until one returns non-zero.
The return value of `runhook()' is the return value of the last hook
function called or zero if none was called.
To add a function to a hook, the function `addhookfunc(name, func)' is
called with the name of the hook and a hook function as arguments.
Deleting them is done by calling `deletehookfunc(name, func)' with the
same arguments as for the corresponding call to `addhookfunc()'.
Alternative forms of the last three function are provided for hooks
that are changed or called very often. These functions,
`runhookdef(def, data)', `addhookdeffunc(def, func)', and
`deletehookdeffunc(def, func)' get a pointer to the `hookdef'
structure defining the hook instead of the name and otherwise behave
like their counterparts.
Finally, modules can define wrapper functions. These functions are
called whenever a shell function is to be executed.