> But that's four diffs... just -T -N -C would be ok but if you do one
> -T flag I think we should have all three.
Please see the attached patch, which adds -T, -C, and -N options for
find-window and defaults to -TCN as discussed. I've also updated
tmux.1.
--
Jonathan Daugherty
Software Engineer
Galois, Inc.
Index: tmux.1
===================================================================
--- tmux.1 (revision 2749)
+++ tmux.1 (working copy)
@@ -1103,6 +1103,7 @@
.Ql 9
keys.
.It Xo Ic find-window
+.Op Fl TCN
.Op Fl t Ar target-window
.Ar match-string
.Xc
@@ -1112,9 +1113,18 @@
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.
-This command only works from inside
+Specify one or more of
+.Fl TCN
+to control matching behavior:
+.Fl T
+matches only the window title,
+.Fl C
+matches only visible window contents, and
+.Fl N
+matches only the window name. The default is
+.Fl TCN .
+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
.Op Fl bdhv
Index: cmd-find-window.c
===================================================================
--- cmd-find-window.c (revision 2749)
+++ cmd-find-window.c (working copy)
@@ -32,10 +32,21 @@
void cmd_find_window_callback(void *, int);
void cmd_find_window_free(void *);
+/*
+ * Flags for determining matching behavior.
+ */
+#define FIND_BY_TITLE 0x1
+#define FIND_BY_CONTENT 0x2
+#define FIND_BY_NAME 0x4
+
+#define MATCH_NAME(flags) flags & FIND_BY_NAME
+#define MATCH_TITLE(flags) flags & FIND_BY_TITLE
+#define MATCH_CONTENT(flags) flags & FIND_BY_CONTENT
+
const struct cmd_entry cmd_find_window_entry = {
"find-window", "findw",
- "t:", 1, 1,
- CMD_TARGET_WINDOW_USAGE " match-string",
+ "TCNt:", 1, 4,
+ "[-TCN] " CMD_TARGET_WINDOW_USAGE " match-string",
0,
NULL,
NULL,
@@ -46,6 +57,31 @@
struct session *session;
};
+u_int
+match_flags_from_args(struct args *args)
+{
+ u_int match_flags = 0;
+
+ // Turn on flags based on the options.
+ if (args_has(args, 'T'))
+ match_flags |= FIND_BY_TITLE;
+
+ if (args_has(args, 'C'))
+ match_flags |= FIND_BY_CONTENT;
+
+ if (args_has(args, 'N'))
+ match_flags |= FIND_BY_NAME;
+
+ // If none of the flags were set, default to matching
+ // anything.
+ if (!match_flags)
+ match_flags = FIND_BY_TITLE |
+ FIND_BY_CONTENT |
+ FIND_BY_NAME;
+
+ return match_flags;
+}
+
int
cmd_find_window_exec(struct cmd *self, struct cmd_ctx *ctx)
{
@@ -59,6 +95,7 @@
ARRAY_DECL(, char *) list_ctx;
char *str, *sres, *sctx, *searchstr;
u_int i, line;
+ u_int match_flags;
if (ctx->curclient == NULL) {
ctx->error(ctx, "must be run interactively");
@@ -69,6 +106,7 @@
if ((wl = cmd_find_window(ctx, args_get(args, 't'), NULL)) == NULL)
return (-1);
+ match_flags = match_flags_from_args(args);
str = args->argv[0];
ARRAY_INIT(&list_idx);
@@ -80,12 +118,21 @@
TAILQ_FOREACH(wp, &wm->window->panes, entry) {
i++;
- if (fnmatch(searchstr, wm->window->name, 0) == 0)
+ if (MATCH_NAME(match_flags) &&
+ fnmatch(searchstr, wm->window->name, 0) == 0)
sctx = xstrdup("");
else {
- sres = window_pane_search(wp, str, &line);
+ sres = NULL;
+ if (MATCH_CONTENT(match_flags))
+ 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_TITLE(match_flags) ||
+ fnmatch(searchstr, wp->base.title, 0) !=
0))
continue;
if (sres == NULL) {
------------------------------------------------------------------------------
This SF email is sponsosred by:
Try Windows Azure free for 90 days Click Here
http://p.sf.net/sfu/sfd2d-msazure
_______________________________________________
tmux-users mailing list
tmux-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/tmux-users