mirror of
https://github.com/tmux/tmux.git
synced 2025-09-02 05:21:10 +00:00
Add a -S flag to new-window to make it select the existing window if one
with the given name already exists rather than failing with an error. Also add a format to check if a window or session name exists which allows the same with other commands. Requested by and discussed with kn@.
This commit is contained in:
61
format.c
61
format.c
@ -100,6 +100,8 @@ format_job_cmp(struct format_job *fj1, struct format_job *fj2)
|
||||
#define FORMAT_LENGTH 0x800
|
||||
#define FORMAT_WIDTH 0x1000
|
||||
#define FORMAT_QUOTE_STYLE 0x2000
|
||||
#define FORMAT_WINDOW_NAME 0x4000
|
||||
#define FORMAT_SESSION_NAME 0x8000
|
||||
|
||||
/* Limit on recursion. */
|
||||
#define FORMAT_LOOP_LIMIT 10
|
||||
@ -1733,7 +1735,7 @@ format_build_modifiers(struct format_expand_state *es, const char **s,
|
||||
}
|
||||
|
||||
/* Now try single character with arguments. */
|
||||
if (strchr("mCst=peq", cp[0]) == NULL)
|
||||
if (strchr("mCNst=peq", cp[0]) == NULL)
|
||||
break;
|
||||
c = cp[0];
|
||||
|
||||
@ -1857,6 +1859,24 @@ format_search(struct format_modifier *fm, struct window_pane *wp, const char *s)
|
||||
return (value);
|
||||
}
|
||||
|
||||
/* Does session name exist? */
|
||||
static char *
|
||||
format_session_name(struct format_expand_state *es, const char *fmt)
|
||||
{
|
||||
char *name;
|
||||
struct session *s;
|
||||
|
||||
name = format_expand1(es, fmt);
|
||||
RB_FOREACH(s, sessions, &sessions) {
|
||||
if (strcmp(s->name, name) == 0) {
|
||||
free(name);
|
||||
return (xstrdup("1"));
|
||||
}
|
||||
}
|
||||
free(name);
|
||||
return (xstrdup("0"));
|
||||
}
|
||||
|
||||
/* Loop over sessions. */
|
||||
static char *
|
||||
format_loop_sessions(struct format_expand_state *es, const char *fmt)
|
||||
@ -1892,6 +1912,30 @@ format_loop_sessions(struct format_expand_state *es, const char *fmt)
|
||||
return (value);
|
||||
}
|
||||
|
||||
/* Does window name exist? */
|
||||
static char *
|
||||
format_window_name(struct format_expand_state *es, const char *fmt)
|
||||
{
|
||||
struct format_tree *ft = es->ft;
|
||||
char *name;
|
||||
struct winlink *wl;
|
||||
|
||||
if (ft->s == NULL) {
|
||||
format_log(es, "window name but no session");
|
||||
return (NULL);
|
||||
}
|
||||
|
||||
name = format_expand1(es, fmt);
|
||||
RB_FOREACH(wl, winlinks, &ft->s->windows) {
|
||||
if (strcmp(wl->window->name, name) == 0) {
|
||||
free(name);
|
||||
return (xstrdup("1"));
|
||||
}
|
||||
}
|
||||
free(name);
|
||||
return (xstrdup("0"));
|
||||
}
|
||||
|
||||
/* Loop over windows. */
|
||||
static char *
|
||||
format_loop_windows(struct format_expand_state *es, const char *fmt)
|
||||
@ -2251,6 +2295,13 @@ format_replace(struct format_expand_state *es, const char *key, size_t keylen,
|
||||
case 'T':
|
||||
modifiers |= FORMAT_EXPANDTIME;
|
||||
break;
|
||||
case 'N':
|
||||
if (fm->argc < 1 ||
|
||||
strchr(fm->argv[0], 'w') != NULL)
|
||||
modifiers |= FORMAT_WINDOW_NAME;
|
||||
else if (strchr(fm->argv[0], 's') != NULL)
|
||||
modifiers |= FORMAT_SESSION_NAME;
|
||||
break;
|
||||
case 'S':
|
||||
modifiers |= FORMAT_SESSIONS;
|
||||
break;
|
||||
@ -2291,6 +2342,14 @@ format_replace(struct format_expand_state *es, const char *key, size_t keylen,
|
||||
value = format_loop_panes(es, copy);
|
||||
if (value == NULL)
|
||||
goto fail;
|
||||
} else if (modifiers & FORMAT_WINDOW_NAME) {
|
||||
value = format_window_name(es, copy);
|
||||
if (value == NULL)
|
||||
goto fail;
|
||||
} else if (modifiers & FORMAT_SESSION_NAME) {
|
||||
value = format_session_name(es, copy);
|
||||
if (value == NULL)
|
||||
goto fail;
|
||||
} else if (search != NULL) {
|
||||
/* Search in pane. */
|
||||
new = format_expand1(es, copy);
|
||||
|
Reference in New Issue
Block a user