1
0
mirror of https://github.com/tmux/tmux.git synced 2025-03-29 18:28:47 +00:00

Merge branch 'obsd-master'

This commit is contained in:
Thomas Adam 2019-11-25 16:01:27 +00:00
commit daa93b3fdc
4 changed files with 70 additions and 16 deletions

View File

@ -1315,7 +1315,7 @@ format_build_modifiers(struct format_tree *ft, const char **s, u_int *count)
} }
/* Now try single character with arguments. */ /* Now try single character with arguments. */
if (strchr("mCs=", cp[0]) == NULL) if (strchr("mCs=p", cp[0]) == NULL)
break; break;
c = cp[0]; c = cp[0];
@ -1576,15 +1576,15 @@ static int
format_replace(struct format_tree *ft, const char *key, size_t keylen, format_replace(struct format_tree *ft, const char *key, size_t keylen,
char **buf, size_t *len, size_t *off) char **buf, size_t *len, size_t *off)
{ {
struct window_pane *wp = ft->wp; struct window_pane *wp = ft->wp;
const char *errptr, *copy, *cp, *marker = NULL; const char *errptr, *copy, *cp, *marker = NULL;
char *copy0, *condition, *found, *new; char *copy0, *condition, *found, *new;
char *value, *left, *right; char *value, *left, *right;
size_t valuelen; size_t valuelen;
int modifiers = 0, limit = 0, j; int modifiers = 0, limit = 0, width = 0, j;
struct format_modifier *list, *fm, *cmp = NULL, *search = NULL; struct format_modifier *list, *fm, *cmp = NULL, *search = NULL;
struct format_modifier *sub = NULL; struct format_modifier **sub = NULL;
u_int i, count; u_int i, count, nsub = 0;
/* Make a copy of the key. */ /* Make a copy of the key. */
copy = copy0 = xstrndup(key, keylen); copy = copy0 = xstrndup(key, keylen);
@ -1613,7 +1613,9 @@ format_replace(struct format_tree *ft, const char *key, size_t keylen,
case 's': case 's':
if (fm->argc < 2) if (fm->argc < 2)
break; break;
sub = fm; sub = xreallocarray (sub, nsub + 1,
sizeof *sub);
sub[nsub++] = fm;
break; break;
case '=': case '=':
if (fm->argc < 1) if (fm->argc < 1)
@ -1625,6 +1627,14 @@ format_replace(struct format_tree *ft, const char *key, size_t keylen,
if (fm->argc >= 2 && fm->argv[1] != NULL) if (fm->argc >= 2 && fm->argv[1] != NULL)
marker = fm->argv[1]; marker = fm->argv[1];
break; break;
case 'p':
if (fm->argc < 1)
break;
width = strtonum(fm->argv[0], INT_MIN, INT_MAX,
&errptr);
if (errptr != NULL)
width = 0;
break;
case 'l': case 'l':
modifiers |= FORMAT_LITERAL; modifiers |= FORMAT_LITERAL;
break; break;
@ -1825,10 +1835,10 @@ done:
} }
/* Perform substitution if any. */ /* Perform substitution if any. */
if (sub != NULL) { for (i = 0; i < nsub; i++) {
left = format_expand(ft, sub->argv[0]); left = format_expand(ft, sub[i]->argv[0]);
right = format_expand(ft, sub->argv[1]); right = format_expand(ft, sub[i]->argv[1]);
new = format_sub(sub, value, left, right); new = format_sub(sub[i], value, left, right);
format_log(ft, "substitute '%s' to '%s': %s", left, right, new); format_log(ft, "substitute '%s' to '%s': %s", left, right, new);
free(value); free(value);
value = new; value = new;
@ -1859,6 +1869,19 @@ done:
format_log(ft, "applied length limit %d: %s", limit, value); format_log(ft, "applied length limit %d: %s", limit, value);
} }
/* Pad the value if needed. */
if (width > 0) {
new = utf8_padcstr(value, width);
free(value);
value = new;
format_log(ft, "applied padding width %d: %s", width, value);
} else if (width < 0) {
new = utf8_rpadcstr(value, -width);
free(value);
value = new;
format_log(ft, "applied padding width %d: %s", width, value);
}
/* Expand the buffer and copy in the value. */ /* Expand the buffer and copy in the value. */
valuelen = strlen(value); valuelen = strlen(value);
while (*len - *off < valuelen + 1) { while (*len - *off < valuelen + 1) {
@ -1871,12 +1894,15 @@ done:
format_log(ft, "replaced '%s' with '%s'", copy0, value); format_log(ft, "replaced '%s' with '%s'", copy0, value);
free(value); free(value);
free(sub);
format_free_modifiers(list, count); format_free_modifiers(list, count);
free(copy0); free(copy0);
return (0); return (0);
fail: fail:
format_log(ft, "failed %s", copy0); format_log(ft, "failed %s", copy0);
free(sub);
format_free_modifiers(list, count); format_free_modifiers(list, count);
free(copy0); free(copy0);
return (-1); return (-1);

6
tmux.1
View File

@ -4106,6 +4106,12 @@ appended or prepended to the string if the length has been trimmed, for example
will append will append
.Ql ... .Ql ...
if the pane title is more than five characters. if the pane title is more than five characters.
Similarly,
.Ql p
pads the string to a given width, for example
.Ql #{p10:pane_title}
will result in a width of at least 10 characters.
A positive width pads on the left, a negative on the right.
.Pp .Pp
Prefixing a time variable with Prefixing a time variable with
.Ql t:\& .Ql t:\&

1
tmux.h
View File

@ -2640,6 +2640,7 @@ struct utf8_data *utf8_fromcstr(const char *);
char *utf8_tocstr(struct utf8_data *); char *utf8_tocstr(struct utf8_data *);
u_int utf8_cstrwidth(const char *); u_int utf8_cstrwidth(const char *);
char *utf8_padcstr(const char *, u_int); char *utf8_padcstr(const char *, u_int);
char *utf8_rpadcstr(const char *, u_int);
int utf8_cstrhas(const char *, const struct utf8_data *); int utf8_cstrhas(const char *, const struct utf8_data *);
/* osdep-*.c */ /* osdep-*.c */

23
utf8.c
View File

@ -415,7 +415,7 @@ utf8_cstrwidth(const char *s)
return (width); return (width);
} }
/* Pad UTF-8 string to width. Caller frees. */ /* Pad UTF-8 string to width on the left. Caller frees. */
char * char *
utf8_padcstr(const char *s, u_int width) utf8_padcstr(const char *s, u_int width)
{ {
@ -436,6 +436,27 @@ utf8_padcstr(const char *s, u_int width)
return (out); return (out);
} }
/* Pad UTF-8 string to width on the right. Caller frees. */
char *
utf8_rpadcstr(const char *s, u_int width)
{
size_t slen;
char *out;
u_int n, i;
n = utf8_cstrwidth(s);
if (n >= width)
return (xstrdup(s));
slen = strlen(s);
out = xmalloc(slen + 1 + (width - n));
for (i = 0; i < width - n; i++)
out[i] = ' ';
memcpy(out + i, s, slen);
out[i + slen] = '\0';
return (out);
}
int int
utf8_cstrhas(const char *s, const struct utf8_data *ud) utf8_cstrhas(const char *s, const struct utf8_data *ud)
{ {