summaryrefslogtreecommitdiff
path: root/usr.bin
diff options
context:
space:
mode:
authorNicholas Marriott <nicm@cvs.openbsd.org>2024-05-14 07:52:20 +0000
committerNicholas Marriott <nicm@cvs.openbsd.org>2024-05-14 07:52:20 +0000
commit76e00421546e7134decfe58cbea1bffb4eb5ec85 (patch)
tree3ababa80b2f9e0574ad5b8e6452fadd098170bd6 /usr.bin
parent5ff937acfbc8e5a80bad4c24d23855f483656efd (diff)
Add a command-error hook when a command fails, from Hugh Davenport in
GitHub issue 3973.
Diffstat (limited to 'usr.bin')
-rw-r--r--usr.bin/tmux/cmd-queue.c15
-rw-r--r--usr.bin/tmux/options-table.c3
-rw-r--r--usr.bin/tmux/tmux.112
3 files changed, 25 insertions, 5 deletions
diff --git a/usr.bin/tmux/cmd-queue.c b/usr.bin/tmux/cmd-queue.c
index 623535a1208..81ed3de30a8 100644
--- a/usr.bin/tmux/cmd-queue.c
+++ b/usr.bin/tmux/cmd-queue.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: cmd-queue.c,v 1.116 2024/04/23 13:34:51 jsg Exp $ */
+/* $OpenBSD: cmd-queue.c,v 1.117 2024/05/14 07:52:19 nicm Exp $ */
/*
* Copyright (c) 2013 Nicholas Marriott <nicholas.marriott@gmail.com>
@@ -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/usr.bin/tmux/options-table.c b/usr.bin/tmux/options-table.c
index 998e2764ff8..98c226d26af 100644
--- a/usr.bin/tmux/options-table.c
+++ b/usr.bin/tmux/options-table.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: options-table.c,v 1.172 2024/05/14 07:40:39 nicm Exp $ */
+/* $OpenBSD: options-table.c,v 1.173 2024/05/14 07:52:19 nicm Exp $ */
/*
* Copyright (c) 2011 Nicholas Marriott <nicholas.marriott@gmail.com>
@@ -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/usr.bin/tmux/tmux.1 b/usr.bin/tmux/tmux.1
index d29565f39e6..3bd92c46852 100644
--- a/usr.bin/tmux/tmux.1
+++ b/usr.bin/tmux/tmux.1
@@ -1,4 +1,4 @@
-.\" $OpenBSD: tmux.1,v 1.942 2024/05/14 07:40:39 nicm Exp $
+.\" $OpenBSD: tmux.1,v 1.943 2024/05/14 07:52:19 nicm Exp $
.\"
.\" Copyright (c) 2007 Nicholas Marriott <nicholas.marriott@gmail.com>
.\"
@@ -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