Download raw body.
tog: user-defined keymap timeout
On 22-06-28 10:47am, Omar Polo wrote: > Hi! > > Mark Jamsek <mark@jamsek.com> wrote: > > As Stefan suggested in the original thread, enable user-defined timeout > > for compound keymaps, configurable with an envvar. This also increases > > the default value to 1 second (up from 0.5s). > > I'm still not sold on the idea, but since many programs (tmux, vi, ...) > have settings for this maybe we need one too? i'll leave to other to > judge :) I admit, I was somewhat ambivalent about this until today. But for whatever reason, the 500ms timeout was too fast this afternoon and I kept missing the map I was going for, which was annoying. So first I changed the default to 1s, then I thought of Stefan's comments and realised it was necessary. > > diff refs/heads/main refs/heads/dev/nkeymap > > blob - 728ba5ee9e20edbde20ed7f0c2ff1cbabad89c0b > > blob + 7acca5d60fb3d0dfb62ffe6c1848aa16315f03c3 > > --- tog/tog.1 > > +++ tog/tog.1 > > @@ -64,6 +64,11 @@ will wait 500 milliseconds for each successive integer > ^^^^^^^^^^^^^^^^^^^^^^^^^^ > > maybe we need to update that too then? :) I had a feeling I missed something. I also left a stale comment behind too :) > > to complete. > > If this sequence should timeout or does not conclude with a valid key binding, > > the command is aborted and any preceding count is reset. > > +This behavior can be customized with the TOG_KEYMAP_TIMEOUT environment > > please use the Ev macro to mark env variables: > > +This behavior can be customized with the > +.Ev TOG_KEYMAP_TIMEOUT > +environment Done. Thanks, Omar! > > +variable. > > +See > > +.Sx ENVIRONMENT > > +for details. > > The global key bindings are: > > .Bl -tag -width Ds > > .It Cm Q > > @@ -561,6 +566,12 @@ work tree, use the repository path associated with thi > > .El > > .Sh ENVIRONMENT > > .Bl -tag -width TOG_COLORS > > +.It Ev TOG_KEYMAP_TIMEOUT > > +Define the timeout interval between compound sequence keypresses. > > +The value must be an integer between 1 and 255, and specifies how many tenths > > +of a second > > +.Nm > > +will wait before timing out (default: 10). > > .It Ev TOG_COLORS > > .Nm > > shows colorized output if this variable is set to a non-empty value. > > blob - 87eeaf0b99951e273aa30da21d81e7ab116412c7 > > blob + 6f9bc97a1dbc436514494bb9e7f79b8ea9e5be02 > > --- tog/tog.c > > +++ tog/tog.c > > @@ -504,6 +504,7 @@ struct tog_view { > > int lines, cols; /* copies of LINES and COLS */ > > int ch, count; /* current keymap and count prefix */ > > int focussed; /* Only set on one parent or child view at a time. */ > > + int timeout; /* timeout for compound key maps (default: 10=1s) */ > > why set this per-view? shouldn't be easier to have a global for it, set > only once during startup instead of adapting all the view_* functions? > Are we expecting to have different timeouts per-view? I actually started doing this and for some reason I can't explain I changed it. But, yes, this makes a lot more sense. > > int dying; > > struct tog_view *parent; > > struct tog_view *child; > > @@ -899,7 +900,7 @@ get_compound_key(struct tog_view *view, int c) > > int x, n = 0; > > > > view->count = 0; > > - halfdelay(5); /* block for half a second */ > > + halfdelay(view->timeout); /* timeout interval between keys */ > > wattron(view->window, A_BOLD); > > wmove(view->window, view->nlines - 1, 0); > > wclrtoeol(view->window); > > @@ -927,6 +928,20 @@ get_compound_key(struct tog_view *view, int c) > > return c; > > } > > > > +static void > > +set_keymap_timeout(struct tog_view *view) > > +{ > > + const char *timeout; > > + > > + /* fallback to default on error or if not set */ > > + timeout = getenv("TOG_KEYMAP_TIMEOUT"); > > + if (timeout != NULL) > > + view->timeout = strtonum(timeout, 1, 255, NULL); > > random thought: maybe we can allow 0 to mean "no delay"? Done! And tbh I first thought this was redundant as we could just set it to 255 to achieve the same thing in practice. But having tested this just now, I really like it :) Updated diff: diff refs/heads/main refs/heads/dev/nkeymap blob - 728ba5ee9e20edbde20ed7f0c2ff1cbabad89c0b blob + acc4a879396877352bf8cbabcba31222cb07048a --- tog/tog.1 +++ tog/tog.1 @@ -60,10 +60,16 @@ denoted by N in the descriptions below, and is used as operation as indicated. When the first integer for a count modifier is entered, .Nm -will wait 500 milliseconds for each successive integer or the compound sequence +will wait 1 second for each successive integer or the compound sequence to complete. If this sequence should timeout or does not conclude with a valid key binding, the command is aborted and any preceding count is reset. +This behavior can be customized with the +.Ev TOG_KEYMAP_TIMEOUT +environment variable. +See +.Sx ENVIRONMENT +for details. The global key bindings are: .Bl -tag -width Ds .It Cm Q @@ -561,6 +567,14 @@ work tree, use the repository path associated with thi .El .Sh ENVIRONMENT .Bl -tag -width TOG_COLORS +.It Ev TOG_KEYMAP_TIMEOUT +Define the timeout interval between compound sequence keypresses. +The value must be an integer between 0 and 255, and specifies how many tenths +of a second +.Nm +waits before timing out. 0 disables timeout so that +.Nm +waits until a non-numeric key is entered (default: 10). .It Ev TOG_COLORS .Nm shows colorized output if this variable is set to a non-empty value. blob - 87eeaf0b99951e273aa30da21d81e7ab116412c7 blob + b7db261c67a024d7918645c7d8637940e65ce369 --- tog/tog.c +++ tog/tog.c @@ -596,6 +596,8 @@ static const struct got_error *close_ref_view(struct t static const struct got_error *search_start_ref_view(struct tog_view *); static const struct got_error *search_next_ref_view(struct tog_view *); +static int tog_timeout = 10; /* timeout for compound keymaps (default: 1s) */ + static volatile sig_atomic_t tog_sigwinch_received; static volatile sig_atomic_t tog_sigpipe_received; static volatile sig_atomic_t tog_sigcont_received; @@ -888,10 +890,10 @@ view_search_start(struct tog_view *view) } /* - * Compute view->count from numeric user input. User has five-tenths of a - * second to follow each numeric keypress with another number to form count. + * Compute view->count from numeric user input. User has tog_timeout tenths of + * a second to follow each numeric keypress with another number to form count. + * If tog_timeout is 0, block till non-numeric input is entered. * Return first non-numeric input or ERR and assign total to view->count. - * XXX Should we add support for user-defined timeout? */ static int get_compound_key(struct tog_view *view, int c) @@ -899,7 +901,10 @@ get_compound_key(struct tog_view *view, int c) int x, n = 0; view->count = 0; - halfdelay(5); /* block for half a second */ + if (tog_timeout) + halfdelay(tog_timeout); /* timeout interval between keys */ + else + cbreak(); /* timeout disabled--block till non-numeric input */ wattron(view->window, A_BOLD); wmove(view->window, view->nlines - 1, 0); wclrtoeol(view->window); @@ -927,6 +932,24 @@ get_compound_key(struct tog_view *view, int c) return c; } +static void +set_keymap_timeout(void) +{ + const char *timeout; + + /* fallback to default on error or if not set */ + timeout = getenv("TOG_KEYMAP_TIMEOUT"); + if (timeout != NULL) { + const char *errstr; + int t; + + t = strtonum(timeout, 0, 255, &errstr); + if (!errstr) + tog_timeout = t; + } + +} + static const struct got_error * view_input(struct tog_view **new, int *done, struct tog_view *view, struct tog_view_list_head *views) @@ -7418,6 +7441,8 @@ main(int argc, char *argv[]) } } + set_keymap_timeout(); + if (cmd == NULL) { if (argc != 1) usage(0, 1); -- Mark Jamsek <fnc.bsdbox.org> GPG: F2FF 13DE 6A06 C471 CA80 E6E2 2930 DC66 86EE CF68
tog: user-defined keymap timeout