aboutsummaryrefslogtreecommitdiff
path: root/format.c
diff options
context:
space:
mode:
authornicm <nicm>2021-02-05 12:23:49 +0000
committernicm <nicm>2021-02-05 12:23:49 +0000
commitbe471c328ea0ae04026e4ff32fda7b7f11c74255 (patch)
tree55f959803e1c254ce7a467e45706c61c21cc69ec /format.c
parentc13f2e1135df1f8be78262eb6f5ccb251a7e1d61 (diff)
downloadrtmux-be471c328ea0ae04026e4ff32fda7b7f11c74255.tar.gz
rtmux-be471c328ea0ae04026e4ff32fda7b7f11c74255.tar.bz2
rtmux-be471c328ea0ae04026e4ff32fda7b7f11c74255.zip
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@.
Diffstat (limited to 'format.c')
-rw-r--r--format.c61
1 files changed, 60 insertions, 1 deletions
diff --git a/format.c b/format.c
index 25b80249..ecf299d1 100644
--- a/format.c
+++ b/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);