about summary refs log tree commit diff
diff options
context:
space:
mode:
authorPeter Stephenson <pws@users.sourceforge.net>2000-11-11 19:50:27 +0000
committerPeter Stephenson <pws@users.sourceforge.net>2000-11-11 19:50:27 +0000
commitc292a3ae50bd0605b015f80266418e391c3c10fe (patch)
tree8f2baf5a9e1cb7a9615190025d9825ed9824f952
parent89d480f57d59a794d8c2e04fc5270bed13b7a28a (diff)
downloadzsh-c292a3ae50bd0605b015f80266418e391c3c10fe.tar.gz
zsh-c292a3ae50bd0605b015f80266418e391c3c10fe.tar.xz
zsh-c292a3ae50bd0605b015f80266418e391c3c10fe.zip
Sven: 13108: Handle traps synchronously
pws: 13109, 13111: clear up zle display when output produced in trap.
-rw-r--r--ChangeLog308
-rw-r--r--Doc/Zsh/mod_zle.yo28
-rw-r--r--Src/Modules/zftp.c20
-rw-r--r--Src/Modules/zpty.c4
-rw-r--r--Src/Zle/zle_main.c19
-rw-r--r--Src/Zle/zle_thingy.c16
-rw-r--r--Src/builtin.c12
-rw-r--r--Src/exec.c22
-rw-r--r--Src/init.c3
-rw-r--r--Src/input.c4
-rw-r--r--Src/jobs.c14
-rw-r--r--Src/signals.c72
-rw-r--r--Src/signals.h35
-rw-r--r--Src/utils.c30
-rw-r--r--Src/zsh.h2
15 files changed, 387 insertions, 202 deletions
diff --git a/ChangeLog b/ChangeLog
index e88efb90f..4494e7f64 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,15 @@
+2000-11-11  Peter Stephenson  <pws@pwstephenson.fsnet.co.uk>
+
+	* 13109, 13111: Doc/Zsh/mod_zle.yo, Src/Zle/zle_main.c,
+	Src/Zle/zle_thingy.c, Src/signals.c: `zle -I' allows trap code
+	to clear up display when output occurs in a trap.
+
+	* Sven: 13108: Src/Modules/zftp.c, Src/Modules/zpty.c,
+	Src/Zle/zle_main.c, Src/builtin.c, Src/exec.c, Src/init.c,
+	Src/input.c, Src/jobs.c, Src/signals.c, Src/signals.h,
+	Src/utils.c, Src/zsh.h: Execute user traps synchronously if it is
+	unsafe to execute it directly from the signal handler.
+
 2000-11-09  Clint Adams  <schizo@debian.org>
 
 	* 13125: Completion/User/_mailboxes: evaluate the mailboxes
@@ -7,14 +19,14 @@
 
 	* unposted: Src/Modules/zpty.c: use possible read character from
 	read_poll() in loop in ptyread()
-	
+
 	* 13128: Completion/Builtins/_zstyle, Completion/Core/_match,
  	Completion/Core/_path_files, Doc/Zsh/compsys.yo: aloow value
  	`pattern' for insert-unambiguous style to preserve patterns in the
  	original string; add list-suffixes style to make file completion
  	list path suffixes if possible; slightly improved completion of
  	pathnames with multiple pattern-components
-	
+
 2000-11-06  Bart Schaefer  <schaefer@zsh.org>
 
 	* 13127: Completion/User/_rcs: Test of $compstate[nmatches] was a
@@ -24,7 +36,7 @@
 
 	* 13124: Functions/Misc/nslookup: Use "command nslookup" as it's
 	now possible to call the nslookup function recursively from zpty.
-	
+
 	* unposted: Src/Modules/zpty.c: Cloned shell is non-interactive
 	for purposes of calling zexit(), so it doesn't print job status,
 	save history, etc.
@@ -54,41 +66,41 @@
 
 	* users/3503: Doc/Zsh/mod_parameter.yo, Src/jobs.c,
 	Src/Modules/parameter.c: show current/previous job in $jobstates
-	
+
 2000-11-01  Sven Wischnowsky  <wischnow@zsh.org>
 
 	* 13107: Functions/Misc/zed: don't reset just-edited trap function
  	to old value
-	
+
 2000-10-30  Sven Wischnowsky  <wischnow@zsh.org>
 
 	* 13095: Src/Modules/parameter.c: make assignament to $nameddirs
  	behave like hash -d
-	
+
 2000-10-25  Sven Wischnowsky  <wischnow@zsh.org>
 
 	* users/3472: Completion/User/_rcs: use return value of _files,
 	don't use ${PRE,SUF}FIX for globbing, complete all files as a
 	default for "co"
-	
+
 	* 13084: Src/Zle/complist.c: re-display list for cleanup only if
  	we were in menu selection
-	
+
 	* 13082: Src/Zle/complist.c, Src/Zle/compresult.c: add a counter
  	for invalidatelist() to allow finding out if there is a new list
-	
+
 2000-10-24  Sven Wischnowsky  <wischnow@zsh.org>
 
 	* 13071: Src/Zle/complist.c, Src/Zle/compresult.c: avoid printing
  	file type characters in completion lists for matches ending in a
  	slash
-	
+
 2000-10-23  Sven Wischnowsky  <wischnow@zsh.org>
 
 	* 13037: Completion/Core/_path_files, Doc/Zsh/compsys.yo: change
  	some tags used in filename completion: no tag for file-sort,
  	fake-files and ignore-parents, paths for accept-exact
-	
+
 2000-10-21  Bart Schaefer  <schaefer@zsh.org>
 
 	* 13057: Src/Zle/zle_main.c: `vared -h' should not imply `vared -e';
@@ -111,11 +123,11 @@
  	Completion/Commands/_next_tags, Completion/Core/_main_complete,
  	Completion/Core/compinit: simplify setting standard completion
  	system options using $_comp_options
-	
+
 	* 13035: Doc/Zsh/mod_zpty.yo, Functions/Misc/nslookup, Src/utils.c,
  	Src/Modules/zpty.c, Test/comptest: make non-blocking IO on ptys
  	work again; add -t option to test if command is still alive
-	
+
 2000-10-19  Wayne Davison  <wayned@users.sourceforge.net>
 
 	* 13034: Src/hist.c: Don't call histreduceblanks() if the line
@@ -129,7 +141,7 @@
 
 	* 13005: Src/Zle/computil.c: make _arguments ignore unspecified
  	non-option arguments to the right of the cursor
-	
+
 2000-10-17  Peter Stephenson  <pws@csr.com>
 
 	* Config/version.mk, Functions/Zle/.distfiles,
@@ -137,11 +149,11 @@
 
 	* Functions/Misc/zmv: in verbose mode, report if something was
 	skipped because it didn't change.
-	
+
 2000-10-16  Sven Wischnowsky  <wischnow@zsh.org>
 
 	* 13003: Test/54compmatch.ztst: add tests for the stuff in 12995
-	
+
 2000-10-13  Bart Schaefer  <schaefer@zsh.org>
 
 	* 13000: Doc/Zsh/jobs.yo: Document tty restoration when a stopped
@@ -153,7 +165,7 @@
 	* 12995: Src/Zle/compmatch.c: two completion matching fixes; wrong
  	(path) prefix matching (removed path components) and reverse order
  	of sub-strings in match-strings
-	
+
 2000-10-12  Sven Wischnowsky  <wischnow@zsh.org>
 
 	* 12974: Completion/Core/_tags, Completion/Core/_sort_tags,
@@ -163,7 +175,7 @@
 	* 12954, 12973: Completion/Builtins/_zstyle,
 	Completion/Core/_path_files, Doc/Zsh/compsys.yo: rename fake style
 	to fake-files
-	
+
 2000-10-11  Andrej Borsenkow <Andrej.Borsenkow@mow.siemens.ru>
 
 	* 12958: Cosmo <cosmo@informix.com>: aczsh.m4: fix for NCR compiler
@@ -177,39 +189,39 @@
  	Src/Zle/compresult.c:add _all_matcher completer and supporting
  	C-code for adding a special match representing all other matches;
  	remove completions style from _expand(|_word)
-	
+
 	* 12959: Src/Zle/compcore.c, Src/Zle/complist.c: make user defined
  	completion widgets leave menu selection without accepting the
  	currently selected match
-	
+
 2000-10-10  Sven Wischnowsky  <wischnow@zsh.org>
 
 	* 12948: Completion/Core/_expand: follow-up to 12942, only a
  	missing redirection
-	
+
 	* 12946: Completion/Base/_math, Completion/Base/_subscript,
  	Completion/Builtins/_vars, Completion/Builtins/_zstyle,
  	Completion/Core/_parameters, Doc/Zsh/compsys.yo: add
  	fake-parameters style to allow completing parameters which are not
  	yet set
