Add -C -N -T flags to find-window to find in content, name, title. From

Jonathan Daugherty.
This commit is contained in:
Nicholas Marriott 2012-03-20 17:09:48 +00:00
parent 5672f2ce6b
commit 90bf560fe4
2 changed files with 64 additions and 8 deletions

View File

@ -29,13 +29,25 @@
int cmd_find_window_exec(struct cmd *, struct cmd_ctx *); 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_callback(void *, int);
void cmd_find_window_free(void *); 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 = { const struct cmd_entry cmd_find_window_entry = {
"find-window", "findw", "find-window", "findw",
"t:", 1, 1, "CNt:T", 1, 4,
CMD_TARGET_WINDOW_USAGE " match-string", "[-CNT] " CMD_TARGET_WINDOW_USAGE " match-string",
0, 0,
NULL, NULL,
NULL, NULL,
@ -46,6 +58,26 @@ struct cmd_find_window_data {
struct session *session; 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 int
cmd_find_window_exec(struct cmd *self, struct cmd_ctx *ctx) 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(, u_int) list_idx;
ARRAY_DECL(, char *) list_ctx; ARRAY_DECL(, char *) list_ctx;
char *str, *sres, *sctx, *searchstr; char *str, *sres, *sctx, *searchstr;
u_int i, line; u_int i, line, match_flags;
if (ctx->curclient == NULL) { if (ctx->curclient == NULL) {
ctx->error(ctx, "must be run interactively"); 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) if ((wl = cmd_find_window(ctx, args_get(args, 't'), NULL)) == NULL)
return (-1); return (-1);
match_flags = cmd_find_window_match_flags(args);
str = args->argv[0]; str = args->argv[0];
ARRAY_INIT(&list_idx); 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) { TAILQ_FOREACH(wp, &wm->window->panes, entry) {
i++; 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(""); sctx = xstrdup("");
else { 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 && 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; continue;
if (sres == NULL) { if (sres == NULL) {

14
tmux.1
View File

@ -1099,6 +1099,7 @@ to
.Ql 9 .Ql 9
keys. keys.
.It Xo Ic find-window .It Xo Ic find-window
.Op Fl CNT
.Op Fl t Ar target-window .Op Fl t Ar target-window
.Ar match-string .Ar match-string
.Xc .Xc
@ -1108,8 +1109,17 @@ Search for the
pattern pattern
.Ar match-string .Ar match-string
in window names, titles, and visible content (but not history). in window names, titles, and visible content (but not history).
If only one window is matched, it'll be automatically selected, otherwise a The flags control matching behavior:
choice list is shown. .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 This command only works from inside
.Nm . .Nm .
.It Xo Ic join-pane .It Xo Ic join-pane