aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--format.c3
-rw-r--r--status.c30
2 files changed, 21 insertions, 12 deletions
diff --git a/format.c b/format.c
index 5f57c72e..1143ced3 100644
--- a/format.c
+++ b/format.c
@@ -251,10 +251,11 @@ format_expand(struct format_tree *ft, const char *fmt)
continue;
}
}
- while (len - off < 2) {
+ while (len - off < 3) {
buf = xrealloc(buf, 2, len);
len *= 2;
}
+ buf[off++] = '#';
buf[off++] = ch;
continue;
}
diff --git a/status.c b/status.c
index 88ab68d1..fa1d44e6 100644
--- a/status.c
+++ b/status.c
@@ -393,13 +393,6 @@ status_replace1(struct client *c, struct session *s, struct winlink *wl,
long limit;
u_int idx;
- if (s == NULL)
- s = c->session;
- if (wl == NULL)
- wl = s->curw;
- if (wp == NULL)
- wp = wl->window->active;
-
errno = 0;
limit = strtol(*iptr, &endptr, 10);
if ((limit == 0 && errno != EINVAL) ||
@@ -468,6 +461,9 @@ status_replace1(struct client *c, struct session *s, struct winlink *wl,
*/
ch = ']';
goto skip_to;
+ case '{':
+ ptr = (char *) "#{";
+ goto do_replace;
case '#':
*(*optr)++ = '#';
break;
@@ -507,13 +503,21 @@ char *
status_replace(struct client *c, struct session *s, struct winlink *wl,
struct window_pane *wp, const char *fmt, time_t t, int jobsflag)
{
- static char out[BUFSIZ];
- char in[BUFSIZ], ch, *iptr, *optr;
- size_t len;
+ static char out[BUFSIZ];
+ char in[BUFSIZ], ch, *iptr, *optr;
+ size_t len;
+ struct format_tree *ft;
if (fmt == NULL)
return (xstrdup(""));
+ if (s == NULL)
+ s = c->session;
+ if (wl == NULL)
+ wl = s->curw;
+ if (wp == NULL)
+ wp = wl->window->active;
+
len = strftime(in, sizeof in, fmt, localtime(&t));
in[len] = '\0';
@@ -534,7 +538,11 @@ status_replace(struct client *c, struct session *s, struct winlink *wl,
}
*optr = '\0';
- return (xstrdup(out));
+ ft = format_create();
+ format_session(ft, s);
+ format_winlink(ft, s, wl);
+ format_window_pane(ft, wp);
+ return (format_expand(ft, out));
}
/* Figure out job name and get its result, starting it off if necessary. */