From c9616700ca94a06e85dd21dd40687ed61934b8fa Mon Sep 17 00:00:00 2001 From: nicm Date: Tue, 14 May 2024 07:52:19 +0000 Subject: [PATCH 1/2] Add a command-error hook when a command fails, from Hugh Davenport in GitHub issue 3973. --- cmd-queue.c | 13 +++++++++++-- options-table.c | 1 + tmux.1 | 10 ++++++++++ 3 files changed, 22 insertions(+), 2 deletions(-) diff --git a/cmd-queue.c b/cmd-queue.c index 5ee0644c..ee1037c4 100644 --- a/cmd-queue.c +++ b/cmd-queue.c @@ -665,9 +665,18 @@ cmdq_fire_command(struct cmdq_item *item) out: item->client = saved; - if (retval == CMD_RETURN_ERROR) + if (retval == CMD_RETURN_ERROR) { + fsp = NULL; + if (cmd_find_valid_state(&item->target)) + fsp = &item->target; + else if (cmd_find_valid_state(&item->state->current)) + fsp = &item->state->current; + else if (cmd_find_from_client(&fs, item->client, 0) == 0) + fsp = &fs; + cmdq_insert_hook(fsp != NULL ? fsp->s : NULL, item, fsp, + "command-error"); cmdq_guard(item, "error", flags); - else + } else cmdq_guard(item, "end", flags); return (retval); } diff --git a/options-table.c b/options-table.c index 939bcb69..274cdb12 100644 --- a/options-table.c +++ b/options-table.c @@ -1334,6 +1334,7 @@ const struct options_table_entry options_table[] = { OPTIONS_TABLE_HOOK("client-focus-out", ""), OPTIONS_TABLE_HOOK("client-resized", ""), OPTIONS_TABLE_HOOK("client-session-changed", ""), + OPTIONS_TABLE_HOOK("command-error", ""), OPTIONS_TABLE_PANE_HOOK("pane-died", ""), OPTIONS_TABLE_PANE_HOOK("pane-exited", ""), OPTIONS_TABLE_PANE_HOOK("pane-focus-in", ""), diff --git a/tmux.1 b/tmux.1 index 08aa26c7..afc3c7d9 100644 --- a/tmux.1 +++ b/tmux.1 @@ -4889,6 +4889,14 @@ layout after every set-hook -g after-split-window "selectl even-vertical" .Ed .Pp +If a command fails, the +.Ql command-error +hook will be fired. +For example, this could be used to write to a log file: +.Bd -literal -offset indent +set-hook -g command-error "run-shell \\"echo 'a tmux command failed' >>/tmp/log\\"" +.Ed +.Pp All the notifications listed in the .Sx CONTROL MODE section are hooks (without any arguments), except @@ -4921,6 +4929,8 @@ Run when focus exits a client Run when a client is resized. .It client-session-changed Run when a client's attached session is changed. +.It command-error +Run when a command fails. .It pane-died Run when the program running in a pane exits, but .Ic remain-on-exit From 5b5004e5ac95b858ef2e134c9e056dd05a38d430 Mon Sep 17 00:00:00 2001 From: nicm Date: Tue, 14 May 2024 09:32:37 +0000 Subject: [PATCH 2/2] Revert part of the change for GitHub issue 3675 because it does not work correctly, it was intended to skip lines that are already being searched as part of a previous wrapped line but in fact is skipping all lines except the last in wrapped lines. Also revert the search-wrapped-lines option (I didn't realize it was intended to work around this). --- options-table.c | 8 -------- tmux.1 | 8 -------- window-copy.c | 21 ++++----------------- 3 files changed, 4 insertions(+), 33 deletions(-) diff --git a/options-table.c b/options-table.c index 274cdb12..20bfb5c7 100644 --- a/options-table.c +++ b/options-table.c @@ -384,14 +384,6 @@ const struct options_table_entry options_table[] = { .text = "Maximum number of commands to keep in history." }, - { .name = "search-wrapped-lines", - .type = OPTIONS_TABLE_FLAG, - .scope = OPTIONS_TABLE_SERVER, - .default_num = 1, - .text = "Whether to include full wrapped lines when searching for " - "text in copy mode." - }, - { .name = "set-clipboard", .type = OPTIONS_TABLE_CHOICE, .scope = OPTIONS_TABLE_SERVER, diff --git a/tmux.1 b/tmux.1 index afc3c7d9..fc4f3616 100644 --- a/tmux.1 +++ b/tmux.1 @@ -3795,14 +3795,6 @@ each client. .It Ic prompt-history-limit Ar number Set the number of history items to save in the history file for each type of command prompt. -.It Xo Ic search-wrapped-lines -.Op Ic on | off -.Xc -Defines how -.Nm -handles wrapped lines when searching in copy mode. -When disabled, lines are truncated and searching is faster, but matches may be -missed. .It Xo Ic set-clipboard .Op Ic on | external | off .Xc diff --git a/window-copy.c b/window-copy.c index 9db17c3d..de124812 100644 --- a/window-copy.c +++ b/window-copy.c @@ -3614,13 +3614,10 @@ window_copy_search_jump(struct window_mode_entry *wme, struct grid *gd, struct grid *sgd, u_int fx, u_int fy, u_int endline, int cis, int wrap, int direction, int regex) { - u_int i, px, sx, ssize = 1; - int wrapped, found = 0, cflags = REG_EXTENDED; - char *sbuf; - regex_t reg; - struct grid_line *gl; - - wrapped = options_get_number(global_options, "search-wrapped-lines"); + u_int i, px, sx, ssize = 1; + int found = 0, cflags = REG_EXTENDED; + char *sbuf; + regex_t reg; if (regex) { sbuf = xmalloc(ssize); @@ -3637,11 +3634,6 @@ window_copy_search_jump(struct window_mode_entry *wme, struct grid *gd, if (direction) { for (i = fy; i <= endline; i++) { - gl = grid_get_line(gd, i); - if (!wrapped && - i != endline && - gl->flags & GRID_LINE_WRAPPED) - continue; if (regex) { found = window_copy_search_lr_regex(gd, &px, &sx, i, fx, gd->sx, ®); @@ -3655,11 +3647,6 @@ window_copy_search_jump(struct window_mode_entry *wme, struct grid *gd, } } else { for (i = fy + 1; endline < i; i--) { - gl = grid_get_line(gd, i - 1); - if (!wrapped && - i != endline && - gl->flags & GRID_LINE_WRAPPED) - continue; if (regex) { found = window_copy_search_rl_regex(gd, &px, &sx, i - 1, 0, fx + 1, ®);