Add a command-error hook when a command fails, from Hugh Davenport in

GitHub issue 3973.
This commit is contained in:
nicm 2024-05-14 07:52:19 +00:00
parent 4c928dce74
commit c9616700ca
3 changed files with 22 additions and 2 deletions

View File

@ -665,9 +665,18 @@ cmdq_fire_command(struct cmdq_item *item)
out: out:
item->client = saved; 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); cmdq_guard(item, "error", flags);
else } else
cmdq_guard(item, "end", flags); cmdq_guard(item, "end", flags);
return (retval); return (retval);
} }

View File

@ -1334,6 +1334,7 @@ const struct options_table_entry options_table[] = {
OPTIONS_TABLE_HOOK("client-focus-out", ""), OPTIONS_TABLE_HOOK("client-focus-out", ""),
OPTIONS_TABLE_HOOK("client-resized", ""), OPTIONS_TABLE_HOOK("client-resized", ""),
OPTIONS_TABLE_HOOK("client-session-changed", ""), OPTIONS_TABLE_HOOK("client-session-changed", ""),
OPTIONS_TABLE_HOOK("command-error", ""),
OPTIONS_TABLE_PANE_HOOK("pane-died", ""), OPTIONS_TABLE_PANE_HOOK("pane-died", ""),
OPTIONS_TABLE_PANE_HOOK("pane-exited", ""), OPTIONS_TABLE_PANE_HOOK("pane-exited", ""),
OPTIONS_TABLE_PANE_HOOK("pane-focus-in", ""), OPTIONS_TABLE_PANE_HOOK("pane-focus-in", ""),

10
tmux.1
View File

@ -4889,6 +4889,14 @@ layout after every
set-hook -g after-split-window "selectl even-vertical" set-hook -g after-split-window "selectl even-vertical"
.Ed .Ed
.Pp .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 All the notifications listed in the
.Sx CONTROL MODE .Sx CONTROL MODE
section are hooks (without any arguments), except section are hooks (without any arguments), except
@ -4921,6 +4929,8 @@ Run when focus exits a client
Run when a client is resized. Run when a client is resized.
.It client-session-changed .It client-session-changed
Run when a client's attached session is changed. Run when a client's attached session is changed.
.It command-error
Run when a command fails.
.It pane-died .It pane-died
Run when the program running in a pane exits, but Run when the program running in a pane exits, but
.Ic remain-on-exit .Ic remain-on-exit