Zsh Mailing List Archive
Messages sorted by:
Reverse Date,
Date,
Thread,
Author
Re: PATCH: exit after 10 EOF's
- X-seq: zsh-workers 20395
- From: Bart Schaefer <schaefer@xxxxxxxxxxxxxxxx>
- To: Peter Stephenson <pws@xxxxxxx>
- Subject: Re: PATCH: exit after 10 EOF's
- Date: Mon, 20 Sep 2004 07:43:30 -0700 (PDT)
- Cc: zsh-workers@xxxxxxxxxx
- In-reply-to: <200409201359.i8KDxSiC007555@xxxxxxxxxxxxxx>
- Mailing-list: contact zsh-workers-help@xxxxxxxxxx; run by ezmlm
- References: <200409131118.i8DBIM5B005245@xxxxxxxxxxxxxx> <Pine.LNX.4.61.0409181943300.6971@xxxxxxxxxxxxxxxxxx> <D8064C1C-0A0F-11D9-A0DD-0003931123E4@xxxxxxxxxxxxxxxx> <Pine.LNX.4.61.0409190935150.6971@xxxxxxxxxxxxxxxxxx> <20040919175211.3557D863A@xxxxxxxxxxxxxxxxxxxxxxxx> <Pine.LNX.4.61.0409191119580.6971@xxxxxxxxxxxxxxxxxx> <Pine.LNX.4.61.0409191220000.6971@xxxxxxxxxxxxxxxxxx> <200409201359.i8KDxSiC007555@xxxxxxxxxxxxxx>
- Reply-to: zsh-workers@xxxxxxxxxx
On Mon, 20 Sep 2004, Peter Stephenson wrote:
> I've applied these two patches and now I get the message from within zle
> (no reprinting of command line) when I have a zle -N widget bound to ^D,
I can't reproduce this. I tried:
zagzig% widget() { : }
zagzig% zle -N widget
zagzig% bindkey \^D widget
zagzig% setopt ignoreeof
zagzig%
(typing ctrl-D several times does nothing).
I then did:
zagzig% widget() { LBUFFER+=$KEYS }
zagzig% ^D^D^D^D^D^D^D
I next did:
zagzig% widget() { zle self-insert }
zagzig% ^D^D^D^D^D^D^D
Can you give me the exact command sequence you used?
> but the shell doesn't exit.
That part I can reproduce, but then, it's not supposed to exit.
> If I use a completion widget I get the message and the prompt is
> reprinted from the main shell.
Hmm, yes, I hadn't noticed that difference. There's no other way to keep
the noexitct increment limited to the top-level loop, though. Is this
really a problem?
For reference, what I have is:
Index: Src/init.c
===================================================================
RCS file: /cvsroot/zsh/zsh/Src/init.c,v
retrieving revision 1.43
retrieving revision 1.44
diff -u -r1.43 -r1.44
--- Src/init.c 13 Sep 2004 13:04:55 -0000 1.43
+++ Src/init.c 20 Sep 2004 13:37:41 -0000 1.44
@@ -37,7 +37,7 @@
#include "version.h"
/**/
-mod_export int noexitct = 0;
+int noexitct = 0;
/* buffer for $_ and its length */
Index: Src/Zle/zle_main.c
===================================================================
RCS file: /cvsroot/zsh/zsh/Src/Zle/zle_main.c,v
retrieving revision 1.51
retrieving revision 1.53
diff -u -r1.51 -r1.53
--- Src/Zle/zle_main.c 13 Sep 2004 13:04:55 -0000 1.51
+++ Src/Zle/zle_main.c 20 Sep 2004 14:04:03 -0000 1.53
@@ -688,30 +688,23 @@
selectlocalmap(NULL);
bindk = getkeycmd();
if (bindk) {
- if (!ll && isfirstln && lastchar == eofchar) {
+ if (!ll && isfirstln && !(zlereadflags & ZLRF_IGNOREEOF) &&
+ lastchar == eofchar) {
/*
* Slight hack: this relies on getkeycmd returning
* a value for the EOF character. However,
* undefined-key is fine. That's necessary because
* otherwise we can't distinguish this case from
* a ^C.
- *
- * The noxitct test is done in the top-level loop
- * if zle is not running. As we trap EOFs at this
- * level inside zle we need to mimic it here.
- * If we break, the top-level loop will actually increment
- * noexitct an extra time; that doesn't cause any
- * problems.
*/
- if (!(zlereadflags & ZLRF_IGNOREEOF) ||
- ++noexitct >= 10)
- {
- eofsent = 1;
- break;
- }
+ eofsent = 1;
+ break;
}
- if (execzlefunc(bindk, zlenoargs))
+ if (execzlefunc(bindk, zlenoargs)) {
handlefeep(zlenoargs);
+ if (eofsent)
+ break;
+ }
handleprefixes();
/* for vi mode, make sure the cursor isn't somewhere illegal */
if (invicmdmode() && cs > findbol() &&
@@ -904,10 +897,17 @@
} else if((w = func->widget)->flags & (WIDGET_INT|WIDGET_NCOMP)) {
int wflags = w->flags;
- if (keybuf[0] == eofchar && !keybuf[1] &&
+ /*
+ * The rule is that "zle -N" widgets suppress EOF warnings. When
+ * a "zle -N" widget invokes "zle another-widget" we pass through
+ * this code again, but with actual arguments rather than with the
+ * zlenoargs placeholder.
+ */
+ if (keybuf[0] == eofchar && !keybuf[1] && args == zlenoargs &&
!ll && isfirstln && (zlereadflags & ZLRF_IGNOREEOF)) {
showmsg((!islogin) ? "zsh: use 'exit' to exit." :
"zsh: use 'logout' to logout.");
+ eofsent = 1;
ret = 1;
} else {
if(!(wflags & ZLE_KEEPSUFFIX))
Messages sorted by:
Reverse Date,
Date,
Thread,
Author