Add set-hook -R to run a hook immediately (useful to set multiple hooks

to the same thing).
pull/1395/head
nicm 2018-07-04 12:30:52 +00:00
parent d254293a6d
commit cc743dc296
4 changed files with 42 additions and 12 deletions

View File

@ -33,8 +33,8 @@ const struct cmd_entry cmd_set_hook_entry = {
.name = "set-hook",
.alias = NULL,
.args = { "gt:u", 1, 2 },
.usage = "[-gu] " CMD_TARGET_SESSION_USAGE " hook-name [command]",
.args = { "gRt:u", 1, 2 },
.usage = "[-gRu] " CMD_TARGET_SESSION_USAGE " hook-name [command]",
.target = { 't', CMD_FIND_SESSION, CMD_FIND_CANFAIL },
@ -101,18 +101,21 @@ cmd_set_hook_exec(struct cmd *self, struct cmdq_item *item)
else
cmd = args->argv[1];
if (cmd != NULL && (args_has(args, 'R') || args_has(args, 'u'))) {
cmdq_error(item, "no command allowed");
return (CMD_RETURN_ERROR);
}
if (args_has(args, 'R')) {
notify_hook(item, name);
return (CMD_RETURN_NORMAL);
}
if (args_has(args, 'u')) {
if (cmd != NULL) {
cmdq_error(item, "command passed to unset hook: %s",
name);
return (CMD_RETURN_ERROR);
}
hooks_remove(hooks, name);
return (CMD_RETURN_NORMAL);
}
if (cmd == NULL) {
cmdq_error(item, "no command to set hook: %s", name);
cmdq_error(item, "no command given");
return (CMD_RETURN_ERROR);
}
cmdlist = cmd_string_parse(cmd, NULL, 0, &cause);

View File

@ -36,7 +36,7 @@ struct notify_entry {
};
static void
notify_hook(struct cmdq_item *item, struct notify_entry *ne)
notify_hook1(struct cmdq_item *item, struct notify_entry *ne)
{
struct cmd_find_state fs;
struct hook *hook;
@ -102,7 +102,7 @@ notify_callback(struct cmdq_item *item, void *data)
if (strcmp(ne->name, "session-window-changed") == 0)
control_notify_session_window_changed(ne->session);
notify_hook(item, ne);
notify_hook1(item, ne);
if (ne->client != NULL)
server_client_unref(ne->client);
@ -154,6 +154,24 @@ notify_add(const char *name, struct cmd_find_state *fs, struct client *c,
cmdq_append(NULL, new_item);
}
void
notify_hook(struct cmdq_item *item, const char *name)
{
struct notify_entry ne;
memset(&ne, 0, sizeof ne);
ne.name = name;
cmd_find_copy_state(&ne.fs, &item->target);
ne.client = item->client;
ne.session = item->target.s;
ne.window = item->target.w;
ne.pane = item->target.wp->id;
notify_hook1(item, &ne);
}
void
notify_input(struct window_pane *wp, struct evbuffer *input)
{

12
tmux.1
View File

@ -3452,12 +3452,14 @@ Run when a window is unlinked from a session.
Hooks are managed with these commands:
.Bl -tag -width Ds
.It Xo Ic set-hook
.Op Fl gu
.Op Fl gRu
.Op Fl t Ar target-session
.Ar hook-name
.Ar command
.Xc
Sets (or with
Without
.Fl R,
sets (or with
.Fl u
unsets) hook
.Ar hook-name
@ -3473,6 +3475,12 @@ hooks (for
with
.Fl t ) .
Like options, session hooks inherit from the global ones.
.Pp
With
.Fl R ,
run
.Ar hook-name
immediately.
.It Xo Ic show-hooks
.Op Fl g
.Op Fl t Ar target-session

1
tmux.h
View File

@ -1594,6 +1594,7 @@ void printflike(4, 5) hooks_insert(struct hooks *, struct cmdq_item *,
struct cmd_find_state *, const char *, ...);
/* notify.c */
void notify_hook(struct cmdq_item *, const char *);
void notify_input(struct window_pane *, struct evbuffer *);
void notify_client(const char *, struct client *);
void notify_session(const char *, struct session *);