zsh-workers
 help / color / mirror / code / Atom feed
From: Oliver Kiddle <opk@zsh.org>
To: Roman Perepelitsa <roman.perepelitsa@gmail.com>
Cc: Zsh Workers <zsh-workers@zsh.org>
Subject: Re: one time in 20 error
Date: Sat, 10 Dec 2022 02:04:05 +0100	[thread overview]
Message-ID: <11286-1670634245.024361@Cn3a.dvUs.EJET> (raw)
In-Reply-To: <CAN=4vMrwRi40x704ii02KP=74dcXAn--9GfJ+78fauRCbvUU1g@mail.gmail.com>

Bart wrote:
> I'm not attached to them causing chaos, but I'm not sure discarding
> them unacknowledged is the right thing either.  Roman's binding does
> produce some unexpected behavior if you actually type escape bracket
> (which might occur in vi modes, if unlikely in emacs?).  Some kind of
> feep or "zle -M"-style warning, or is that also chaos?

Returning 1 from the widget function as I did in the C implementation
does result in a feep.

Allowing for KEYTIMEOUT resolves unexpected behaviour if you actually
type escape [.

Roman wrote:
> Is there an advantage to implementing this widget in C rather than zsh?

If implemented in shell code, every user that wants to make use of it
needs to setup the function and bind it for every keymap. That includes
local keymaps given that it is near certain to be a prefix of other
key bindings. What advantage do you see to implementing it in shell
code?

I wrote:
> After testing this, I'm inclined to think it would be better to special
> case the CSI sequence in getkeymapcmd() instead.

The new patch below takes this approach. This is able to be even
stricter on the definition of a CSI sequence. This has the advantage of
working even where the key sequence doesn't start with a CSI sequence.
So if Ctrl-X is a prefix, you can press Ctrl-X followed by Delete and
it'll wait for the full CSI sequence from the Delete key. Similarly for
cases like Alt-Delete generating a sequence like '^[^[[3~'.

If you examine keys with describe-key-briefly, it will now give,
e.g "^[[12~" is undefined-key for F2 where before I got "^[" is
vi-cmd-suffix-retain and [12~ inserted.

undefined-key is implemented as just return 1 so this results in a feep
but with mouse events enabled, that's all that happens. You still don't
want to enable mouse events if you've not arranged for them to be
handled.

Oliver

diff --git a/Src/Zle/zle_keymap.c b/Src/Zle/zle_keymap.c
index d90838f03..2fe48796c 100644
--- a/Src/Zle/zle_keymap.c
+++ b/Src/Zle/zle_keymap.c
@@ -1586,7 +1586,7 @@ getkeymapcmd(Keymap km, Thingy *funcp, char **strp)
     Thingy func = t_undefinedkey;
     char *str = NULL;
     int lastlen = 0, lastc = lastchar;
-    int timeout = 0;
+    int timeout = 0, csi = 0, startcsi;
 
     keybuflen = 0;
     keybuf[0] = 0;
@@ -1636,7 +1636,26 @@ getkeymapcmd(Keymap km, Thingy *funcp, char **strp)
 	    }
 #endif
 	}
-	if (!ispfx)
+
+	/* CSI key sequences have a well defined structure so if we currently
+	 * have an incomplete one, loop so the rest of it will be included in
+	 * the key sequence if that arrives within the timeout. */
+	if (keybuflen >= 3 && !csi) {
+	    startcsi = keybuflen - 3;
+	    csi = keybuf[startcsi] == '\033' && keybuf[keybuflen - 2] == '[';
+	}
+	if (csi) {
+	    csi = keybuf[keybuflen - 2] != Meta && keybuf[keybuflen - 1] >= 0x20
+		&& keybuf[keybuflen - 1] <= 0x3f;
+	    if (!csi && keybuf[keybuflen - 1] >= 0x40 &&
+		    keybuf[keybuflen - 1] <= 0x7e && lastlen > startcsi &&
+		    lastlen != keybuflen) {
+		func = t_undefinedkey;
+		lastlen = keybuflen;
+	    }
+	}
+
+	if (!ispfx && !csi)
 	    break;
     }
     if(!lastlen && keybuflen)


  reply	other threads:[~2022-12-10  1:04 UTC|newest]

Thread overview: 14+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <f29162cd-28d1-85ed-6a3c-9bec1fb2e13a@eastlink.ca>
     [not found] ` <CAA-Ti-hhbwZD3-aeMvy_tm5f7SKHw7XN4muJn8ymez1q7rAE_A@mail.gmail.com>
     [not found]   ` <CAN=4vMpCUNgKYgSR+4rmREpA25v_sLHYcS4nfTk8EQ_0Cg5yyw@mail.gmail.com>
     [not found]     ` <5d0c4e22-80b0-2fd2-ee75-6902da52d121@eastlink.ca>
     [not found]       ` <CAH+w=7aeERdOcpPzTmKVQFK7HLduh2s1J9VFzumCh6W0SJFqpg@mail.gmail.com>
     [not found]         ` <57e8e248-bb1a-663a-8557-e3fc13f671d4@eastlink.ca>
     [not found]           ` <CAH+w=7aW9meLuEKSGsKiZMXoAd7KBc9fgakXZnB_t2iphq=BPQ@mail.gmail.com>
     [not found]             ` <e35c2f14-abda-93d7-bf2c-6823d6d3215d@eastlink.ca>
     [not found]               ` <CAN=4vMrZzxYVjc63DwU=Scks39FhzmK+E57XerOwusmd64QOjw@mail.gmail.com>
     [not found]                 ` <c2f348d1-8982-d4a4-2c78-a0dd67319b8c@eastlink.ca>
     [not found]                   ` <CAGdYchv9T6ByD7meADqWzdJwAF2SG2YXhasT0=+AQvV+08ZRrA@mail.gmail.com>
2022-12-01 16:30                     ` ERR_RETURN doc Bart Schaefer
2022-12-01 19:30                       ` Philippe Altherr
2022-12-01 20:05                         ` Bart Schaefer
2022-12-01 22:52                           ` Philippe Altherr
2022-12-10 11:33                         ` Daniel Shahaf
2022-12-10 14:06                           ` Philippe Altherr
2022-12-11  1:24                             ` Bart Schaefer
2022-12-12 23:35                               ` Philippe Altherr
2022-12-05 23:48     ` one time in 20 error Oliver Kiddle
2022-12-06  0:13       ` Bart Schaefer
2022-12-06 13:21       ` Roman Perepelitsa
2022-12-10  1:04         ` Oliver Kiddle [this message]
2022-12-10  9:23           ` Roman Perepelitsa
2022-12-15  1:32           ` Oliver Kiddle

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=11286-1670634245.024361@Cn3a.dvUs.EJET \
    --to=opk@zsh.org \
    --cc=roman.perepelitsa@gmail.com \
    --cc=zsh-workers@zsh.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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).