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 *);
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) {

14
tmux.1
View File

@ -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