mirror of
				https://github.com/tmux/tmux.git
				synced 2025-11-04 09:26:05 +00:00 
			
		
		
		
	Add -C -N -T flags to find-window to find in content, name, title. From
Jonathan Daugherty.
This commit is contained in:
		@@ -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
									
									
									
									
									
								
							
							
						
						
									
										14
									
								
								tmux.1
									
									
									
									
									
								
							@@ -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
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user