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:
parent
346825df86
commit
b09922bb06
58 changed files with 740 additions and 1490 deletions
ChangeLog
Completion
Config
Doc
.distfilesMakefile.in
Zsh
.distfilesbuiltins.yocompctl.yocompsys.yomod_compctl.yomod_deltochar.yomod_zle.yomodules.yooptions.yoparams.yozle.yo
zshzftpsys.yoEtc
Src
Zle
.distfilescomp.hcompctl.cdeltochar.ciwidgets.listzle.exportzle.hzle_hist.czle_keymap.czle_main.czle_misc.czle_move.czle_params.czle_thingy.czle_tricky.czle_utils.czle_vi.czle_word.c
builtin.cexec.cglob.chashtable.cinit.cjobs.cloop.cmodule.cparams.csubst.cutils.cxmods.confzsh.exportzsh.hUtil
156
ChangeLog
156
ChangeLog
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -1,3 +1,3 @@
|
|||
DISTFILES_SRC='
|
||||
.distfiles _correct_filename _most_recent_file
|
||||
.distfiles _correct_filename _correct_word _most_recent_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] ]]
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -1 +0,0 @@
|
|||
defs.mk
|
|
@ -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'
|
||||
|
|
|
@ -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='
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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()
|
||||
|
|
|
@ -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).
|
||||
)
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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:
|
||||
|
||||
|
|
|
@ -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()
|
||||
)
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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),
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -0,0 +1,3 @@
|
|||
manpage(ZSHZFTPSYS)(1)(date())(zsh version())
|
||||
manpagename(zshzftpsys)(zftp function front-end)
|
||||
includefile(Zsh/zftpsys.yo)
|
145
Etc/FAQ.yo
145
Etc/FAQ.yo
|
@ -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),
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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");
|
||||
|
||||
|
|
|
@ -67,6 +67,8 @@ deltochar(char **args)
|
|||
}
|
||||
}
|
||||
}
|
||||
if (!ok)
|
||||
feep();
|
||||
return !ok;
|
||||
}
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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];
|
||||
|
|
|
@ -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");
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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));
|
||||
|
|
|
@ -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);
|
||||
|
|
126
Src/Zle/zle_vi.c
126
Src/Zle/zle_vi.c
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
43
Src/exec.c
43
Src/exec.c
|
@ -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)) {
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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));
|
||||
|
|
11
Src/init.c
11
Src/init.c
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
254
Src/module.c
254
Src/module.c
|
@ -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. */
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
11
Src/subst.c
11
Src/subst.c
|
@ -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));
|
||||
|
|
16
Src/utils.c
16
Src/utils.c
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -3,4 +3,3 @@ comp1
|
|||
zle
|
||||
compctl
|
||||
sched
|
||||
complist
|
||||
|
|
|
@ -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
|
||||
|
|
32
Src/zsh.h
32
Src/zsh.h
|
@ -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)
|
||||
|
|
|
@ -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.
|
||||
|
||||
|
|
Loading…
Reference in a new issue