Sync OpenBSD patchset 1075:

Add -C -N -T flags to find-window to find in content, name, title. From
Jonathan Daugherty.
This commit is contained in:
Tiago Cunha 2012-03-29 21:07:28 +00:00
parent 37e5b5d947
commit 65748fb197
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

@ -1103,6 +1103,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
@ -1112,8 +1113,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