> 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

Reply via email to