From 8f1cc0e9fa78a6200ba6bddf7c8958225d9fdd6d Mon Sep 17 00:00:00 2001 From: kn Date: Thu, 4 Nov 2021 13:15:13 +0000 Subject: [PATCH 01/11] Fix mandoc HTML rendering for command aliases Replace hand-rolled parentheses with the proper mdoc(7) macro, otherwise the closing ")" ends up inside the command description. Reported by Josh Rickmar, thanks! --- tmux.1 | 150 ++++++++++++++++++++++++++++----------------------------- 1 file changed, 75 insertions(+), 75 deletions(-) diff --git a/tmux.1 b/tmux.1 index 4131719c..20723308 100644 --- a/tmux.1 +++ b/tmux.1 @@ -1034,7 +1034,7 @@ The following commands are available to manage clients and sessions: .Op Fl f Ar flags .Op Fl t Ar target-session .Xc -.D1 (alias: Ic attach ) +.D1 Pq alias: Ic attach If run from outside .Nm , create a new client in the current terminal and attach it to @@ -1121,7 +1121,7 @@ option will not be applied. .Op Fl s Ar target-session .Op Fl t Ar target-client .Xc -.D1 (alias: Ic detach ) +.D1 Pq alias: Ic detach Detach the current client if bound to a key, the client specified with .Fl t , or all clients currently attached to the session specified by @@ -1143,7 +1143,7 @@ run to replace the client. .Tg has .It Ic has-session Op Fl t Ar target-session -.D1 (alias: Ic has ) +.D1 Pq alias: Ic has Report an error and exit with 1 if the specified session does not exist. If it does exist, exit with 0. .It Ic kill-server @@ -1168,7 +1168,7 @@ session. .Op Fl F Ar format .Op Fl t Ar target-session .Xc -.D1 (alias: Ic lsc ) +.D1 Pq alias: Ic lsc List all clients attached to the server. For the meaning of the .Fl F @@ -1183,7 +1183,7 @@ is specified, list only clients connected to that session. .Op Fl F Ar format .Op Ar command .Xc -.D1 (alias: Ic lscm ) +.D1 Pq alias: Ic lscm List the syntax of .Ar command or - if omitted - of all commands supported by @@ -1193,7 +1193,7 @@ or - if omitted - of all commands supported by .Op Fl F Ar format .Op Fl f Ar filter .Xc -.D1 (alias: Ic ls ) +.D1 Pq alias: Ic ls List all sessions managed by the server. .Fl F specifies the format of each line and @@ -1205,7 +1205,7 @@ See the section. .Tg lockc .It Ic lock-client Op Fl t Ar target-client -.D1 (alias: Ic lockc ) +.D1 Pq alias: Ic lockc Lock .Ar target-client , see the @@ -1213,7 +1213,7 @@ see the command. .Tg locks .It Ic lock-session Op Fl t Ar target-session -.D1 (alias: Ic locks ) +.D1 Pq alias: Ic locks Lock all clients attached to .Ar target-session . .Tg new @@ -1230,7 +1230,7 @@ Lock all clients attached to .Op Fl y Ar height .Op Ar shell-command .Xc -.D1 (alias: Ic new ) +.D1 Pq alias: Ic new Create a new session with name .Ar session-name . .Pp @@ -1346,7 +1346,7 @@ specified multiple times. .Op Fl t Ar target-client .Op Ar adjustment .Xc -.D1 (alias: Ic refresh ) +.D1 Pq alias: Ic refresh Refresh the current client if bound to a key, or a single client if one is given with .Fl t . @@ -1477,7 +1477,7 @@ option. .Op Fl t Ar target-session .Ar new-name .Xc -.D1 (alias: Ic rename ) +.D1 Pq alias: Ic rename Rename the session to .Ar new-name . .Tg showmsgs @@ -1485,7 +1485,7 @@ Rename the session to .Op Fl JT .Op Fl t Ar target-client .Xc -.D1 (alias: Ic showmsgs ) +.D1 Pq alias: Ic showmsgs Show server messages or information. Messages are stored, up to a maximum of the limit set by the .Ar message-limit @@ -1500,7 +1500,7 @@ show debugging information about jobs and terminals. .Ar path .Ar ... .Xc -.D1 (alias: Ic source ) +.D1 Pq alias: Ic source Execute commands from one or more files specified by .Ar path (which may be @@ -1523,7 +1523,7 @@ the file is parsed but no commands are executed. shows the parsed commands and line numbers if possible. .Tg start .It Ic start-server -.D1 (alias: Ic start ) +.D1 Pq alias: Ic start Start the .Nm server, if not already running, without creating any sessions. @@ -1542,7 +1542,7 @@ $ tmux start \\; show -g .It Xo Ic suspend-client .Op Fl t Ar target-client .Xc -.D1 (alias: Ic suspendc ) +.D1 Pq alias: Ic suspendc Suspend a client by sending .Dv SIGTSTP (tty stop). @@ -1553,7 +1553,7 @@ Suspend a client by sending .Op Fl t Ar target-session .Op Fl T Ar key-table .Xc -.D1 (alias: Ic switchc ) +.D1 Pq alias: Ic switchc Switch the current session for client .Ar target-client to @@ -1945,7 +1945,7 @@ Commands related to windows and panes are as follows: .Op Fl s Ar src-pane .Op Fl t Ar dst-window .Xc -.D1 (alias: Ic breakp ) +.D1 Pq alias: Ic breakp Break .Ar src-pane off from its containing window to make it the only pane in @@ -1974,7 +1974,7 @@ but a different format may be specified with .Op Fl S Ar start-line .Op Fl t Ar target-pane .Xc -.D1 (alias: Ic capturep ) +.D1 Pq alias: Ic capturep Capture the contents of a pane. If .Fl p @@ -2226,7 +2226,7 @@ This command works only if at least one client is attached. .Op Fl t Ar target-client .Op Ar template .Xc -.D1 (alias: Ic displayp ) +.D1 Pq alias: Ic displayp Display a visible indicator of each pane shown by .Ar target-client . See the @@ -2266,7 +2266,7 @@ other commands are not blocked from running until the indicator is closed. .Op Fl t Ar target-pane .Ar match-string .Xc -.D1 (alias: Ic findw ) +.D1 Pq alias: Ic findw Search for a .Xr fnmatch 3 pattern or, with @@ -2296,7 +2296,7 @@ This command works only if at least one client is attached. .Op Fl s Ar src-pane .Op Fl t Ar dst-pane .Xc -.D1 (alias: Ic joinp ) +.D1 Pq alias: Ic joinp Like .Ic split-window , but instead of splitting @@ -2324,7 +2324,7 @@ the marked pane is used rather than the current pane. .Op Fl a .Op Fl t Ar target-pane .Xc -.D1 (alias: Ic killp ) +.D1 Pq alias: Ic killp Destroy the given pane. If no panes remain in the containing window, it is also destroyed. The @@ -2336,7 +2336,7 @@ option kills all but the pane given with .Op Fl a .Op Fl t Ar target-window .Xc -.D1 (alias: Ic killw ) +.D1 Pq alias: Ic killw Kill the current window or the window at .Ar target-window , removing it from any sessions to which it is linked. @@ -2349,7 +2349,7 @@ option kills all but the window given with .Op Fl deZ .Op Fl t Ar target-window .Xc -.D1 (alias: Ic lastp ) +.D1 Pq alias: Ic lastp Select the last (previously selected) pane. .Fl Z keeps the window zoomed if it was zoomed. @@ -2359,7 +2359,7 @@ enables or disables input to the pane. .Tg last .It Ic last-window Op Fl t Ar target-session -.D1 (alias: Ic last ) +.D1 Pq alias: Ic last Select the last (previously selected) window. If no .Ar target-session @@ -2370,7 +2370,7 @@ is specified, select the last window of the current session. .Op Fl s Ar src-window .Op Fl t Ar dst-window .Xc -.D1 (alias: Ic linkw ) +.D1 Pq alias: Ic linkw Link the window at .Ar src-window to the specified @@ -2402,7 +2402,7 @@ is given, the newly linked window is not selected. .Op Fl f Ar filter .Op Fl t Ar target .Xc -.D1 (alias: Ic lsp ) +.D1 Pq alias: Ic lsp If .Fl a is given, @@ -2431,7 +2431,7 @@ section. .Op Fl f Ar filter .Op Fl t Ar target-session .Xc -.D1 (alias: Ic lsw ) +.D1 Pq alias: Ic lsw If .Fl a is given, list all windows on the server. @@ -2452,7 +2452,7 @@ section. .Op Fl s Ar src-pane .Op Fl t Ar dst-pane .Xc -.D1 (alias: Ic movep ) +.D1 Pq alias: Ic movep Does the same as .Ic join-pane . .Tg movew @@ -2461,7 +2461,7 @@ Does the same as .Op Fl s Ar src-window .Op Fl t Ar dst-window .Xc -.D1 (alias: Ic movew ) +.D1 Pq alias: Ic movew This is similar to .Ic link-window , except the window at @@ -2484,7 +2484,7 @@ option. .Op Fl t Ar target-window .Op Ar shell-command .Xc -.D1 (alias: Ic neww ) +.D1 Pq alias: Ic neww Create a new window. With .Fl a @@ -2559,14 +2559,14 @@ but a different format may be specified with .Fl F . .Tg nextl .It Ic next-layout Op Fl t Ar target-window -.D1 (alias: Ic nextl ) +.D1 Pq alias: Ic nextl Move a window to the next layout and rearrange the panes to fit. .Tg next .It Xo Ic next-window .Op Fl a .Op Fl t Ar target-session .Xc -.D1 (alias: Ic next ) +.D1 Pq alias: Ic next Move to the next window in the session. If .Fl a @@ -2577,7 +2577,7 @@ is used, move to the next window with an alert. .Op Fl t Ar target-pane .Op Ar shell-command .Xc -.D1 (alias: Ic pipep ) +.D1 Pq alias: Ic pipep Pipe output sent by the program in .Ar target-pane to a shell command or vice versa. @@ -2624,14 +2624,14 @@ bind-key C-p pipe-pane -o 'cat >>~/output.#I-#P' .It Xo Ic previous-layout .Op Fl t Ar target-window .Xc -.D1 (alias: Ic prevl ) +.D1 Pq alias: Ic prevl Move to the previous layout in the session. .Tg prev .It Xo Ic previous-window .Op Fl a .Op Fl t Ar target-session .Xc -.D1 (alias: Ic prev ) +.D1 Pq alias: Ic prev Move to the previous window in the session. With .Fl a , @@ -2641,7 +2641,7 @@ move to the previous window with an alert. .Op Fl t Ar target-window .Ar new-name .Xc -.D1 (alias: Ic renamew ) +.D1 Pq alias: Ic renamew Rename the current window, or the window at .Ar target-window if specified, to @@ -2654,7 +2654,7 @@ if specified, to .Op Fl y Ar height .Op Ar adjustment .Xc -.D1 (alias: Ic resizep ) +.D1 Pq alias: Ic resizep Resize a pane, up, down, left or right by .Ar adjustment with @@ -2699,7 +2699,7 @@ history to replace them. .Op Fl y Ar height .Op Ar adjustment .Xc -.D1 (alias: Ic resizew ) +.D1 Pq alias: Ic resizew Resize a window, up, down, left or right by .Ar adjustment with @@ -2732,7 +2732,7 @@ to manual in the window options. .Op Fl t Ar target-pane .Op Ar shell-command .Xc -.D1 (alias: Ic respawnp ) +.D1 Pq alias: Ic respawnp Reactivate a pane in which the command has exited (see the .Ic remain-on-exit window option). @@ -2758,7 +2758,7 @@ command. .Op Fl t Ar target-window .Op Ar shell-command .Xc -.D1 (alias: Ic respawnw ) +.D1 Pq alias: Ic respawnw Reactivate a window in which the command has exited (see the .Ic remain-on-exit window option). @@ -2781,7 +2781,7 @@ command. .Op Fl DUZ .Op Fl t Ar target-window .Xc -.D1 (alias: Ic rotatew ) +.D1 Pq alias: Ic rotatew Rotate the positions of the panes within a window, either upward (numerically lower) with .Fl U @@ -2794,7 +2794,7 @@ keeps the window zoomed if it was zoomed. .Op Fl t Ar target-pane .Op Ar layout-name .Xc -.D1 (alias: Ic selectl ) +.D1 Pq alias: Ic selectl Choose a specific layout for a window. If .Ar layout-name @@ -2817,7 +2817,7 @@ spreads the current pane and any panes next to it out evenly. .Op Fl T Ar title .Op Fl t Ar target-pane .Xc -.D1 (alias: Ic selectp ) +.D1 Pq alias: Ic selectp Make pane .Ar target-pane the active pane in its window. @@ -2861,7 +2861,7 @@ and .Op Fl lnpT .Op Fl t Ar target-window .Xc -.D1 (alias: Ic selectw ) +.D1 Pq alias: Ic selectw Select the window at .Ar target-window . .Fl l , @@ -2889,7 +2889,7 @@ the command behaves like .Op Ar shell-command .Op Fl F Ar format .Xc -.D1 (alias: Ic splitw ) +.D1 Pq alias: Ic splitw Create a new pane by splitting .Ar target-pane : .Fl h @@ -2946,7 +2946,7 @@ command. .Op Fl s Ar src-pane .Op Fl t Ar dst-pane .Xc -.D1 (alias: Ic swapp ) +.D1 Pq alias: Ic swapp Swap two panes. If .Fl U @@ -2975,7 +2975,7 @@ the marked pane is used rather than the current pane. .Op Fl s Ar src-window .Op Fl t Ar dst-window .Xc -.D1 (alias: Ic swapw ) +.D1 Pq alias: Ic swapw This is similar to .Ic link-window , except the source and destination windows are swapped. @@ -2996,7 +2996,7 @@ the window containing the marked pane is used rather than the current window. .Op Fl k .Op Fl t Ar target-window .Xc -.D1 (alias: Ic unlinkw ) +.D1 Pq alias: Ic unlinkw Unlink .Ar target-window . Unless @@ -3069,7 +3069,7 @@ Commands related to key bindings are as follows: .Op Fl T Ar key-table .Ar key command Op Ar arguments .Xc -.D1 (alias: Ic bind ) +.D1 Pq alias: Ic bind Bind key .Ar key to @@ -3127,7 +3127,7 @@ command. .Op Fl P Ar prefix-string Fl T Ar key-table .Op Ar key .Xc -.D1 (alias: Ic lsk ) +.D1 Pq alias: Ic lsk List key bindings. There are two forms: the default lists keys as .Ic bind-key @@ -3164,7 +3164,7 @@ lists the command for keys that do not have a note rather than skipping them. .Op Fl t Ar target-pane .Ar key Ar ... .Xc -.D1 (alias: Ic send ) +.D1 Pq alias: Ic send Send a key or keys to a window. Each argument .Ar key @@ -3215,7 +3215,7 @@ the secondary prefix key, to a window as if it was pressed. .Op Fl T Ar key-table .Ar key .Xc -.D1 (alias: Ic unbind ) +.D1 Pq alias: Ic unbind Unbind the command bound to .Ar key . .Fl n @@ -3311,7 +3311,7 @@ Commands which set options are as follows: .Op Fl t Ar target-pane .Ar option Ar value .Xc -.D1 (alias: Ic set ) +.D1 Pq alias: Ic set Set a pane option with .Fl p , a window option with @@ -3386,7 +3386,7 @@ the result would be the default background and a blue foreground. .Op Fl t Ar target-pane .Op Ar option .Xc -.D1 (alias: Ic show ) +.D1 Pq alias: Ic show Show the pane options (or a single option if .Ar option is provided) with @@ -5425,7 +5425,7 @@ Commands to alter and view the environment are: .Op Fl t Ar target-session .Ar name Op Ar value .Xc -.D1 (alias: Ic setenv ) +.D1 Pq alias: Ic setenv Set or unset an environment variable. If .Fl g @@ -5451,7 +5451,7 @@ marks the variable as hidden. .Op Fl t Ar target-session .Op Ar variable .Xc -.D1 (alias: Ic showenv ) +.D1 Pq alias: Ic showenv Display the environment for .Ar target-session or the global environment with @@ -5534,7 +5534,7 @@ Commands related to the status line are as follows: .It Xo Ic clear-prompt-history .Op Fl T Ar prompt-type .Xc -.D1 (alias: Ic clrphist ) +.D1 Pq alias: Ic clrphist Clear status prompt history for prompt type .Ar prompt-type . If @@ -5660,7 +5660,7 @@ until it is dismissed. .Op Fl t Ar target-client .Ar command .Xc -.D1 (alias: Ic confirm ) +.D1 Pq alias: Ic confirm Ask for confirmation before executing .Ar command . If @@ -5689,7 +5689,7 @@ until it is dismissed. .Ar command .Ar ... .Xc -.D1 (alias: Ic menu ) +.D1 Pq alias: Ic menu Display a menu on .Ar target-client . .Ar target-pane @@ -5776,7 +5776,7 @@ The following keys are also available: .Op Fl t Ar target-pane .Op Ar message .Xc -.D1 (alias: Ic display ) +.D1 Pq alias: Ic display Display a message. If .Fl p @@ -5827,7 +5827,7 @@ forwards any input read from stdin to the empty pane given by .Op Fl y Ar position .Op Ar shell-command .Xc -.D1 (alias: Ic popup ) +.D1 Pq alias: Ic popup Display a popup running .Ar shell-command on @@ -5900,7 +5900,7 @@ flag closes any popup on the client. .It Xo Ic show-prompt-history .Op Fl T Ar prompt-type .Xc -.D1 (alias: Ic showphist ) +.D1 Pq alias: Ic showphist Display status prompt history for prompt type .Ar prompt-type . If @@ -6028,11 +6028,11 @@ starts without the preview. This command works only if at least one client is attached. .Tg clearhist .It Ic clear-history Op Fl t Ar target-pane -.D1 (alias: Ic clearhist ) +.D1 Pq alias: Ic clearhist Remove and free the history for the specified pane. .Tg deleteb .It Ic delete-buffer Op Fl b Ar buffer-name -.D1 (alias: Ic deleteb ) +.D1 Pq alias: Ic deleteb Delete the buffer named .Ar buffer-name , or the most recently added automatically named buffer if not specified. @@ -6041,7 +6041,7 @@ or the most recently added automatically named buffer if not specified. .Op Fl F Ar format .Op Fl f Ar filter .Xc -.D1 (alias: Ic lsb ) +.D1 Pq alias: Ic lsb List the global buffers. .Fl F specifies the format of each line and @@ -6058,7 +6058,7 @@ section. .Ar path .Xc .Tg loadb -.D1 (alias: Ic loadb ) +.D1 Pq alias: Ic loadb Load the contents of the specified paste buffer from .Ar path . If @@ -6075,7 +6075,7 @@ escape sequence, if possible. .Op Fl s Ar separator .Op Fl t Ar target-pane .Xc -.D1 (alias: Ic pasteb ) +.D1 Pq alias: Ic pasteb Insert the contents of a paste buffer into the specified pane. If not specified, paste into the current one. With @@ -6099,7 +6099,7 @@ buffer if the application has requested bracketed paste mode. .Op Fl b Ar buffer-name .Ar path .Xc -.D1 (alias: Ic saveb ) +.D1 Pq alias: Ic saveb Save the contents of the specified paste buffer to .Ar path . The @@ -6113,7 +6113,7 @@ option appends to rather than overwriting the file. .Op Fl n Ar new-buffer-name .Ar data .Xc -.D1 (alias: Ic setb ) +.D1 Pq alias: Ic setb Set the contents of the specified buffer to .Ar data . If @@ -6134,7 +6134,7 @@ option renames the buffer to .It Xo Ic show-buffer .Op Fl b Ar buffer-name .Xc -.D1 (alias: Ic showb ) +.D1 Pq alias: Ic showb Display the contents of the specified buffer. .El .Sh MISCELLANEOUS @@ -6149,7 +6149,7 @@ Display a large clock. .Ar shell-command command .Op Ar command .Xc -.D1 (alias: Ic if ) +.D1 Pq alias: Ic if Execute the first .Ar command if @@ -6176,7 +6176,7 @@ is not executed but considered success if neither empty nor zero (after formats are expanded). .Tg lock .It Ic lock-server -.D1 (alias: Ic lock ) +.D1 Pq alias: Ic lock Lock each client individually by running the command specified by the .Ic lock-command option. @@ -6187,7 +6187,7 @@ option. .Op Fl t Ar target-pane .Op Ar shell-command .Xc -.D1 (alias: Ic run ) +.D1 Pq alias: Ic run Execute .Ar shell-command or (with @@ -6219,7 +6219,7 @@ If the command fails, the exit status is also displayed. .Op Fl L | S | U .Ar channel .Xc -.D1 (alias: Ic wait ) +.D1 Pq alias: Ic wait When used without options, prevents the client from exiting until woken using .Ic wait-for .Fl S From 630c592ef8740a935ba6c12c957a359c94414219 Mon Sep 17 00:00:00 2001 From: nicm Date: Thu, 11 Nov 2021 09:22:33 +0000 Subject: [PATCH 02/11] If trimming menu item text, show key if it would take up less than a quarter of the space; from Alexis Hildebrandt. Also new sentence, new line in tmux.1, from jmc. --- menu.c | 26 +++++++++++++++----------- tmux.1 | 3 ++- 2 files changed, 17 insertions(+), 12 deletions(-) diff --git a/menu.c b/menu.c index 45645147..aaa1287e 100644 --- a/menu.c +++ b/menu.c @@ -89,22 +89,26 @@ menu_add_item(struct menu *menu, const struct menu_item *item, keylen = strlen(key) + 3; /* 3 = space and two brackets */ /* - * Only add the key if there is space for the entire item text - * and the key. + * Add the key if it is shorter than a quarter of the available + * space or there is space for the entire item text and the + * key. */ - if (keylen >= max_width || slen >= max_width - keylen) + if (keylen <= max_width / 4) + max_width -= keylen; + else if (keylen >= max_width || slen >= max_width - keylen) key = NULL; } - if (key != NULL) - xasprintf(&name, "%s#[default] #[align=right](%s)", s, key); - else { - if (slen > max_width) { - max_width--; - suffix = ">"; - } - xasprintf(&name, "%.*s%s", (int)max_width, s, suffix); + if (slen > max_width) { + max_width--; + suffix = ">"; } + if (key != NULL) + xasprintf(&name, "%.*s%s#[default] #[align=right](%s)", + (int)max_width, s, suffix, key); + else + xasprintf(&name, "%.*s%s", (int)max_width, s, suffix); + new_item->name = name; free(s); diff --git a/tmux.1 b/tmux.1 index 20723308..7d5c7357 100644 --- a/tmux.1 +++ b/tmux.1 @@ -4427,7 +4427,8 @@ uses when the colour with that index is requested. The index may be from zero to 255. .Pp .It Ic cursor-style Ar style -Set the style of the cursor. Available styles are: +Set the style of the cursor. +Available styles are: .Ic default , .Ic blinking-block , .Ic block , From cb8a0d83fbaa2ae49c06105cb94d247ef20ed91e Mon Sep 17 00:00:00 2001 From: nicm Date: Thu, 11 Nov 2021 09:31:16 +0000 Subject: [PATCH 03/11] If automatic-rename is off, allow the escape sequence to set an empty window name, GitHub issue 2964. --- input.c | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/input.c b/input.c index 3626c4b2..73a58890 100644 --- a/input.c +++ b/input.c @@ -2382,6 +2382,7 @@ static void input_exit_rename(struct input_ctx *ictx) { struct window_pane *wp = ictx->wp; + struct window *w; struct options_entry *o; if (wp == NULL) @@ -2394,17 +2395,20 @@ input_exit_rename(struct input_ctx *ictx) if (!utf8_isvalid(ictx->input_buf)) return; + w = wp->window; if (ictx->input_len == 0) { - o = options_get_only(wp->window->options, "automatic-rename"); + o = options_get_only(w->options, "automatic-rename"); if (o != NULL) options_remove_or_default(o, -1, NULL); - return; + if (!options_get_number(w->options, "automatic-rename")) + window_set_name(w, ""); + } else { + options_set_number(w->options, "automatic-rename", 0); + window_set_name(w, ictx->input_buf); } - window_set_name(wp->window, ictx->input_buf); - options_set_number(wp->window->options, "automatic-rename", 0); - server_redraw_window_borders(wp->window); - server_status_window(wp->window); + server_redraw_window_borders(w); + server_status_window(w); } /* Open UTF-8 character. */ From b55f0ac6b94449b3372f0d1737fcf967f4fa13a2 Mon Sep 17 00:00:00 2001 From: nicm Date: Mon, 15 Nov 2021 10:58:13 +0000 Subject: [PATCH 04/11] Leave the hardware cursor at the position of the selected line in choose modes and current editing position and at the command prompt. It is invisible but this is helpful for people using screen readers. GitHub issue 2970. --- mode-tree.c | 8 ++++---- server-client.c | 17 +++++++++++++++-- status.c | 1 + tmux.h | 1 + 4 files changed, 21 insertions(+), 6 deletions(-) diff --git a/mode-tree.c b/mode-tree.c index 85027caf..21a73ef2 100644 --- a/mode-tree.c +++ b/mode-tree.c @@ -736,10 +736,8 @@ mode_tree_draw(struct mode_tree_data *mtd) } sy = screen_size_y(s); - if (!mtd->preview || sy <= 4 || h <= 4 || sy - h <= 4 || w <= 4) { - screen_write_stop(&ctx); - return; - } + if (!mtd->preview || sy <= 4 || h <= 4 || sy - h <= 4 || w <= 4) + goto done; line = &mtd->line_list[mtd->current]; mti = line->item; @@ -783,6 +781,8 @@ mode_tree_draw(struct mode_tree_data *mtd) mtd->drawcb(mtd->modedata, mti->itemdata, &ctx, box_x, box_y); } +done: + screen_write_cursormove(&ctx, 0, mtd->current - mtd->offset, 0); screen_write_stop(&ctx); } diff --git a/server-client.c b/server-client.c index 7cea32c0..072c5589 100644 --- a/server-client.c +++ b/server-client.c @@ -1706,7 +1706,7 @@ server_client_reset_state(struct client *c) struct window_pane *wp = server_client_get_pane(c), *loop; struct screen *s = NULL; struct options *oo = c->session->options; - int mode = 0, cursor, flags; + int mode = 0, cursor, flags, n; u_int cx = 0, cy = 0, ox, oy, sx, sy; if (c->flags & (CLIENT_CONTROL|CLIENT_SUSPENDED)) @@ -1734,7 +1734,20 @@ server_client_reset_state(struct client *c) tty_margin_off(tty); /* Move cursor to pane cursor and offset. */ - if (c->overlay_draw == NULL) { + if (c->prompt_string != NULL) { + n = options_get_number(c->session->options, "status-position"); + if (n == 0) + cy = 0; + else { + n = status_line_size(c); + if (n == 0) + cy = tty->sy - 1; + else + cy = tty->sy - n; + } + cx = c->prompt_cursor; + mode &= ~MODE_CURSOR; + } else if (c->overlay_draw == NULL) { cursor = 0; tty_window_offset(tty, &ox, &oy, &sx, &sy); if (wp->xoff + s->cx >= ox && wp->xoff + s->cx <= ox + sx && diff --git a/status.c b/status.c index d499eab8..bb57b3d6 100644 --- a/status.c +++ b/status.c @@ -748,6 +748,7 @@ status_prompt_redraw(struct client *c) offset = 0; if (pwidth > left) pwidth = left; + c->prompt_cursor = start + c->prompt_index - offset; width = 0; for (i = 0; c->prompt_buffer[i].size != 0; i++) { diff --git a/tmux.h b/tmux.h index 07e649f2..dfea1583 100644 --- a/tmux.h +++ b/tmux.h @@ -1758,6 +1758,7 @@ struct client { #define PROMPT_KEY 0x10 int prompt_flags; enum prompt_type prompt_type; + int prompt_cursor; struct session *session; struct session *last_session; From add03dfb8dd4f2871b2cbc487ff5af95a63f48f4 Mon Sep 17 00:00:00 2001 From: nicm Date: Mon, 29 Nov 2021 11:01:51 +0000 Subject: [PATCH 05/11] Fix user option lookup ordering. --- window-customize.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/window-customize.c b/window-customize.c index 0f09eba8..98387e50 100644 --- a/window-customize.c +++ b/window-customize.c @@ -398,11 +398,11 @@ window_customize_build_options(struct window_customize_modedata *data, for (i = 0; i < size; i++) { if (oo2 != NULL) - o = options_get(oo0, list[i]); + o = options_get(oo2, list[i]); if (o == NULL && oo1 != NULL) o = options_get(oo1, list[i]); if (o == NULL) - o = options_get(oo2, list[i]); + o = options_get(oo0, list[i]); if (options_owner(o) == oo2) scope = scope2; else if (options_owner(o) == oo1) From 333cf6429ae16da6fb3892978ea450bc62c3e873 Mon Sep 17 00:00:00 2001 From: nicm Date: Mon, 29 Nov 2021 11:05:28 +0000 Subject: [PATCH 06/11] Bump response timer to three seconds, GitHub issue 2984. --- tty.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tty.c b/tty.c index 70470a08..233d52a8 100644 --- a/tty.c +++ b/tty.c @@ -302,7 +302,7 @@ tty_start_tty(struct tty *tty) { struct client *c = tty->client; struct termios tio; - struct timeval tv = { .tv_sec = 1 }; + struct timeval tv = { .tv_sec = 3 }; setblocking(c->fd, 0); event_add(&tty->event_in, NULL); From 8fccbbb02673bed71676412f1a313093a39c48ff Mon Sep 17 00:00:00 2001 From: nicm Date: Mon, 6 Dec 2021 10:08:42 +0000 Subject: [PATCH 07/11] Do not dereference NULL window when resizing client, GitHub issue 2982. --- resize.c | 2 ++ tty.c | 4 +++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/resize.c b/resize.c index 8416ad6a..175dd740 100644 --- a/resize.c +++ b/resize.c @@ -348,6 +348,8 @@ recalculate_size_skip_client(struct client *loop, __unused int type, * is not the current window - this is used for aggressive-resize. * Otherwise skip any session that doesn't contain the window. */ + if (loop->session->curw == NULL) + return (1); if (current) return (loop->session->curw->window != w); return (session_has(loop->session, w) == 0); diff --git a/tty.c b/tty.c index 233d52a8..a9678eaf 100644 --- a/tty.c +++ b/tty.c @@ -937,7 +937,9 @@ tty_update_window_offset(struct window *w) struct client *c; TAILQ_FOREACH(c, &clients, entry) { - if (c->session != NULL && c->session->curw->window == w) + if (c->session != NULL && + c->session->curw != NULL && + c->session->curw->window == w) tty_update_client_offset(c); } } From ecac73f66445311c58a28afc7d3f92c964eaae67 Mon Sep 17 00:00:00 2001 From: nicm Date: Mon, 6 Dec 2021 10:10:52 +0000 Subject: [PATCH 08/11] Fix g/G keys to be in line with copy mode. --- mode-tree.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mode-tree.c b/mode-tree.c index 21a73ef2..1eb496fe 100644 --- a/mode-tree.c +++ b/mode-tree.c @@ -1055,7 +1055,6 @@ mode_tree_key(struct mode_tree_data *mtd, struct client *c, key_code *key, case '\016': /* C-n */ mode_tree_down(mtd, 1); break; - case 'g': case KEYC_PPAGE: case '\002': /* C-b */ for (i = 0; i < mtd->height; i++) { @@ -1064,7 +1063,6 @@ mode_tree_key(struct mode_tree_data *mtd, struct client *c, key_code *key, mode_tree_up(mtd, 1); } break; - case 'G': case KEYC_NPAGE: case '\006': /* C-f */ for (i = 0; i < mtd->height; i++) { @@ -1073,10 +1071,12 @@ mode_tree_key(struct mode_tree_data *mtd, struct client *c, key_code *key, mode_tree_down(mtd, 1); } break; + case 'g': case KEYC_HOME: mtd->current = 0; mtd->offset = 0; break; + case 'G': case KEYC_END: mtd->current = mtd->line_size - 1; if (mtd->current > mtd->height - 1) From 71c3234dc78f6f59a66757a6e272e77823a820b3 Mon Sep 17 00:00:00 2001 From: deraadt Date: Tue, 7 Dec 2021 00:38:42 +0000 Subject: [PATCH 09/11] Use PATH_MAX (the standard name) rather than MAXPATHLEN (from BSD sys/param.h) --- procname.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/procname.c b/procname.c index 45e508ef..ac56bb48 100644 --- a/procname.c +++ b/procname.c @@ -138,7 +138,7 @@ char * get_proc_cwd(int fd) { int name[] = { CTL_KERN, KERN_PROC_CWD, 0 }; - static char path[MAXPATHLEN]; + static char path[PATH_MAX]; size_t pathlen = sizeof path; if ((name[2] = tcgetpgrp(fd)) == -1) From 7532a5cf9574f8c5e102383329477e934992d2ea Mon Sep 17 00:00:00 2001 From: deraadt Date: Tue, 7 Dec 2021 00:40:03 +0000 Subject: [PATCH 10/11] sys/signal.h (or some master include) must happen before sys/proc.h, which is not standalone. This problem is being hidden by a sys/param.h which cannot be deleted yet. --- procname.c | 1 + 1 file changed, 1 insertion(+) diff --git a/procname.c b/procname.c index ac56bb48..b2cba1c2 100644 --- a/procname.c +++ b/procname.c @@ -18,6 +18,7 @@ #include /* MAXCOMLEN */ #include +#include #include #include #include From d721fb2a9fd70c157abb8540d4c50fca654f9f4d Mon Sep 17 00:00:00 2001 From: nicm Date: Tue, 7 Dec 2021 07:28:44 +0000 Subject: [PATCH 11/11] Respond to OSC 4 query. --- input.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/input.c b/input.c index 73a58890..16f31ad7 100644 --- a/input.c +++ b/input.c @@ -2505,7 +2505,8 @@ input_osc_colour_reply(struct input_ctx *ictx, u_int n, int c) end = "\007"; else end = "\033\\"; - input_reply(ictx, "\033]%u;rgb:%02hhx/%02hhx/%02hhx%s", n, r, g, b, end); + input_reply(ictx, "\033]%u;rgb:%02hhx%02hhx/%02hhx%02hhx/%02hhx%02hhx%s", + n, r, r, g, g, b, b, end); } /* Handle the OSC 4 sequence for setting (multiple) palette entries. */ @@ -2529,6 +2530,12 @@ input_osc_4(struct input_ctx *ictx, const char *p) } s = strsep(&next, ";"); + if (strcmp(s, "?") == 0) { + c = colour_palette_get(ictx->palette, idx); + if (c != -1) + input_osc_colour_reply(ictx, 4, c); + continue; + } if ((c = input_osc_parse_colour(s)) == -1) { s = next; continue;