Merge branch 'obsd-master'

This commit is contained in:
Thomas Adam 2024-09-17 00:01:09 +01:00
commit 64f1076d97
5 changed files with 356 additions and 23 deletions

42
input.c
View File

@ -1349,7 +1349,7 @@ input_csi_dispatch(struct input_ctx *ictx)
struct screen_write_ctx *sctx = &ictx->ctx;
struct screen *s = sctx->s;
struct input_table_entry *entry;
int i, n, m;
int i, n, m, ek;
u_int cx, bg = ictx->cell.cell.bg;
if (ictx->flags & INPUT_DISCARD)
@ -1407,30 +1407,36 @@ input_csi_dispatch(struct input_ctx *ictx)
break;
case INPUT_CSI_MODSET:
n = input_get(ictx, 0, 0, 0);
m = input_get(ictx, 1, 0, 0);
/*
* Set the extended key reporting mode as per the client request,
* unless "extended-keys always" forces us into mode 1.
*/
if (options_get_number(global_options, "extended-keys") != 1)
if (n != 4)
break;
screen_write_mode_clear(sctx,
MODE_KEYS_EXTENDED|MODE_KEYS_EXTENDED_2);
if (n == 4 && m == 1)
screen_write_mode_set(sctx, MODE_KEYS_EXTENDED);
if (n == 4 && m == 2)
m = input_get(ictx, 1, 0, 0);
/*
* Set the extended key reporting mode as per the client
* request, unless "extended-keys" is set to "off".
*/
ek = options_get_number(global_options, "extended-keys");
if (ek == 0)
break;
screen_write_mode_clear(sctx, EXTENDED_KEY_MODES);
if (m == 2)
screen_write_mode_set(sctx, MODE_KEYS_EXTENDED_2);
else if (m == 1 || ek == 2)
screen_write_mode_set(sctx, MODE_KEYS_EXTENDED);
break;
case INPUT_CSI_MODOFF:
n = input_get(ictx, 0, 0, 0);
if (n != 4)
break;
/*
* Clear the extended key reporting mode as per the client request,
* unless "extended-keys always" forces us into mode 1.
* Clear the extended key reporting mode as per the client
* request, unless "extended-keys always" forces into mode 1.
*/
if (n == 4) {
screen_write_mode_clear(sctx,
MODE_KEYS_EXTENDED|MODE_KEYS_EXTENDED_2);
}
screen_write_mode_clear(sctx,
MODE_KEYS_EXTENDED|MODE_KEYS_EXTENDED_2);
if (options_get_number(global_options, "extended-keys") == 2)
screen_write_mode_set(sctx, MODE_KEYS_EXTENDED);
break;
case INPUT_CSI_WINOPS:
input_csi_dispatch_winops(ictx);

View File

