zsh-workers
 help / color / mirror / code / Atom feed
* Weird bug with "bindkey" in a function
@ 1998-03-24 17:19 Bart Schaefer
  1998-03-24 18:03 ` Andrew Main
  1998-03-25  9:23 ` PATCH: 3.1 Re: Weird bug with "bindkey" Peter Stephenson
  0 siblings, 2 replies; 4+ messages in thread
From: Bart Schaefer @ 1998-03-24 17:19 UTC (permalink / raw)
  To: zsh-workers

I was playing around with something and wrote the following little
function:

bindfoo () {
        bindkey -v
        bindkey "[A" up-line-or-history
        bindkey "[B" down-line-or-history
        bindkey "[C" forward-char
        bindkey "[D" backward-char
        bindkey -r '\e[A'
        bindkey -r '\e[B'
        bindkey -r '\e[C'
        bindkey -r '\e[D'
        bindkey
        bindkey -e
}

The weird thing is, if any of the "bindkey" commands in that function fails
(e.g. with "bindkey: in-string is not bound") then the ENTIRE FUNCTION exits.

What the devil is up with that?

zsh 3.0.5

-- 
Bart Schaefer                                 Brass Lantern Enterprises
http://www.well.com/user/barts              http://www.brasslantern.com


^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: Weird bug with "bindkey" in a function
  1998-03-24 17:19 Weird bug with "bindkey" in a function Bart Schaefer
@ 1998-03-24 18:03 ` Andrew Main
  1998-03-25  9:23 ` PATCH: 3.1 Re: Weird bug with "bindkey" Peter Stephenson
  1 sibling, 0 replies; 4+ messages in thread
From: Andrew Main @ 1998-03-24 18:03 UTC (permalink / raw)
  To: Bart Schaefer; +Cc: zsh-workers

Bart Schaefer wrote:
>The weird thing is, if any of the "bindkey" commands in that function fails
>(e.g. with "bindkey: in-string is not bound") then the ENTIRE FUNCTION exits.

Possibly related: can anyone tell me what the global `errflag' does?

>zsh 3.0.5

That version has another (very old) bug that prevents multi-character
keybindings from working properly.  This didn't get fixed until 3.1.
(By the time I posted a patch for 3.0, it was too late to make radical
changes.)

-zefram


^ permalink raw reply	[flat|nested] 4+ messages in thread

* PATCH: 3.1 Re: Weird bug with "bindkey"
  1998-03-24 17:19 Weird bug with "bindkey" in a function Bart Schaefer
  1998-03-24 18:03 ` Andrew Main
@ 1998-03-25  9:23 ` Peter Stephenson
  1998-03-25  9:45   ` PATCH: 3.0.5 " Peter Stephenson
  1 sibling, 1 reply; 4+ messages in thread
From: Peter Stephenson @ 1998-03-25  9:23 UTC (permalink / raw)
  To: zsh-workers

> The weird thing is, if any of the "bindkey" commands in that function fails
> (e.g. with "bindkey: in-string is not bound") then the ENTIRE FUNCTION exits.
> 
> What the devil is up with that?
> 
> zsh 3.0.5

As Zefram suggested, it's to do with errflag, which is completely
global:  it will abort back to the main command loop, or exit a
script.  Originally, all zsh internal errors worked like this, until
some mug with nothing better to do (guess who?) introduced zwarnnam(),
which doesn't pass on errflag.  There was some discussion at the time
about what should do which, but with the whole shell to rewrite in
this fashion things were obviously going to get missed, so I would
guess this bug has always been there.

