mirror of
https://github.com/tmate-io/tmate.git
synced 2024-12-25 08:09:24 +01:00
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:
parent
37e5b5d947
commit
65748fb197
@ -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
@ -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
|
||||||
|
Loading…
Reference in New Issue
Block a user