@ -385,6 +385,17 @@ const struct options_table_entry options_table[] = {
.text = "Maximum number of server messages to keep."
},
{ .name = "prefix-timeout",
.type = OPTIONS_TABLE_NUMBER,
.scope = OPTIONS_TABLE_SERVER,
.minimum = 0,
.maximum = INT_MAX,
.default_num = 0,
.unit = "milliseconds",
.text = "The timeout for the prefix key if no subsequent key is "
"pressed. Zero means disabled."
},
{ .name = "prompt-history-limit",
.type = OPTIONS_TABLE_NUMBER,
.scope = OPTIONS_TABLE_SERVER,

View File

@ -222,6 +222,17 @@ server_client_set_key_table(struct client *c, const char *name)
key_bindings_unref_table(c->keytable);
c->keytable = key_bindings_get_table(name, 1);
c->keytable->references++;
if (gettimeofday(&c->keytable->activity_time, NULL) != 0)
fatal("gettimeofday failed");
}
static uint64_t
server_client_key_table_activity_diff(struct client *c)
{
struct timeval diff;
timersub(&c->activity_time, &c->keytable->activity_time, &diff);
return ((diff.tv_sec * 1000ULL) + (diff.tv_usec / 1000ULL));
}
/* Get default key table. */
@ -1866,7 +1877,7 @@ server_client_key_callback(struct cmdq_item *item, void *data)
struct key_table *table, *first;
struct key_binding *bd;
int xtimeout;
uint64_t flags;
uint64_t flags, prefix_delay;
struct cmd_find_state fs;
key_code key0, prefix, prefix2;
@ -1961,8 +1972,34 @@ try_again:
if (c->flags & CLIENT_REPEAT)
log_debug("currently repeating");
/* Try to see if there is a key binding in the current table. */
bd = key_bindings_get(table, key0);
/*
* If prefix-timeout is enabled and we're in the prefix table, see if
* the timeout has been exceeded. Revert to the root table if so.
*/
prefix_delay = options_get_number(global_options, "prefix-timeout");
if (prefix_delay > 0 &&
strcmp(table->name, "prefix") == 0 &&
server_client_key_table_activity_diff(c) > prefix_delay) {
/*
* If repeating is active and this is a repeating binding,
* ignore the timeout.
*/
if (bd != NULL &&
(c->flags & CLIENT_REPEAT) &&
(bd->flags & KEY_BINDING_REPEAT)) {
log_debug("prefix timeout ignored, repeat is active");
} else {
log_debug("prefix timeout exceeded");
server_client_set_key_table(c, NULL);
first = table = c->keytable;
server_status_client(c);
goto table_changed;
}
}
/* Try to see if there is a key binding in the current table. */
if (bd != NULL) {
/*
* Key was matched in this table. If currently repeating but a

284
tmux.1
View File

@ -1814,6 +1814,23 @@ is used to name the new paste buffer.
.Xc
Copy from the cursor position and exit copy mode.
.It Xo
.Ic copy-pipe-end-of-line
.Op Ar command
.Op Ar prefix
.Xc
Copy from the cursor position to the end of the line and pipe the text to
.Ar command .
.Ar prefix
is used to name the new paste buffer.
.It Xo
.Ic copy-pipe-end-of-line-and-cancel
.Op Ar command
.Op Ar prefix
.Xc
Same as
.Ic copy-pipe-end-of-line
but also exit copy mode.
.It Xo
.Ic copy-line
.Op Ar prefix
.Xc
@ -1824,11 +1841,60 @@ Copy the entire line.
.Xc
Copy the entire line and exit copy mode.
.It Xo
.Ic copy-pipe-line
.Op Ar command
.Op Ar prefix
.Xc
Copy the entire line and pipe the text to
.Ar command .
.Ar prefix
is used to name the new paste buffer.
.It Xo
.Ic copy-pipe-line-and-cancel
.Op Ar command
.Op Ar prefix
.Xc
Same as
.Ic copy-pipe-line
but also exit copy mode.
.It Xo
.Ic copy-pipe
.Op Ar command
.Op Ar prefix
.Xc
Copy the selection, clear it and pipe its text to
.Ar command .
.Ar prefix
is used to name the new paste buffer.
.It Xo
.Ic copy-pipe-no-clear
.Op Ar command
.Op Ar prefix
.Xc
Same as
.Ic copy-pipe
but do not clear the selection.
.It Xo
.Ic copy-pipe-and-cancel
.Op Ar command
.Op Ar prefix
.Xc
Same as
.Ic copy-pipe
but also exit copy mode.
.It Xo
.Ic copy-selection
.Op Ar prefix
.Xc
Copies the current selection.
.It Xo
.Ic copy-selection-no-clear
.Op Ar prefix
.Xc
Same as
.Ic copy-selection
but do not clear the selection.
.It Xo
.Ic copy-selection-and-cancel
.Op Ar prefix
(vi: Enter)
@ -1842,6 +1908,12 @@ Copy the current selection and exit copy mode.
.Xc
Move the cursor down.
.It Xo
.Ic cursor-down-and-cancel
.Xc
Same as
.Ic cursor-down
but also exit copy mode if reaching the bottom.
.It Xo
.Ic cursor-left
(vi: h)
(emacs: Left)
@ -1873,6 +1945,24 @@ Move the cursor to the end of the line.
.Xc
Move the cursor to a specific line.
.It Xo
.Ic halfpage-down
(vi: C-d)
(emacs: M-Down)
.Xc
Scroll down by half a page.
.It Xo
.Ic halfpage-down-and-cancel
.Xc
Same as
.Ic halfpage-down
but also exit copy mode if reaching the bottom.
.It Xo
.Ic halfpage-up
(vi: C-u)
(emacs: M-Up)
.Xc
Scroll up by half a page.
.It Xo
.Ic history-bottom
(vi: G)
(emacs: M->)
@ -1905,6 +1995,27 @@ Jump backwards to the specified text.
.Xc
Jump forward to the specified text.
.It Xo
.Ic jump-reverse
(vi: ,)
(emacs: ,)
.Xc
Repeat the last jump in the reverse direction (forward becomes backward and
backward becomes forward).
.It Xo
.Ic jump-to-backward
.Ar to
(vi: T)
.Xc
Jump backwards, but one character less, placing the cursor on the character
after the target.
.It Xo
.Ic jump-to-forward
.Ar to
(vi: t)
.Xc
Jump forward, but one character less, placing the cursor on the character
before the target.
.It Xo
.Ic jump-to-mark
(vi: M-x)
(emacs: M-x)
@ -1939,18 +2050,71 @@ Move to the next prompt.
.Xc
Move to the next word.
.It Xo
.Ic next-word-end
(vi: e)
(emacs: M-f)
.Xc
Move to the end of the next word.
.It Xo
.Ic next-space
(vi: W)
.Xc
Same as
.Ic next-word
but use a space alone as the word separator.
.It Xo
.Ic next-space-end
(vi: E)
.Xc
Same as
.Ic next-word-end
but use a space alone as the word separator.
.It Xo
.Ic other-end
(vi: o)
.Xc
Switch at which end of the selection the cursor sits.
.It Xo
.Ic page-down
(vi: C-f)
(emacs: PageDown)
.Xc
Scroll down by one page.
.It Xo
.Ic page-down-and-cancel
.Xc
Same as
.Ic page-down
but also exit copy mode if reaching the bottom.
.It Xo
.Ic page-up
(vi: C-b)
(emacs: PageUp)
.Xc
Scroll up by one page.
.It Xo
.Ic pipe
.Op Ar command
.Xc
Pipe the selected text to
.Ar command
and clear the selection.
.It Xo
.Ic pipe-no-clear
.Op Ar command
.Xc
Same as
.Ic pipe
but do not clear the selection.
.It Xo
.Ic pipe-and-cancel
.Op Ar command
.Op Ar prefix
.Xc
Same as
.Ic pipe
but also exit copy mode.
.It Xo
.Ic previous-matching-bracket
(emacs: M-C-b)
.Xc
@ -1973,6 +2137,21 @@ Move to the previous prompt.
.Xc
Move to the previous word.
.It Xo
.Ic previous-space
(vi: B)
.Xc
Same as
.Ic previous-word
but use a space alone as the word separator.
.It Xo
.Ic rectangle-on
.Xc
Turn on rectangle selection mode.
.It Xo
.Ic rectangle-off
.Xc
Turn off rectangle selection mode.
.It Xo
.Ic rectangle-toggle
(vi: v)
(emacs: R)
@ -1985,6 +2164,40 @@ Toggle rectangle selection mode.
.Xc
Refresh the content from the pane.
.It Xo
.Ic scroll-bottom
.Xc
Scroll up until the current line is at the bottom while keeping the cursor on
that line.
.It Xo
.Ic scroll-down
(vi: C-e)
(emacs: C-Down)
.Xc
Scroll down.
.It Xo
.Ic scroll-down-and-cancel
.Xc
Same as
.Ic scroll-down
but also exit copy mode if the cursor reaches the bottom.
.It Xo
.Ic scroll-middle
(vi: z)
.Xc
Scroll so that the current line becomes the middle one while keeping the
cursor on that line.
.It Xo
.Ic scroll-top
.Xc
Scroll down until the current line is at the top while keeping the cursor on
that line.
.It Xo
.Ic scroll-up
(vi: C-y)
(emacs: C-Up)
.Xc
Scroll up.
.It Xo
.Ic search-again
(vi: n)
(emacs: n)
@ -1997,12 +2210,51 @@ Repeat the last search.
.Xc
Search backwards for the specified text.
.It Xo
.Ic search-backward-incremental
.Ar text
(emacs: C-r)
.Xc
Search backwards incrementally for the specified text.
Is expected to be used with the
.Fl i
flag to the
.Ic command-prompt
command.
.It Xo
.Ic search-backward-text
.Ar text
.Xc
Search backwards for the specified plain text.
.It Xo
.Ic search-forward
.Ar text
(vi: /)
.Xc
Search forward for the specified text.
.It Xo
.Ic search-forward-incremental
.Ar text
(emacs: C-s)
.Xc
Search forward incrementally for the specified text.
Is expected to be used with the
.Fl i
flag to the
.Ic command-prompt
command.
.It Xo
.Ic search-forward-text
.Ar text
.Xc
Search forward for the specified plain text.
.It Xo
.Ic search-reverse
(vi: N)
(emacs: N)
.Xc
Repeat the last search in the reverse direction (forward becomes backward and
backward becomes forward).
.It Xo
.Ic select-line
(vi: V)
.Xc
@ -2012,12 +2264,28 @@ Select the current line.
.Xc
Select the current word.
.It Xo
.Ic set-mark
(vi: X)
(emacs: X)
.Xc
Mark the current line.
.It Xo
.Ic start-of-line
(vi: 0)
(emacs: C-a)
.Xc
Move the cursor to the start of the line.
.It Xo
.Ic stop-selection
.Xc
Stop selecting without clearing the current selection.
.It Xo
.Ic toggle-position
(vi: P)
(emacs: P)
.Xc
Toggle the visibility of the position indicator in the top right.
.It Xo
.Ic top-line
(vi: H)
(emacs: M-R)
@ -3797,7 +4065,8 @@ the sequence for only keys which lack an existing well-known representation; or
mode 2 which changes the sequence for all keys.
When set to
.Ic always ,
mode 1 output is forced and the program cannot change it.
modes 1 and 2 can still be requested by applications, but mode 1 will be forced
instead of the standard mode.
When set to
.Ic off ,
this feature is disabled and only standard keys are reported.
@ -4093,10 +4362,12 @@ If
(the default), leave the session orphaned.
If
.Ic keep-last ,
destroy the session only if it is in a group and has other sessions in that group.
destroy the session only if it is in a group and has other sessions in that
group.
If
.Ic keep-group ,
destroy the session unless it is in a group and is the only session in that group.
destroy the session unless it is in a group and is the only session in that
group.
.It Xo Ic detach-on-destroy
.Op Ic off | on | no-detached | previous | next
.Xc
@ -4230,6 +4501,13 @@ Like
.Ic prefix2
can be set to
.Ql None .
.It Ic prefix-timeout Ar time
Set the time in milliseconds for which
.Nm
waits after
.Ic prefix
is input before dismissing it.
Can be set to zero to disable any timeout.
.It Xo Ic renumber-windows
.Op Ic on | off
.Xc

1
tmux.h
View File

@ -2016,6 +2016,7 @@ RB_HEAD(key_bindings, key_binding);
struct key_table {
const char *name;
struct timeval activity_time;
struct key_bindings key_bindings;
struct key_bindings default_key_bindings;