Here's a patch for 3.1, which simply replaces zerrnam() with
zwarnnam() everywhere in zle_keymap.c (the unidiff was very much
shorter so I've sent that, but mail me if you need a context diff).

Looks like I've got 3.0.x lying around, so I'll dig out a patch for
that, too.

--- Src/Zle/zle_keymap.c.warn	Tue Jan 13 11:41:41 1998
+++ Src/Zle/zle_keymap.c	Wed Mar 25 10:10:29 1998
@@ -604,17 +604,17 @@
     if(op->o)
 	for(opp = op; (++opp)->o; )
 	    if(ops[opp->o]) {
-		zerrnam(name, "incompatible operation selection options",
+		zwarnnam(name, "incompatible operation selection options",
 		    NULL, 0);
 		return 1;
 	    }
     n = ops['e'] + ops['v'] + ops['a'] + ops['M'];
     if(!op->selp && n) {
-	zerrnam(name, "keymap cannot be selected with -%c", NULL, op->o);
+	zwarnnam(name, "keymap cannot be selected with -%c", NULL, op->o);
 	return 1;
     }
     if(n > 1) {
-	zerrnam(name, "incompatible keymap selection options", NULL, 0);
+	zwarnnam(name, "incompatible keymap selection options", NULL, 0);
 	return 1;
     }
 
@@ -629,14 +629,14 @@
 	else if(ops['M']) {
 	    kmname = *argv++;
 	    if(!kmname) {
-		zerrnam(name, "-M option requires a keymap argument", NULL, 0);
+		zwarnnam(name, "-M option requires a keymap argument", NULL, 0);
 		return 1;
 	    }
 	} else
 	    kmname = "main";
 	km = openkeymap(kmname);
 	if(!km) {
-	    zerrnam(name, "no such keymap `%s'", kmname, 0);
+	    zwarnnam(name, "no such keymap `%s'", kmname, 0);
 	    return 1;
 	}
 	if(ops['e'] || ops['v'])
@@ -656,10 +656,10 @@
     /* check number of arguments */
     for(n = 0; argv[n]; n++) ;
     if(n < op->min) {
-	zerrnam(name, "not enough arguments for -%c", NULL, op->o);
+	zwarnnam(name, "not enough arguments for -%c", NULL, op->o);
 	return 1;
     } else if(op->max != -1 && n > op->max) {
-	zerrnam(name, "too many arguments for -%c", NULL, op->o);
+	zwarnnam(name, "too many arguments for -%c", NULL, op->o);
 	return 1;
     }
 
@@ -731,10 +731,10 @@
 {
     km = openkeymap(argv[0]);
     if(!km) {
-	zerrnam(name, "no such keymap `%s'", argv[0], 0);
+	zwarnnam(name, "no such keymap `%s'", argv[0], 0);
 	return 1;
     } else if(linkkeymap(km, argv[1])) {
-	zerrnam(name, "keymap name `%s' is protected", argv[1], 0);
+	zwarnnam(name, "keymap name `%s' is protected", argv[1], 0);
 	return 1;
     }
     return 0;
@@ -749,13 +749,13 @@
     KeymapName kmn = (KeymapName) keymapnamtab->getnode(keymapnamtab, argv[0]);
 
     if(kmn && (kmn -> flags & KMN_IMMORTAL)) {
-	zerrnam(name, "keymap name `%s' is protected", argv[0], 0);
+	zwarnnam(name, "keymap name `%s' is protected", argv[0], 0);
 	return 1;
     }
     if(argv[1]) {
 	km = openkeymap(argv[1]);
 	if(!km) {
-	    zerrnam(name, "no such keymap `%s'", argv[0], 0);
+	    zwarnnam(name, "no such keymap `%s'", argv[0], 0);
 	    return 1;
 	}
     } else
@@ -779,7 +779,7 @@
     Thingy fn;
 
     if(km->flags & KM_IMMUTABLE) {
-	zerrnam(name, "keymap `%s' is protected", kmname, 0);
+	zwarnnam(name, "keymap `%s' is protected", kmname, 0);
 	return 1;
     }
     for(i = 128; i < 256; i++)
@@ -811,12 +811,12 @@
 
 	for(a = argv+2; *a; a++)
 	    if(!*++a) {
-		zerrnam(name, "even number of arguments required", NULL, 0);
+		zwarnnam(name, "even number of arguments required", NULL, 0);
 		return 1;
 	    }
     }
     if(km->flags & KM_IMMUTABLE) {
-	zerrnam(name, "keymap `%s' is protected", kmname, 0);
+	zwarnnam(name, "keymap `%s' is protected", kmname, 0);
 	return 1;
     }
     do {

-- 
Peter Stephenson <pws@ifh.de>       Tel: +39 50 844536
WWW:  http://www.ifh.de/~pws/
Gruppo Teorico, Dipartimento di Fisica
Piazza Torricelli 2, 56100 Pisa, Italy


^ permalink raw reply	[flat|nested] 4+ messages in thread

* PATCH: 3.0.5 Re: Weird bug with "bindkey"
  1998-03-25  9:23 ` PATCH: 3.1 Re: Weird bug with "bindkey" Peter Stephenson
@ 1998-03-25  9:45   ` Peter Stephenson
  0 siblings, 0 replies; 4+ messages in thread
From: Peter Stephenson @ 1998-03-25  9:45 UTC (permalink / raw)
  To: zsh-workers

> Here's a patch for 3.1, which simply replaces zerrnam() with
> zwarnnam() everywhere in zle_keymap.c (the unidiff was very much
> shorter so I've sent that, but mail me if you need a context diff).
> 
> Looks like I've got 3.0.x lying around, so I'll dig out a patch for
> that, too.

This is the corresponding patch.  Key binding was rather simpler, so
it's shorter.  One of the errors was a zerr() instead of a zerrnam(),
which are not usually used in builtins.  I've just assumed that was an
inconsistency. (Goodness!  An inconsistency in zsh!  Whatever next, a
stone in the Great Wall of China??)

If you're looking around, you'll notice other zerr()'s in zle_main.c
haven't been touched, because they're part of the editor itself, not
bindkey, so they really should abort back to main command level.  I
think.  All zerr/zerrnam vs. zwarnnam in the shell are potentially
negotiable (although builtins should certainly have zwarnnam(), as
here).

--- Src/zle_main.c.warn	Fri Sep 26 03:42:19 1997
+++ Src/zle_main.c	Wed Mar 25 10:29:02 1998
@@ -888,12 +888,12 @@
     int i, *tab;
 
     if (ops['v'] && ops['e']) {
-	zerrnam(name, "incompatible options", NULL, 0);
+	zwarnnam(name, "incompatible options", NULL, 0);
 	return 1;
     }
     if (ops['v'] || ops['e'] || ops['d'] || ops['m']) {
 	if (*argv) {
-	    zerrnam(name, "too many arguments", NULL, 0);
+	    zwarnnam(name, "too many arguments", NULL, 0);
 	    return 1;
 	}
 	if (ops['d']) {
@@ -962,7 +962,7 @@
 		func = (ky = (Key) keybindtab->getnode(keybindtab, s)) ? ky->func
 		    : z_undefinedkey;
 	    if (func == z_undefinedkey) {
-		zerrnam(name, "in-string is not bound", NULL, 0);
+		zwarnnam(name, "in-string is not bound", NULL, 0);
 		zfree(s, len);
 		return 1;
 	    }
@@ -1022,7 +1022,7 @@
 		if (!strcmp(*argv, zlecmds[i].name))
 		    break;
 	    if (i == ZLECMDCOUNT) {
-		zerr("undefined function: %s", *argv, 0);
+		zwarnnam(name, "undefined function: %s", *argv, 0);
 		zfree(s, len);
 		return 1;
 	    }

-- 
Peter Stephenson <pws@ifh.de>       Tel: +39 50 844536
WWW:  http://www.ifh.de/~pws/
Gruppo Teorico, Dipartimento di Fisica
Piazza Torricelli 2, 56100 Pisa, Italy


^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~1998-03-25  9:52 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
1998-03-24 17:19 Weird bug with "bindkey" in a function Bart Schaefer
1998-03-24 18:03 ` Andrew Main
1998-03-25  9:23 ` PATCH: 3.1 Re: Weird bug with "bindkey" Peter Stephenson
1998-03-25  9:45   ` PATCH: 3.0.5 " Peter Stephenson

Code repositories for project(s) associated with this public inbox

	https://git.vuxu.org/mirror/zsh/

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).