From 65748fb197fc29485aa76d1415d2077269d6015f Mon Sep 17 00:00:00 2001 From: Tiago Cunha Date: Thu, 29 Mar 2012 21:07:28 +0000 Subject: [PATCH] Sync OpenBSD patchset 1075: Add -C -N -T flags to find-window to find in content, name, title. From Jonathan Daugherty. --- cmd-find-window.c | 58 ++++++++++++++++++++++++++++++++++++++++++----- tmux.1 | 14 ++++++++++-- 2 files changed, 64 insertions(+), 8 deletions(-) diff --git a/cmd-find-window.c b/cmd-find-window.c index d45298e8..de43a704 100644 --- a/cmd-find-window.c +++ b/cmd-find-window.c @@ -29,13 +29,25 @@ int cmd_find_window_exec(struct cmd *, struct cmd_ctx *); +u_int cmd_find_window_match_flags(struct args *); void cmd_find_window_callback(void *, int); void cmd_find_window_free(void *); +/* Flags for determining matching behavior. */ +#define CMD_FIND_WINDOW_BY_TITLE 0x1 +#define CMD_FIND_WINDOW_BY_CONTENT 0x2 +#define CMD_FIND_WINDOW_BY_NAME 0x4 + +#define CMD_FIND_WINDOW_ALL \ + (CMD_FIND_WINDOW_BY_TITLE | \ + CMD_FIND_WINDOW_BY_CONTENT | \ + CMD_FIND_WINDOW_BY_NAME) + + const struct cmd_entry cmd_find_window_entry = { "find-window", "findw", - "t:", 1, 1, - CMD_TARGET_WINDOW_USAGE " match-string", + "CNt:T", 1, 4, + "[-CNT] " CMD_TARGET_WINDOW_USAGE " match-string", 0, NULL, NULL, @@ -46,6 +58,26 @@ struct cmd_find_window_data { struct session *session; }; +u_int +cmd_find_window_match_flags(struct args *args) +{ + u_int match_flags = 0; + + /* Turn on flags based on the options. */ + if (args_has(args, 'T')) + match_flags |= CMD_FIND_WINDOW_BY_TITLE; + if (args_has(args, 'C')) + match_flags |= CMD_FIND_WINDOW_BY_CONTENT; + if (args_has(args, 'N')) + match_flags |= CMD_FIND_WINDOW_BY_NAME; + + /* If none of the flags were set, default to matching anything. */ + if (match_flags == 0) + match_flags = CMD_FIND_WINDOW_ALL; + + return match_flags; +} + int cmd_find_window_exec(struct cmd *self, struct cmd_ctx *ctx) { @@ -58,7 +90,7 @@ cmd_find_window_exec(struct cmd *self, struct cmd_ctx *ctx) ARRAY_DECL(, u_int) list_idx; ARRAY_DECL(, char *) list_ctx; char *str, *sres, *sctx, *searchstr; - u_int i, line; + u_int i, line, match_flags; if (ctx->curclient == NULL) { ctx->error(ctx, "must be run interactively"); @@ -69,6 +101,7 @@ cmd_find_window_exec(struct cmd *self, struct cmd_ctx *ctx) if ((wl = cmd_find_window(ctx, args_get(args, 't'), NULL)) == NULL) return (-1); + match_flags = cmd_find_window_match_flags(args); str = args->argv[0]; ARRAY_INIT(&list_idx); @@ -80,12 +113,25 @@ cmd_find_window_exec(struct cmd *self, struct cmd_ctx *ctx) TAILQ_FOREACH(wp, &wm->window->panes, entry) { i++; - if (fnmatch(searchstr, wm->window->name, 0) == 0) + if ((match_flags & CMD_FIND_WINDOW_BY_NAME) && + fnmatch(searchstr, wm->window->name, 0) == 0) sctx = xstrdup(""); else { - sres = window_pane_search(wp, str, &line); + sres = NULL; + if (match_flags & CMD_FIND_WINDOW_BY_CONTENT) { + sres = window_pane_search( + wp, str, &line); + } + + /* + * If match_title isn't set we don't want to + * bother checking the title, but that also + * constitutes a failure to match so we still + * want to abort. + */ if (sres == NULL && - fnmatch(searchstr, wp->base.title, 0) != 0) + (!(match_flags & CMD_FIND_WINDOW_BY_TITLE) || + fnmatch(searchstr, wp->base.title, 0) != 0)) continue; if (sres == NULL) { diff --git a/tmux.1 b/tmux.1 index 6936d613..1c60d9a2 100644 --- a/tmux.1 +++ b/tmux.1 @@ -1103,6 +1103,7 @@ to .Ql 9 keys. .It Xo Ic find-window +.Op Fl CNT .Op Fl t Ar target-window .Ar match-string .Xc @@ -1112,8 +1113,17 @@ Search for the pattern .Ar match-string in window names, titles, and visible content (but not history). -If only one window is matched, it'll be automatically selected, otherwise a -choice list is shown. +The flags control matching behavior: +.Fl C +matches only visible window contents, +.Fl N +matches only the window name and +.Fl T +matches only the window title. +The default is +.Fl CNT . +If only one window is matched, it'll be automatically selected, +otherwise a choice list is shown. This command only works from inside .Nm . .It Xo Ic join-pane