-	
+
 	* 12942,12945: Completion/Core/_expand: temporarily remove global
  	aliases to avoid error message inside the evals
-	
+
 	* 12941: Src/Zle/compmatch.c: follow-up to 12930, make it first
  	try exact character matches, but enable it to go back to try match
  	specs if it fails after accepting such character matches
-	
+
 2000-10-09  Sven Wischnowsky  <wischnow@zsh.org>
 
 	* 12930: Src/Zle/compmatch.c: prefer exact character matches over
  	match specs (so that `nom' can match `nomatch' in _options)
-	
+
 2000-10-06  Sven Wischnowsky  <wischnow@zsh.org>
 
 	* 12919: Completion/User/_tiff, Completion/X/_xv: search for *.tif
  	files, too
-	
+
 	* 12917: Completion/Bsd/_bsd_pkg, Completion/Bsd/_kld,
  	Completion/Builtins/_autoload, Completion/Builtins/_cd,
  	Completion/Builtins/_compdef, Completion/Builtins/_popd,
@@ -219,7 +231,7 @@
  	Completion/User/_perl_modules, Completion/User/_printers,
  	Completion/User/_zdump: more option setting cleanup; remove some
  	unnecessary setopts, remove N qualifiers
-	
+
 2000-10-05  Bart Schaefer  <schaefer@zsh.org>
 
 	* 12912: Completion/Commands/_bash_completions,
@@ -234,24 +246,24 @@
 2000-10-05  Sven Wischnowsky  <wischnow@zsh.org>
 
 	* 12901: Doc/Zsh/compwid.yo, Doc/Zsh/manual.yo: cleanup for 12896
-	
+
 	* 12899: Completion/Core/_main_complete: unset cshnullglob
-	
+
 	* 12898: Src/parse.c: don't return invalid Eprog after parse error
-	
+
 	* 12897: Src/Zle/computil.c: comparguments: don't use
  	rest-argument-specification if it was inactivated
-	
+
 	* 12896: Doc/Zsh/arith.yo, Doc/Zsh/builtins.yo, Doc/Zsh/compctl.yo,
  	Doc/Zsh/compsys.yo, Doc/Zsh/compwid.yo, Doc/Zsh/expn.yo,
  	Doc/Zsh/func.yo, Doc/Zsh/mod_complist.yo: cleanup
-	
+
 	* 12892: Completion/Core/_files, Completion/Core/_path_files,
  	Doc/Zsh/compsys.yo, Doc/Zsh/expn.yo: complete after automounted
  	directories (a rather ugly hack); remove old code in _files (comma
  	separated patterns); improve docs for fake style and for comma
  	separated qualifier lists
-	
+
 2000-10-04  Tanaka Akira  <akr@zsh.org>
 
 	* 12886: Completion/User/_cvs: make _cvs_vendor_branches to handle
@@ -261,10 +273,10 @@
 
 	* 12885: Src/Zle/zle_tricky.c: don't stop parsing too early when
  	completing inside a command substitution
-	
+
 	* 12884: Src/Zle/compcore.c: don't forget a displayed list when
  	starting menu completion
-	
+
 2000-10-04  Tanaka Akira  <akr@zsh.org>
 
 	* 12872: Completion/User/_cvs: Fix modules completion when a cvsroot
@@ -418,12 +430,12 @@
 2000-09-07  Sven Wischnowsky  <wischnow@zsh.org>
 
 	* 12769: Completion/Builtins/_cd: more sensible value
-	
+
 	* 12768: as suggested by Andrej (12767): Completion/Bsd/_bsd_pkg,
 	Completion/Bsd/_kld, Completion/User/_gcc, Completion/User/_gdb,
  	Completion/User/_mailboxes, Completion/User/_zdump: stick some
  	`N's into glob patterns
-	
+
 2000-09-06  Bart Schaefer  <schaefer@zsh.org>
 
 	* 12765,12766: Doc/Zsh/builtins.yo, Doc/Zsh/contrib.yo: Eliminate
@@ -453,7 +465,7 @@
 	* 12744: Doc/Zsh/contrib.yo, Doc/Zsh/mod_complist.yo,
  	Functions/Zle/incremental-complete-word: change context for i-c-w
  	styles, update docs
-	
+
 2000-09-04  Bart Schaefer  <schaefer@zsh.org>
 
 	* 12742: Doc/.distfiles, Doc/Makefile.in, Doc/Zsh/.distfiles,
@@ -534,7 +546,7 @@
 
 	* 12717: Src/Zle/zle_tricky.c: fix for unbalanced calls to
  	{push,pop}heap in docomplete()/get_comp_string()
-	
+
 2000-08-28  Bart Schaefer  <schaefer@zsh.org>
 
 	* 12716: Doc/Zsh/builtins.yo, Doc/Zsh/compctl.yo,
@@ -546,7 +558,7 @@
 2000-08-28  Sven Wischnowsky  <wischnow@zsh.org>
 
 	* 12710: Src/exec.c: fix for `function' without names
-	
+
 2000-08-27  Oliver Kiddle  <opk@zsh.org>
 
 	* 12708: Completion/AIX/_logical_volumes: new AIX completion function
@@ -556,11 +568,11 @@
 	* 12692: Alexandre: 12691; 12692: Completion/User/_gv,
 	Completion/User/_pdf, Completion/User/_ps, Completion/User/_pspdf:
  	complete compressed files for gv; improve results from _pspdf
-	
+
 2000-08-21  Sven Wischnowsky  <wischnow@zsh.org>
 
 	* 12682: Completion/Builtins/_zmodload: use return value
-	
+
 2000-08-18  Oliver Kiddle  <opk@zsh.org>
 
 	* 12677: Completion/Builtins/_zmodload: use _arguments in _zmodload
@@ -579,7 +591,7 @@
 
 	* 12654: Doc/Zsh/mod_parameter.yo, Src/Modules/parameter.c: make
  	$modules report aliases correctly
-	
+
 	* unposted: Completion/Builtins/_pids: remove unnecessary local parameter
 
 2000-08-15  Peter Stephenson  <pws@csr.com>
@@ -597,15 +609,15 @@
 	* 12640: Completion/Builtins/_pids, Completion/Builtins/_zstyle,
  	Doc/Zsh/compsys.yo: call ps only once and be more intelligent when
  	finding the PIDs
-	
+
 	* 12635: Completion/Builtins/_pids: small improvement to allow
  	lists where the pid is not in the first column
-	
+
 2000-08-14  Bart Schaefer  <schaefer@zsh.org>
 
 	* Andrej: 12623: configure.in, Src/mkmakemod.sh, Src/zsh.h:  Fix
 	dynamic linking on cygwin, again.
-	
+
 	* 12621: Src/Zle/zle_main.c: Use ztrdup() on a string that will
 	later be freed; this appears to have been a bug ever since 9839.
 
@@ -624,10 +636,10 @@
 2000-08-14  Sven Wischnowsky  <wischnow@zsh.org>
 
 	* Andrej: 12613: Src/lex.c: missing mod_export
-	
+
 	* 12610: Src/Zle/computil.c: make all builtins in computil test if
  	they were called from a completion function
-	
+
 2000-08-13  Bart Schaefer  <schaefer@zsh.org>
 
 	* 12604: Src/compat.c, Src/system.h, Src/Modules/files.c,
@@ -653,7 +665,7 @@
 	* 12592: Completion/Core/_parameters, Src/Zle/compcore.c,
  	Src/Zle/zle_tricky.c: fixes for completion in math contexts: don't
  	quote spaces and do normal parameter expansion completion after `$'
-	
+
 2000-08-11  Peter Stephenson  <pws@csr.com>
 
 	* Config/version.mk: 3.1.9-dev-5.
@@ -695,11 +707,11 @@
 	* 12567: Completion/Linux/_rpm, Src/Zle/computil.c: handle the
  	right option in strings with multiple single-letter options (and
  	correctly handle its argument)
-	
+
 	* 12565: Completion/Core/_expand, Completion/Core/_path_files,
  	Doc/Zsh/mod_computil.yo, Src/Zle/computil.c: more fixes for
  	completion of special characters (quoting)
-	
+
 2000-08-08  Peter Stephenson  <pws@csr.com>
 
 	* unposted: Src/xmods.conf, Src/Aliases/*: Remove Src/Aliases
@@ -740,7 +752,7 @@
 
 	* 12525: Src/module.c: remove (wrong) test for linked-in modules
  	in require_module()
-	
+
 2000-08-04  Bart Schaefer  <schaefer@zsh.org>
 
 	* 12516: Src/compat.c, Src/system.h, Src/Modules/files.c,
@@ -765,16 +777,16 @@
  	Completion/Core/compdump, Src/glob.c, Src/Modules/parameter.c:
 	try to get quoting of special character (`>' and `\') right; fix
  	for pathmax in parameter.c
-	
+
 	* 12497: Doc/Zsh/builtins.yo: small fix for `read -r' doc
-	
+
 	* 12496: Completion/Core/_path_files: one more problem with
  	quoting of glob characters in filename completion
-	
+
 	* 12494: Doc/Zsh/options.yo, Src/Zle/zle_main.c: make binding of
  	^D be used in first column if ignoreeof is set and ^D is bound to
  	a shell function widget
-	
+
 2000-08-02  Peter Stephenson  <pws@csr.com>
 
 	* Andrej: 12487: configure.in, Etc/MACHINES, Src/Makefile.in,
@@ -803,29 +815,29 @@
 	* 12483: Completion/Base/_arguments, Completion/Core/_complete,
  	Doc/Zsh/compsys.yo: if compcontext is an assoc, the keys are the
  	completions and the values are their descriptions
-	
+
 	* 12475: Completion/Base/_arguments: prefer user-defined specs
  	over ones derived from --help output
-	
+
 2000-08-01  Sven Wischnowsky  <wischnow@zsh.org>
 
 	* Jan Fedak: 12463: Completion/User/_slrn: new completion function
 	for slrn
-	
+
 	* 12462: Completion/Base/_arguments: fix for automatically
  	recognised options, don't expect an argument after each of them
-	
+
 	* 12453: Completion/Bsd/_bsd_pkg, Completion/Bsd/_kld,
  	Completion/Commands/_next_tags, Completion/User/_cvs,
  	Completion/User/_mailboxes, Completion/X/_xset,
  	Completion/X/_xwit, Src/exec.c: remove tests for kshautoload (use
  	zcompile -z); fix for setting scriptname for functions that
  	redefine themselves
-	
+
 	* 12449: Completion/Base/_arguments, Completion/Base/_values,
  	Completion/Core/_complete, Doc/Zsh/compsys.yo: make $compcontext
  	more powerful and easier to use for simple cases
-	
+
 2000-07-31  Peter Stephenson  <pws@csr.com>
 
 	* Config/version.mk: 3.1.9-dev-4.
@@ -836,11 +848,11 @@
 
 	* 12439: Src/hist.c: isalpha() -> ialpha(); avoid a compiler
  	warning
-	
+
 	* 12438: Doc/Zsh/compsys.yo: clarify manual for menu style;
  	select= and yes= may be given both a number and one of the long*
  	values at the same time
-	
+
 2000-07-30  Andrew Main <zefram@zsh.org>
 
 	* 12436: Doc/Zsh/invoke.yo, Src/init.c: Make -b behave like
@@ -889,11 +901,11 @@
 
 	* 12408: Test/55arguments.ztst: fix completion test (55*) because
  	of 12394
-	
+
 	* 12405: Completion/Core/_main_complete, Doc/Zsh/compsys.yo: fix a
  	bug that started menu selection too often; fix bug for `yes=long'
  	and documentit
-	
+
 2000-07-27  Bart Schaefer  <schaefer@zsh.org>
 
 	* 12396: Functions/Misc/zed: The value of `$(functions $1)' for
@@ -903,11 +915,11 @@
 
 	* 12400: Src/Zle/computil.c: compdescribe shouldn't use the sets
  	after failed initialisation
-	
+
 	* 12394: Completion/Core/_main_complete: don't hide possible
  	completions if there is only one and at the same time messages are
  	shown
-	
+
 2000-07-26  Adam Spiers  <adam@spiers.net>
 
 	* unposted: Completion/User/_perl: -e, -I, -m and -M parameters
@@ -928,21 +940,21 @@
 	* 12370: Functions/Misc/zed: Add a context for controlling
 	completion within zed, and a style to enable tab insertion at the
 	beginnings of lines in zed by default.
-	
+
 	* 12162: Completion/Core/_expand, Completion/Core/_path_files,
 	Src/utils.c: Use `eval' instead of `$(print ...)' to suppress
 	some syntax error failures; this requires that zwarn() does not
 	trashzle() when the output is not going to the terminal.
-	
+
 2000-07-26  Sven Wischnowsky  <wischnow@zsh.org>
 
 	* 12378: Completion/Base/_arguments: make `_arguments --' use
  	specs after the `--' even for options not described in the help
  	output to get arguments
-	
+
 	* users/3337: Completion/Base/_value: allow _value:<assoc> functions to
  	override completion for all keys of an assoc
-	
+
 2000-07-24  Oliver Kiddle  <opk@zsh.org>
 
 	* 12356: Completion/User/_mh: use mhpath and mhparam instead of
@@ -952,7 +964,7 @@
 
 	* 12354: Completion/Core/_multi_parts: optimisations for
  	_multi_parts
-	
+
 2000-07-22  Clint Adams  <schizo@debian.org>
 
 	* 12347: Completion/User/_mutt: options -a, -b, and -c are
@@ -961,7 +973,7 @@
 2000-07-21  Sven Wischnowsky  <wischnow@zsh.org>
 
 	* 12337: Src/parse.c: fix parsing of `time' without a command
-	
+
 2000-07-20  Wayne Davison  <wayned@users.sourceforge.net>
 
 	* unposted: tweaked a function name in hist.c for Sven.
@@ -997,7 +1009,7 @@
 2000-07-19  Sven Wischnowsky  <wischnow@zsh.org>
 
 	* 12314: Src/Zle/compmatch.c: a bit of security for a VARARR()
-	
+
 2000-07-19  Peter Stephenson  <pws@cambridgesiliconradio.com>
 
 	* 12313: Doc/Zsh/metafaq.yo: bad phrasing corrected.
@@ -1011,7 +1023,7 @@
 	* 12297: Src/Zle/compcore.c: don't let duplicate matches keep us
  	from recognising exact matches if they produce the same string on
  	the line
-	
+
 2000-07-18  Wayne Davison  <wayned@users.sourceforge.net>
 
 	* 12295: Src/builtin.c, Src/hist.c, Src/input.c, Src/lex.c: Fixed
@@ -1032,7 +1044,7 @@
 
 	* 12266: Src/Zle/computil.c: don't treat non-option arguments as
  	options
-	
+
 2000-07-17  Wayne Davison  <wayned@users.sourceforge.net>
 
 	* 12265: Src/hist.c: Fixed gethistent().  Fixed a race condition
@@ -1053,7 +1065,7 @@
 	escapes count from the other end of the appropriate string.
 
 2000-07-13  Sven Wischnowsky  <wischnow@zsh.org>
-	
+
 	* 12243: Src/hist.c: try to get (z) parameter flag parsing for
  	conditions right
 
@@ -1062,13 +1074,13 @@
  	option-strings with multiple options; in _main_complete stop
  	trying completers when one called _message, don't display warnings
  	in such cases
-	
+
 	* 12238: Src/Zle/zle_thingy.c: fix zle widget -n num with num>9
-	
+
 	* 12237: Src/hist.c, Src/lex.c: slightly improved (z) flag for
  	parsing conditions; recognising glob flags in conditions still
  	doesn't work
-	
+
 2000-07-12  Peter Stephenson  <pws@cambridgesiliconradio.com>
 
 	* 12231: Completion/Core/compinstall: fix setting of list-prompt.
@@ -1076,10 +1088,10 @@
 2000-07-12  Sven Wischnowsky  <wischnow@zsh.org>
 
 	* 12229: Doc/Zsh/compsys.yo: fix for list-prompt docs
-	
+
 	* 12228: Src/hist.c, Src/lex.c: fix for (z) flag, don't take # as
  	comment
-	
+
 2000-07-12  Peter Stephenson  <pws@cambridgesiliconradio.com>
 
 	* 12227: Completion/Core/compinstall: add select-prompt handling
@@ -1089,9 +1101,9 @@
 
 	* 12226: Completion/Core/_main_complete: don't start menu
  	selection with only select=long
-	
+
 	* 12225: Completion/Linux/_rpm: check if options were completed
-	
+
 2000-07-11  Peter Stephenson  <pws@cambridgesiliconradio.com>
 
 	* 12222: Src/exec.c: ignore EINTR in helper processe for
@@ -1112,7 +1124,7 @@
 
 	* 12208: Completion/Core/_path_files: avoid insertion of `+'
  	before ~1/<TAB>; don't use undeclared local $tmp
-	
+
 2000-07-08  Tanaka Akira  <akr@zsh.org>
 
 	* 12201: Completion/User/_java: fix completion for jar. complete
@@ -1139,7 +1151,7 @@
 2000-07-05  Sven Wischnowsky  <wischnow@zsh.org>
 
 	* 12171: Completion/User/_arp: get return status right
-	
+
 2000-07-05  Bart Schaefer  <schaefer@zsh.org>
 
 	* 12167: Test/Makefile.in: Ignore failure exit from "for" loop
@@ -1172,7 +1184,7 @@
 
 	* 12149: acconfig.h, configure.in, Src/Modules/zftp.c:
 	h_errno wasn't found on HPUX 10.20.  Maybe in some library.
-	
+
 2000-07-03  Adam Spiers  <adam@spiers.net>
 
 	* 12152: Completion/User/_perl: tweak completion of Perl script
@@ -1200,7 +1212,7 @@
 	* Config/version.mk: 3.1.9-dev-2.
 
 	* 12138: Src/params.c, Test/06arith.ztst: setting of array
-	elements in math context didn't work (ever). 
+	elements in math context didn't work (ever).
 
 	* 12121: Src/utils.c, Doc/Zsh/options.yo: save and restore stopmsg
 	for precmd, fix #ifdef's for variable declaration in read_poll().
@@ -1212,7 +1224,7 @@
  	Src/Zle/complist.c: change format style with warnings tag, don't
  	add descriptions as matches; make a-a-i-n-h in menu selection work
  	even without matches
-	
+
 2000-07-02  Bart Schaefer  <schaefer@zsh.org>
 
 	* 12133: Completion/Core/_expand, Completion/Core/_path_files:
@@ -1224,27 +1236,27 @@
 
 	* 12125: Src/parse.c, Test/09funcdef.ztst: fix for `foo () print
  	bar' (function definitions without braces)
-	
+
 	* 12122: Completion/Core/_main_complete: reverse meaning of yes=num
  	again
 
 	* 12119: Completion/Core/_complete, Completion/Core/_normal: try
  	to return the right value
-	
+
 	* 12118: Completion/Core/_expand: don't expand partially typed
  	parameter expansions
-	
+
 	* 12115: Completion/Core/_expand, Doc/Zsh/compsys.yo: change
  	suffix style to still do expansion if the suffix contains
  	something to expand
-	
+
 	* 12114: Completion/Core/_main_complete, Doc/Zsh/compsys.yo: even
  	more fun with the menu style (no=num, yes=long-list, reverse
  	meaning of yes=num)
-	
+
 	* 12113: Completion/Core/_expand, Src/Zle/zle_tricky.c: quote
  	brace-strings
-	
+
 2000-06-28  Bart Schaefer  <schaefer@zsh.org>
 
 	* 12112: Src/params.c: Don't make namedirs out of hash elements.
@@ -1253,13 +1265,13 @@
 
 	* 12109: Completion/Core/_complete: make _complete return the
  	right value
-	
+
 	* 12107: Completion/Core/_setup, Src/Zle/complist.c: fix for
  	list-colors handling
-	
+
 	* 12105: Completion/Core/_main_complete: reset _comp_mesg (saying
  	whether there were messages) appropriately
-	
+
 	* Jan Fedak: 12097: Completion/User/_ssh: use _ports when
 	completing remote ports
 
@@ -1267,11 +1279,11 @@
 
 	* 12099: Completion/Core/_oldlist: make _oldlist not use the dummy
  	match added for the warning
-	
+
 	* 12093: Src/Zle/compcore.c, Src/Zle/complist.c, Src/Zle/compresult.c:
  	make a-a-i-n-h in menu selection work with one match; better undo
  	behaviour for menu selection
-	
+
 2000-06-27  Bart Schaefer  <schaefer@zsh.org>
 
 	* 12086: Doc/Zsh/compsys.yo: Move _use_lo doc into alphabetical
@@ -1282,11 +1294,11 @@
 	* users/3219: Completion/Core/_main_complete, Doc/Zsh/compsys.yo:
 	menu style accepts yes=x to start menu completion if there are at
 	least x matches
-	
+
 	* Andrej: 12084: Src/Modules/zpty.c: don't close slave if not yet open
 
 	* 12082: Doc/Zsh/compsys.yo: document _use_lo
-	
+
 2000-06-27  Peter Stephenson  <pws@cambridgesiliconradio.com>
 
 	* Andrej: 12081: Src/Modules/zpty.c: compiles under Cygwin, but
@@ -1318,19 +1330,19 @@
 
 	* users/3208: Completion/User/_use_lo: default completion even if
 	there are options
-	
+
 	* 12070: Completion/Core/_ignored: fix for completer lookup in
  	_ignored
-	
+
 	* 12068: Doc/Zsh/mod_computil.yo, Src/Zle/computil.c: remove
  	compfmt; a bit of explanation for compfiles and compgroups
-	
+
 	* 12067: Completion/Core/_history, Src/Zle/zle_tricky.c: typo in
  	_history; missing free()s in zle_tricky.c
-	
+
 	* 12066: Src/Zle/computil.c: missing allocation of list for option
  	arguments
-	
+
 2000-06-25  Bart Schaefer  <schaefer@zsh.org>
 
 	* 12063: Doc/Zsh/builtins.yo, Doc/Zsh/compwid.yo,
@@ -1347,7 +1359,7 @@
 
 	* 12041,12043 : Completion/Core/compinit: even more compinit stuff,
  	change prompt, search for insecure parent dirs
-	
+
 2000-06-22  Peter Stephenson  <pws@pwstephenson.fsnet.co.uk>
 
 	* 12040: Src/builtin.c: typeset -r on existing parameter set
@@ -1364,7 +1376,7 @@
 
 	* 12033: Completion/Core/compinit: followup to compinit-security
  	patch
-	
+
 	* 12029: Completion/Builtins/_arrays, Completion/Builtins/_zstyle,
  	Completion/Commands/_bash_completions,
  	Completion/Commands/_history_complete_word,
@@ -1376,7 +1388,7 @@
  	Src/Zle/complist.c, Src/Zle/computil.c: allow subscripts for
  	compadd -[ak]; new style for history completion; better
  	list-colors handling
-	
+
 2000-06-22  Clint Adams  <schizo@debian.org>
 
 	* 12027: Completion/User/_mailboxes: fix splitting problem in
@@ -1396,7 +1408,7 @@
 	* 12011: Completion/Commands/_history_complete_word,
  	Completion/Core/_expand, Completion/Core/_history: make history
  	completion use I{PREF,SUF}FIX
-	
+
 2000-06-20  Oliver Kiddle  <opk@zsh.org>
 
 	* unposted: Src/exec.c: AIX dependency fix
@@ -1412,33 +1424,33 @@
  	Completion/Core/compinit, Doc/Zsh/compsys.yo: a bit of security
  	for compinit (avoid using things writable by others); avoid
  	handling files with the same name twice; remove compconf
-	
+
 2000-06-19  Sven Wischnowsky  <wischnow@zsh.org>
 
 	* 11992: Src/Zle/complist.c: make undo break out of menu selection
  	if nothing to undo inside it
-	
+
 	* 11985: Completion/Debian/_dpkg, Doc/Zsh/compsys.yo,
 	Src/Zle/computil.c: _arguments: small fix for -s and new `!...' for
 	things not to complete (but to understand)
-	
+
 	* 11982: Test/comptest: update comptest to not set ZLS_COLORS
  	directly
-	
+
 	* 11981: Src/Zle/computil.c: more careful when optimising patterns
  	in compfiles
-	
+
 	* 11977: Completion/Core/_options, Completion/Core/_set_options,
  	Completion/Core/_unset_options, Doc/Zsh/compwid.yo,
  	Src/Zle/comp.h, Src/Zle/complete.c, Src/Zle/compmatch.c,
  	Test/54compmatch.ztst: new match spec characters bBeE, match only
  	word/line not both
-	
+
 	* 11973: Completion/Builtins/_zstyle, Completion/Core/_description,
  	Completion/Core/_expand, Doc/Zsh/compsys.yo, Src/Zle/zle_tricky.c:
  	allow _expand to expand braces; better detection of braces to
  	complete instead of passing to shell code
-	
+
 2000-06-19  Peter Stephenson  <pws@cambridgesiliconradio.com>
 
 	* unpost: additions to Completion/Commands/.distfiles and
@@ -1452,11 +1464,11 @@
 	* 11971: Completion/Core/_path_files, Doc/Zsh/compsys.yo,
  	Src/Zle/compcore.c, Src/Zle/computil.c: improve filename
  	completion; use accept-exact for in-path completion; new fake style
-	
+
 	* users/3188: Completion/Core/_description, Completion/Core/_setup,
  	Doc/Zsh/compsys.yo: restore ZLS_COLORS when possible; better
  	group-name handling in ZLS_COLORS
-	
+
 2000-06-17  Clint Adams  <schizo@debian.org>
 
 	* 11966: Completion/Core/_main_complete: use double brackets
@@ -1491,15 +1503,15 @@
 	Src/Zle/zle_tricky.c: allow completion after `a{{b,c},'; fix for
 	closing brace re-insertion when completing from both ends
 	(CLF_MID)
-	
+
 	* 11938: Completion/Core/_description, Doc/Zsh/compsys.yo: enhance
  	ignore-line to ignore all/current/other word(s)
-	
+
 	* 11937: Completion/Core/_expand, Completion/Core/_list,
  	Doc/Zsh/compsys.yo, Doc/Zsh/mod_zutil.yo, Src/Modules/zutil.c:
  	zstyle -e option; change math-styles to boolean ones; change
  	defaults for _expand styles
-	
+
 2000-06-15  Peter Stephenson  <pws@cambridgesiliconradio.com>
 
 	* Felix: 11908: Test/54compmatch.ztst: tests for problematic
@@ -1512,13 +1524,13 @@
 2000-06-15  Sven Wischnowsky  <wischnow@zsh.org>
 
 	* 11924: Src/Zle/compmatch.c: more security in completion matching
-	
+
 	* 11915: Completion/Core/_files, Doc/Zsh/compsys.yo: make _files
  	try each pattern only once (and stop after `*')
-	
+
 	* 11910: Src/Zle/computil.c: fix for _arguments, it took
  	non-option strings as options
-	
+
 2000-06-14  Peter Stephenson  <pws@pwstephenson.fsnet.co.uk>
 
 	* 11906: Src/signals.c: yet another two bugs with saving traps:
@@ -1543,10 +1555,10 @@
 2000-06-14  Sven Wischnowsky  <wischnow@zsh.org>
 
 	* 11885: Src/parse.c: nix kaboom with `time time'
-	
-	* 11890: Src/Zle/complist.c: better fix for menu selection on dumb 
+
+	* 11890: Src/Zle/complist.c: better fix for menu selection on dumb
 	terminal
-	
+
 2000-06-13  Clint Adams  <schizo@debian.org>
 
 	* 11882: Completion/Debian/_dpkg: more intelligence in
@@ -1558,18 +1570,18 @@
 	pattern as argument to match non-arguments; allow single-letter
 	option strings to have multiple arguments; fix to allow option
 	completion with multiple sets
-	
+
 	* 11872 Completion/Commands/_generic, Doc/Zsh/compsys.yo: new
 	_generic widget to call completion with $WIDGET in function field
 	of context
-	
-	* 11873: Completion/Core/_main_complete, Doc/Zsh/compsys.yo: allow 
+
+	* 11873: Completion/Core/_main_complete, Doc/Zsh/compsys.yo: allow
 	insert-tab style to contain `pending[=num]' to handle the case
 	when there is pending input
 
 	* 11874: Completion/Core/_expand, Doc/Zsh/compsys.yo: new style
 	`suffix', use accept-exact style in _expand
-	
+
 	* 11875: Src/Zle/complist.c: fix for longer capability strings;
 	very bad
 
@@ -1626,11 +1638,11 @@
 
 	* 11836: Src/Zle/compcore.c, Src/Zle/complist.c: fix for
  	menu-completion when another completion came right after it
-	
+
 	* 11833: Completion/Core/_path_files, Src/Zle/computil.c: improve
  	_path_files, move some code into C, try to optimise glob patterns
  	and immediately accept exact directory matches
-	
+
 2000-06-08  Oliver Kiddle  <opk@zsh.org>
 
 	* 11823: Doc/Makefile.in, Completion/User/_urls: avoid bug in
@@ -1644,13 +1656,13 @@
 2000-06-08  Sven Wischnowsky  <wischnow@zsh.org>
 
 	* 11817: Src/Zle/compmatch.c: more anchor matching fixes
-	
+
 	* 11815: Completion/Core/_expand, Doc/Zsh/compsys.yo: trying to
  	improve _expand; new keep-prefix style, add-space gives more control
-	
+
 	* 11814: Src/Zle/zle_tricky.c: make C-code expansion add a space
  	only when more than one word was generated
-	
+
 2000-06-08  Tanaka Akira  <akr@zsh.org>
 
 	* users/3130: Completion/Debian/_apt: fix actions for _alternative.
@@ -1659,7 +1671,7 @@
 
 	* 11796: Src/Zle/compmatch.c: try to get the tests for `strings
  	long enough' right in anchor matching code
-	
+
 2000-06-07  Peter Stephenson  <pws@cambridgesiliconradio.com>
 
 	* 11711: Andrej Borsenkow: Test/ztst.zsh: Ignore diff output
@@ -1670,33 +1682,33 @@
 
 	* user/3124: Completion/Core/_normal, Src/Zle/compctl.c: optimise
  	command lookup in old and new completion
-	
+
 	* 11794: Src/Zle/compcore.c, Src/Zle/complist.c, Src/Zle/zle_tricky.c:
  	hopefully more consistent beeping with menu-selection
-	
+
 	* 11792: Doc/Zsh/mod_zutil.yo, Src/Modules/zutil.c: -K option for
  	zparseopts to keep previous array values
-	
+
 	* 11789: Completion/Commands/_correct_word,
  	Completion/Commands/_expand_word, Completion/Commands/_next_tags:
  	setup options in bindable commands
-	
+
 2000-06-06  Oliver Kiddle  <opk@zsh.org>
 
 	* 11772: Completion/User/_urls: improvements to 11756 suggested by
-	Bart in 11763 
+	Bart in 11763
 
 2000-06-06  Sven Wischnowsky  <wischnow@zsh.org>
 
 	* 11777: Completion/Core/_expand: make _expand ignore empty
  	expansions
-	
+
 	* 11776: Completion/Core/_path_files: fix for _path_files and
  	globcomplete, better test if word contains wildcards
-	
+
 	* 11768: Doc/Zsh/expn.yo, Src/lex.c, Src/subst.c: make (e) flag be
  	silent unless (X) is given, too
-	
+
 2000-06-05  Oliver Kiddle  <opk@zsh.org>
 
 	* 11756: Completion/User/_urls, Completion/Linux/_rpm: accept -g
diff --git a/Doc/Zsh/mod_zle.yo b/Doc/Zsh/mod_zle.yo
index dd658a858..cc6080b3d 100644
--- a/Doc/Zsh/mod_zle.yo
+++ b/Doc/Zsh/mod_zle.yo
@@ -198,6 +198,7 @@ xitem(tt(zle) tt(-C) var(widget) var(completion-widget) var(function))
 xitem(tt(zle) tt(-R) [ tt(-c) ] [ var(display-string) ] [ var(string) ... ])
 xitem(tt(zle) tt(-M) var(string))
 xitem(tt(zle) tt(-U) var(string))
+xitem(tt(zle) tt(-I))
 xitem(tt(zle) var(widget) tt([ -n) var(num) tt(]) tt([ -N ]) var(args) ...)
 item(tt(zle))(
 The tt(zle) builtin performs a number of different actions concerning
@@ -263,6 +264,11 @@ cleared.
 Note that this option is only useful for widgets that do not exit
 immediately after using it because the strings displayed will be erased 
 immediately after return from the widget.
+
+This command can safely be called outside user defined widgets; if zle is
+active, the display will be refreshed, while if zle is not active, the
+command has no effect.  In this case there will usually be no other
+arguments.  The status is zero if zle was active, else one.
 )
 item(tt(-M) var(string))(
 As with the tt(-R) option, the var(string) will be displayed below the 
@@ -281,6 +287,28 @@ the last string pushed onto the stack will be processed first.  However,
 the characters in each var(string) will be processed in the order in which
 they appear in the string.
 )
+item(tt(-I))(
+Unusually, this option is only useful em(outside) ordinary widget functions.
+It invalidates the current zle display in preparation for output; usually
+this will be from a trap function.  It has no effect if zle is not
+active.  When a trap exits, the shell checks to see if the display needs
+restoring, hence the following will print output in such a way as not to
+disturb the line being edited:
+
+example(TRAPUSR1() {
+    # Invalidate zle display
+  zle -I
+    # Show output
+  print Hello
+})
+
+Note that there are better ways of manipulating the display from within zle
+widgets.  In general, the trap function may need to test whether zle is
+loaded before using this method; if it is not, there is no point in loading
+it specially since the line editor will not be active.
+
+The status is zero if zle was active, else one.
+)
 item(var(widget) tt([ -n) var(num) tt(]) tt([ -N ]) var(args) ...)(
 Invoke the specified widget.  This can only be done when ZLE is
 active; normally this will be within a user-defined widget.
diff --git a/Src/Modules/zftp.c b/Src/Modules/zftp.c
index e39994733..ef37dbdc7 100644
--- a/Src/Modules/zftp.c
+++ b/Src/Modules/zftp.c
@@ -801,7 +801,7 @@ zfgetline(char *ln, int lnsize, int tmout)
 		cmdbuf[0] = (char)IAC;
 		cmdbuf[1] = (char)DONT;
 		cmdbuf[2] = ch;
-		write(zfsess->cfd, cmdbuf, 3);
+		ztrapwrite(zfsess->cfd, cmdbuf, 3);
 		continue;
 
 	    case DO:
@@ -811,7 +811,7 @@ zfgetline(char *ln, int lnsize, int tmout)
 		cmdbuf[0] = (char)IAC;
 		cmdbuf[1] = (char)WONT;
 		cmdbuf[2] = ch;
-		write(zfsess->cfd, cmdbuf, 3);
+		ztrapwrite(zfsess->cfd, cmdbuf, 3);
 		continue;
 
 	    case EOF:
@@ -996,7 +996,7 @@ zfsendcmd(char *cmd)
 	return 6;
     }
     zfalarm(tmout);
-    ret = write(zfsess->cfd, cmd, strlen(cmd));
+    ret = ztrapwrite(zfsess->cfd, cmd, strlen(cmd));
     alarm(0);
 
     if (ret <= 0) {
@@ -1470,7 +1470,7 @@ zfread(int fd, char *bf, off_t sz, int tmout)
     int ret;
 
     if (!tmout)
-	return read(fd, bf, sz);
+	return ztrapread(fd, bf, sz);
 
     if (setjmp(zfalrmbuf)) {
 	alarm(0);
@@ -1479,7 +1479,7 @@ zfread(int fd, char *bf, off_t sz, int tmout)
     }
     zfalarm(tmout);
 
-    ret = read(fd, bf, sz);
+    ret = ztrapread(fd, bf, sz);
 
     /* we don't bother turning off the whole alarm mechanism here */
     alarm(0);
@@ -1495,7 +1495,7 @@ zfwrite(int fd, char *bf, off_t sz, int tmout)
     int ret;
 
     if (!tmout)
-	return write(fd, bf, sz);
+	return ztrapwrite(fd, bf, sz);
 
     if (setjmp(zfalrmbuf)) {
 	alarm(0);
@@ -1504,7 +1504,7 @@ zfwrite(int fd, char *bf, off_t sz, int tmout)
     }
     zfalarm(tmout);
 
-    ret = write(fd, bf, sz);
+    ret = ztrapwrite(fd, bf, sz);
 
     /* we don't bother turning off the whole alarm mechanism here */
     alarm(0);
@@ -2846,7 +2846,7 @@ zfclose(int leaveparams)
 	if (!zfnopen) {
 	    /* Write the final status in case this is a subshell */
 	    lseek(zfstatfd, zfsessno*sizeof(int), 0);
-	    write(zfstatfd, zfstatusp+zfsessno, sizeof(int));
+	    ztrapwrite(zfstatfd, zfstatusp+zfsessno, sizeof(int));
 
 	    close(zfstatfd);
 	    zfstatfd = -1;
@@ -3123,7 +3123,7 @@ bin_zftp(char *name, char **args, char *ops, int func)
 	/* Get the status in case it was set by a forked process */
 	int oldstatus = zfstatusp[zfsessno];
 	lseek(zfstatfd, 0, 0);
-	read(zfstatfd, zfstatusp, sizeof(int)*zfsesscnt);
+	ztrapread(zfstatfd, zfstatusp, sizeof(int)*zfsesscnt);
 	if (zfsess->cfd != -1 && (zfstatusp[zfsessno] & ZFST_CLOS)) {
 	    /* got closed in subshell without us knowing */
 	    zcfinish = 2;
@@ -3212,7 +3212,7 @@ bin_zftp(char *name, char **args, char *ops, int func)
 	 * but only for the active session.
 	 */
 	lseek(zfstatfd, zfsessno*sizeof(int), 0);
-	write(zfstatfd, zfstatusp+zfsessno, sizeof(int));
+	ztrapwrite(zfstatfd, zfstatusp+zfsessno, sizeof(int));
     }
     return ret;
 }
diff --git a/Src/Modules/zpty.c b/Src/Modules/zpty.c
index d25c3a865..e76411a8b 100644
--- a/Src/Modules/zpty.c
+++ b/Src/Modules/zpty.c
@@ -536,7 +536,7 @@ ptywritestr(Ptycmd cmd, char *s, int len)
 
     for (; !errflag && !breaks && !retflag && !contflag && len;
 	 len -= written, s += written) {
-	if ((written = write(cmd->fd, s, len)) < 0 && cmd->nblock &&
+	if ((written = ztrapwrite(cmd->fd, s, len)) < 0 && cmd->nblock &&
 #ifdef EWOULDBLOCK
 	    errno == EWOULDBLOCK
 #else
@@ -578,7 +578,7 @@ ptywrite(Ptycmd cmd, char **args, int nonl)
 	int n;
 	char buf[BUFSIZ];
 
-	while ((n = read(0, buf, BUFSIZ)) > 0)
+	while ((n = ztrapread(0, buf, BUFSIZ)) > 0)
 	    if (ptywritestr(cmd, buf, n))
 		return 1;
     }
diff --git a/Src/Zle/zle_main.c b/Src/Zle/zle_main.c
index b2d075f91..b2a662072 100644
--- a/Src/Zle/zle_main.c
+++ b/Src/Zle/zle_main.c
@@ -313,11 +313,17 @@ static int
 breakread(int fd, char *buf, int n)
 {
     fd_set f;
+    int ret;
 
     FD_ZERO(&f);
     FD_SET(fd, &f);
-    return (select(fd + 1, (SELECT_ARG_2_T) & f, NULL, NULL, NULL) == -1 ?
-	    EOF : read(fd, buf, n));
+
+    ALLOWTRAPS {
+	ret = (select(fd + 1, (SELECT_ARG_2_T) & f, NULL, NULL, NULL) == -1 ?
+	       EOF : read(fd, buf, n));
+    } DISALLOWTRAPS;
+
+    return ret;
 }
 
 # define read    breakread
@@ -388,7 +394,7 @@ getkey(int keytmout)
 #  else
 	    ioctl(SHTTY, TCSETA, &ti.tio);
 #  endif
-	    r = read(SHTTY, &cc, 1);
+	    r = ztrapread(SHTTY, &cc, 1);
 #  ifdef HAVE_TERMIOS_H
 	    tcsetattr(SHTTY, TCSANOW, &shttyinfo.tio);
 #  else
@@ -398,7 +404,10 @@ getkey(int keytmout)
 # endif
 #endif
 	}
-	while ((r = read(SHTTY, &cc, 1)) != 1) {
+	for (;;) {
+	    r = ztrapread(SHTTY, &cc, 1);
+	    if (r == 1)
+		break;
 	    if (r == 0) {
 		/* The test for IGNOREEOF was added to make zsh ignore ^Ds
 		   that were typed while commands are running.  Unfortuantely
@@ -1083,7 +1092,7 @@ zleaftertrap(Hookdef dummy, void *dat)
 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, "lDANCLmMgGcRaU", NULL),
+    BUILTIN("zle",     0, bin_zle,     0, -1, 0, "lDANCLmMgGcRaUI", NULL),
 };
 
 /* The order of the entries in this table has to match the *HOOK
diff --git a/Src/Zle/zle_thingy.c b/Src/Zle/zle_thingy.c
index 7e81e2f88..f5acb73b4 100644
--- a/Src/Zle/zle_thingy.c
+++ b/Src/Zle/zle_thingy.c
@@ -339,6 +339,7 @@ bin_zle(char *name, char **args, char *ops, int func)
 	{ 'R', bin_zle_refresh, 0, -1 },
 	{ 'M', bin_zle_mesg, 1, 1 },
 	{ 'U', bin_zle_unget, 1, 1 },
+	{ 'I', bin_zle_invalidate, 0, 0 },
 	{ 0,   bin_zle_call, 0, -1 },
     };
     struct opn const *op, *opp;
@@ -396,10 +397,8 @@ bin_zle_refresh(char *name, char **args, char *ops, char func)
     char *s = statusline;
     int sl = statusll, ocl = clearlist;
 
-    if (!zleactive) {
-	zwarnnam(name, "can only be called from widget function", NULL, 0);
+    if (!zleactive)
 	return 1;
-    }
     statusline = NULL;
     statusll = 0;
     if (*args) {
@@ -656,6 +655,17 @@ bin_zle_call(char *name, char **args, char *ops, char func)
     return ret;
 }
 
+/**/
+static int
+bin_zle_invalidate(char *name, char **args, char *ops, char func)
+{
+    if (zleactive) {
+	trashzle();
+	return 0;
+    } else
+	return 1;
+}
+
 /*******************/
 /* initialiasation */
 /*******************/
diff --git a/Src/builtin.c b/Src/builtin.c
index afd140d3c..d1cea8393 100644
--- a/Src/builtin.c
+++ b/Src/builtin.c
@@ -3218,7 +3218,7 @@ zexit(int val, int from_signal)
 	    checkjobs();   /* check if any jobs are running/stopped */
 	if (stopmsg) {
 	    stopmsg = 2;
-	    LASTALLOC_RETURN;
+	    return;
 	}
     }
     if (in_exit++ && from_signal)
@@ -3240,7 +3240,7 @@ zexit(int val, int from_signal)
 	}
     }
     if (sigtrapped[SIGEXIT])
-	dotrap(SIGEXIT);
+	dotrap(SIGEXIT, 1);
     runhookdef(EXITHOOK, NULL);
     if (mypid != getpid())
 	_exit(val);
@@ -3486,7 +3486,7 @@ bin_read(char *name, char **args, char *ops, int func)
 		    *bptr = readchar;
 		    val = 1;
 		    readchar = -1;
-		} else if ((val = read(readfd, bptr, nchars)) <= 0)
+		} else if ((val = ztrapread(readfd, bptr, nchars)) <= 0)
 		    break;
 	    
 		/* decrement number of characters read from number required */
@@ -3500,7 +3500,7 @@ bin_read(char *name, char **args, char *ops, int func)
 	if (!izle && !ops['u'] && !ops['p']) {
 	    /* dispose of result appropriately, etc. */
 	    if (isem)
-		while (val > 0 && read(SHTTY, &d, 1) == 1 && d != '\n');
+		while (val > 0 && ztrapread(SHTTY, &d, 1) == 1 && d != '\n');
 	    else
 		settyinfo(&shttyinfo);
 	    if (haso) {
@@ -3733,6 +3733,7 @@ static int
 zread(int izle, int *readchar)
 {
     char cc, retry = 0;
+    int ret;
 
     if (izle) {
 	int c = getkeyptr(0);
@@ -3756,7 +3757,8 @@ zread(int izle, int *readchar)
     }
     for (;;) {
 	/* read a character from readfd */
-	switch (read(readfd, &cc, 1)) {
+	ret = ztrapread(readfd, &cc, 1);
+	switch (ret) {
 	case 1:
 	    /* return the character read */
 	    return STOUC(cc);
diff --git a/Src/exec.c b/Src/exec.c
index d0787f222..267625807 100644
--- a/Src/exec.c
+++ b/Src/exec.c
@@ -738,6 +738,7 @@ static int
 execsimple(Estate state)
 {
     wordcode code = *state->pc++;
+    int lv;
 
     if (errflag)
 	return (lastval = 1);
@@ -754,9 +755,13 @@ execsimple(Estate state)
 	    fputc('\n', xtrerr);
 	    fflush(xtrerr);
 	}
-	return (lastval = (errflag ? errflag : cmdoutval));
+	lv = (errflag ? errflag : cmdoutval);
     } else
-	return (lastval = (execfuncs[code - WC_CURSH])(state, 0));
+	lv = (execfuncs[code - WC_CURSH])(state, 0);
+
+    RUNTRAPS();
+
+    return lastval = lv;
 }
 
 /* Main routine for executing a list.                                *
@@ -887,19 +892,19 @@ sublist_done:
 	noerrexit = oldnoerrexit;
 
 	if (sigtrapped[SIGDEBUG])
-	    dotrap(SIGDEBUG);
+	    dotrap(SIGDEBUG, 1);
 
 	/* Check whether we are suppressing traps/errexit *
 	 * (typically in init scripts) and if we haven't  *
 	 * already performed them for this sublist.       */
 	if (!noerrexit && !donetrap) {
 	    if (sigtrapped[SIGZERR] && lastval) {
-		dotrap(SIGZERR);
+		dotrap(SIGZERR, 1);
 		donetrap = 1;
 	    }
 	    if (lastval && isset(ERREXIT)) {
 		if (sigtrapped[SIGEXIT])
-		    dotrap(SIGEXIT);
+		    dotrap(SIGEXIT, 1);
 		if (mypid != getpid())
 		    _exit(lastval);
 		else
@@ -1181,9 +1186,10 @@ execpline2(Estate state, wordcode pcode,
 	else
 	    list_pipe_text[0] = '\0';
     }
-    if (WC_PIPE_TYPE(pcode) == WC_PIPE_END)
+    if (WC_PIPE_TYPE(pcode) == WC_PIPE_END) {
 	execcmd(state, input, output, how, last1 ? 1 : 2);
-    else {
+	RUNTRAPS();
+    } else {
 	int old_list_pipe = list_pipe;
 	Wordcode next = state->pc + (*state->pc);
 	wordcode code;
@@ -1218,12 +1224,14 @@ execpline2(Estate state, wordcode pcode,
 		entersubsh(how, 2, 0);
 		close(synch[1]);
 		execcmd(state, input, pipes[1], how, 0);
+		RUNTRAPS();
 		_exit(lastval);
 	    }
 	} else {
 	    /* otherwise just do the pipeline normally. */
 	    subsh_close = pipes[0];
 	    execcmd(state, input, pipes[1], how, 0);
+	    RUNTRAPS();
 	}
 	zclose(pipes[1]);
 	state->pc = next;
diff --git a/Src/init.c b/Src/init.c
index 341173889..290384c1a 100644
--- a/Src/init.c
+++ b/Src/init.c
@@ -170,7 +170,7 @@ loop(int toplevel, int justonce)
 	}
 	if (isset(SINGLECOMMAND) && toplevel) {
 	    if (sigtrapped[SIGEXIT])
-		dotrap(SIGEXIT);
+		dotrap(SIGEXIT, 1);
 	    exit(lastval);
 	}
 	if (justonce)
@@ -1107,6 +1107,7 @@ fallback_zleread(char *lp, char *rp, int ha)
     pptbuf = unmetafy(promptexpand(lp, 0, NULL, NULL), &pptlen);
     write(2, (WRITE_ARG_2_T)pptbuf, pptlen);
     free(pptbuf);
+
     return (unsigned char *)shingetline();
 }
 
diff --git a/Src/input.c b/Src/input.c
index 8f33e3631..e82d25011 100644
--- a/Src/input.c
+++ b/Src/input.c
@@ -141,7 +141,9 @@ shingetline(void)
     for (;;) {
 	do {
 	    errno = 0;
-	    c = fgetc(bshin);
+	    ALLOWTRAPS {
+		c = fgetc(bshin);
+	    } DISALLOWTRAPS;
 	} while (c < 0 && errno == EINTR);
 	if (c < 0 || c == '\n') {
 	    if (c == '\n')
diff --git a/Src/jobs.c b/Src/jobs.c
index a938e774b..28246d422 100644
--- a/Src/jobs.c
+++ b/Src/jobs.c
@@ -378,7 +378,7 @@ update_job(Job jn)
 	    zrefresh();
     }
     if (sigtrapped[SIGCHLD] && job != thisjob)
-	dotrap(SIGCHLD);
+	dotrap(SIGCHLD, 0);
 
     /* When MONITOR is set, the foreground process runs in a different *
      * process group from the shell, so the shell will not receive     *
@@ -389,7 +389,7 @@ update_job(Job jn)
 
 	if (sig == SIGINT || sig == SIGQUIT) {
 	    if (sigtrapped[sig]) {
-		dotrap(sig);
+		dotrap(sig, 0);
 		/* We keep the errflag as set or not by dotrap.
 		 * This is to fulfil the promise to carry on
 		 * with the jobs if trap returns zero.
@@ -878,7 +878,9 @@ waitforpid(pid_t pid)
 	else
 	    kill(pid, SIGCONT);
 
-	child_suspend(SIGINT);
+	ALLOWTRAPS {
+	    child_suspend(SIGINT);
+	} DISALLOWTRAPS;
 	child_block();
     }
     child_unblock();
@@ -900,7 +902,9 @@ waitjob(int job, int sig)
 	while (!errflag && jn->stat &&
 	       !(jn->stat & STAT_DONE) &&
 	       !(interact && (jn->stat & STAT_STOPPED))) {
-	    child_suspend(sig);
+	    ALLOWTRAPS {
+		child_suspend(sig);
+	    } DISALLOWTRAPS;
 	    /* Commenting this out makes ^C-ing a job started by a function
 	       stop the whole function again.  But I guess it will stop
 	       something else from working properly, we have to find out
@@ -1363,7 +1367,7 @@ bin_fg(char *name, char **argv, char *ops, int func)
 		killjb(jobtab + job, SIGCONT);
 	    }
 	    if (func == BIN_WAIT)
-	        waitjob(job, SIGINT);
+		waitjob(job, SIGINT);
 	    if (func != BIN_BG) {
 		waitjobs();
 		retval = lastval2;
diff --git a/Src/signals.c b/Src/signals.c
index b397e1047..693337dbd 100644
--- a/Src/signals.c
+++ b/Src/signals.c
@@ -497,7 +497,7 @@ handler(int sig)
  
     case SIGHUP:
         if (sigtrapped[SIGHUP])
-            dotrap(SIGHUP);
+            dotrap(SIGHUP, 0);
         else {
             stopmsg = 1;
             zexit(SIGHUP, 1);
@@ -506,7 +506,7 @@ handler(int sig)
  
     case SIGINT:
         if (sigtrapped[SIGINT])
-            dotrap(SIGINT);
+            dotrap(SIGINT, 0);
         else {
 	    if ((isset(PRIVILEGED) || isset(RESTRICTED)) &&
 		isset(INTERACTIVE) && noerrexit < 0)
@@ -523,14 +523,14 @@ handler(int sig)
     case SIGWINCH:
         adjustwinsize(1);  /* check window size and adjust */
 	if (sigtrapped[SIGWINCH])
-	    dotrap(SIGWINCH);
+	    dotrap(SIGWINCH, 0);
         break;
 #endif
 
     case SIGALRM:
         if (sigtrapped[SIGALRM]) {
 	    int tmout;
-            dotrap(SIGALRM);
+            dotrap(SIGALRM, 0);
 
 	    if ((tmout = getiparam("TMOUT")))
 		alarm(tmout);           /* reset the alarm */
@@ -549,7 +549,7 @@ handler(int sig)
         break;
  
     default:
-        dotrap(sig);
+        dotrap(sig, 0);
         break;
     }   /* end of switch(sig) */
  
@@ -907,7 +907,9 @@ dotrapargs(int sig, int *sigtr, void *sigfn)
      * function will test for this, but this way we keep status flags *
      * intact without working too hard.  Special cases (e.g. calling  *
      * a trap for SIGINT after the error flag was set) are handled    *
-     * by the calling code.  (PWS 1995/06/08).			      */
+     * by the calling code.  (PWS 1995/06/08).			      *
+     *                                                                *
+     * This test is now replicated in dotrap().                       */
     if ((*sigtr & ZSIG_IGNORED) || !sigfn || errflag)
         return;
 
@@ -953,15 +955,67 @@ dotrapargs(int sig, int *sigtr, void *sigfn)
 	    breaks = loops;
     }
 
+    /*
+     * If zle was running while the trap was executed, see if we
+     * need to restore the display.
+     */
+    if (zleactive && resetneeded)
+	zrefresh();
+
     if (*sigtr != ZSIG_IGNORED)
 	*sigtr &= ~ZSIG_IGNORED;
 }
 
-/* Standard call to execute a trap for a given signal */
+/* != 0 if trap handlers can be called immediately */
+
+/**/
+mod_export int trapsallowed;
+
+/* Queued traps and allocated length of queue. */
+
+static int *trapqueue, trapqlen;
+
+/* Number of used slots in trap queue. */
+
+/**/
+mod_export int trapqused;
+
+/* Standard call to execute a trap for a given signal.  The second
+ * argument should be zero if we may need to put the trap on the queue
+ * and 1 if it may be called immediately.  It should never be set to
+ * anything less than zero, that's used internally. */
 
 /**/
 void
-dotrap(int sig)
+dotrap(int sig, int now)
 {
-    dotrapargs(sig, sigtrapped+sig, sigfuncs[sig]);
+    /* Copied from dotrapargs(). */
+    if ((sigtrapped[sig] & ZSIG_IGNORED) || !sigfuncs[sig] || errflag)
+	return;
+
+    if (now || trapsallowed) {
+	if (now < 0)
+	    RUNTRAPS();
+	dotrapargs(sig, sigtrapped+sig, sigfuncs[sig]);
+    } else {
+	if (trapqlen == trapqused)
+	    trapqueue = (int *) zrealloc(trapqueue, (trapqlen += 32));
+	trapqueue[trapqused++] = sig;
+    }
+}
+
+/**/
+mod_export void
+doqueuedtraps(void)
+{
+    int sig, ota = trapsallowed;
+
+    trapsallowed = 1;
+    while (trapqused) {
+	trapqused--;
+	sig = *trapqueue;
+	memcpy(trapqueue, trapqueue + 1, trapqused * sizeof(int));
+	dotrap(sig, -1);
+    }
+    trapsallowed = ota;
 }
diff --git a/Src/signals.h b/Src/signals.h
index b6485e6b3..45978dd1e 100644
--- a/Src/signals.h
+++ b/Src/signals.h
@@ -56,8 +56,8 @@
 # define sigismember(s,n)  ((*(s) & (1 << ((n) - 1))) != 0)
 #endif   /* ifndef POSIX_SIGNALS */
  
-#define child_block()      signal_block(signal_mask(SIGCHLD))
-#define child_unblock()    signal_unblock(signal_mask(SIGCHLD))
+#define child_block()      signal_block(sigchld_mask)
+#define child_unblock()    signal_unblock(sigchld_mask)
 #define child_suspend(S)   signal_suspend(SIGCHLD, S)
 
 /* ignore a signal */
@@ -92,3 +92,34 @@
 	} \
     } \
 } while (0)
+
+
+/* Make some signal functions faster. */
+
+#ifdef POSIX_SIGNALS
+#define signal_block(S) \
+    ((dummy_sigset1 = (S)), \
+     sigprocmask(SIG_BLOCK, &dummy_sigset1, &dummy_sigset2), \
+     dummy_sigset2)
+#else
+# ifdef BSD_SIGNALS
+#define signal_block(S) sigblock(S)
+# else
+extern sigset_t signal_block _((sigset_t));
+# endif  /* BSD_SIGNALS   */
+#endif   /* POSIX_SIGNALS */
+
+#ifdef POSIX_SIGNALS
+#define signal_unblock(S) \
+    ((dummy_sigset1 = (S)), \
+     sigprocmask(SIG_UNBLOCK, &dummy_sigset1, &dummy_sigset2), \
+     dummy_sigset2)
+#else
+extern sigset_t signal_unblock _((sigset_t));
+#endif   /* POSIX_SIGNALS */
+
+#define RUNTRAPS() do { if (trapqused) doqueuedtraps(); } while (0)
+#define ALLOWTRAPS do { RUNTRAPS(); trapsallowed++; do
+#define DISALLOWTRAPS while (0); RUNTRAPS(); trapsallowed--; } while (0)
+#define ALLOWTRAPS_RETURN(V) \
+    do { RUNTRAPS(); trapsallowed--; return (V); } while (0)
diff --git a/Src/utils.c b/Src/utils.c
index b7b8d1295..e61e84a03 100644
--- a/Src/utils.c
+++ b/Src/utils.c
@@ -1418,12 +1418,38 @@ checkrmall(char *s)
 }
 
 /**/
+mod_export int
+ztrapread(int fd, char *buf, int len)
+{
+    int ret;
+
+    ALLOWTRAPS {
+	ret = read(fd, buf, len);
+    } DISALLOWTRAPS;
+
+    return ret;
+}
+
+/**/
+mod_export int
+ztrapwrite(int fd, char *buf, int len)
+{
+    int ret;
+
+    ALLOWTRAPS {
+	ret = write(fd, buf, len);
+    } DISALLOWTRAPS;
+
+    return ret;
+}
+
+/**/
 int
 read1char(void)
 {
     char c;
 
-    while (read(SHTTY, &c, 1) != 1) {
+    while (ztrapread(SHTTY, &c, 1) != 1) {
 	if (errno != EINTR || errflag || retflag || breaks || contflag)
 	    return -1;
     }
@@ -1440,7 +1466,7 @@ noquery(int purge)
     ioctl(SHTTY, FIONREAD, (char *)&val);
     if (purge) {
 	for (; val; val--)
-	    read(SHTTY, &c, 1);
+	    ztrapread(SHTTY, &c, 1);
     }
 #endif
 
diff --git a/Src/zsh.h b/Src/zsh.h
index cdf1ed489..c4642434b 100644
--- a/Src/zsh.h
+++ b/Src/zsh.h
@@ -1627,8 +1627,6 @@ struct heap {
 #endif
 ;
 
-# define LASTALLOC_RETURN return
-
 # define NEWHEAPS(h)    do { Heap _switch_oldheaps = h = new_heaps(); do
 # define OLDHEAPS       while (0); old_heaps(_switch_oldheaps); } while (0);