Support negative trim values (#{=-10:pane_title}) to trim from the end,

suggested by Kevin Brubeck Unhammer.
This commit is contained in:
nicm 2016-01-31 09:54:46 +00:00
parent 225a384dbb
commit 8028560f82
2 changed files with 15 additions and 7 deletions

View File

@ -684,7 +684,7 @@ format_replace(struct format_tree *ft, const char *key, size_t keylen,
char *copy, *copy0, *endptr, *ptr, *found, *new, *value; char *copy, *copy0, *endptr, *ptr, *found, *new, *value;
char *from = NULL, *to = NULL; char *from = NULL, *to = NULL;
size_t valuelen, newlen, fromlen, tolen, used; size_t valuelen, newlen, fromlen, tolen, used;
u_long limit = 0; long limit = 0;
int modifiers = 0, brackets; int modifiers = 0, brackets;
/* Make a copy of the key. */ /* Make a copy of the key. */
@ -696,8 +696,8 @@ format_replace(struct format_tree *ft, const char *key, size_t keylen,
switch (copy[0]) { switch (copy[0]) {
case '=': case '=':
errno = 0; errno = 0;
limit = strtoul(copy + 1, &endptr, 10); limit = strtol(copy + 1, &endptr, 10);
if (errno == ERANGE && limit == ULONG_MAX) if (errno == ERANGE && (limit == LONG_MIN || limit == LONG_MAX))
break; break;
if (*endptr != ':') if (*endptr != ':')
break; break;
@ -813,10 +813,14 @@ format_replace(struct format_tree *ft, const char *key, size_t keylen,
} }
/* Truncate the value if needed. */ /* Truncate the value if needed. */
if (limit != 0) { if (limit > 0) {
new = utf8_trimcstr(value, limit); new = utf8_trimcstr(value, limit);
free(value); free(value);
value = new; value = new;
} else if (limit < 0) {
new = utf8_rtrimcstr(value, -limit);
free(value);
value = new;
} }
/* Expand the buffer and copy in the value. */ /* Expand the buffer and copy in the value. */

10
tmux.1
View File

@ -3377,9 +3377,13 @@ if not.
A limit may be placed on the length of the resultant string by prefixing it A limit may be placed on the length of the resultant string by prefixing it
by an by an
.Ql = , .Ql = ,
a number and a colon, so a number and a colon.
.Ql #{=10:pane_title} Positive numbers count from the start of the string and negative from the end,
will include at most the first 10 characters of the pane title. so
.Ql #{=5:pane_title}
will include at most the first 5 characters of the pane title, or
.Ql #{=-5:pane_title}
the last 5 characters.
Prefixing a time variable with Prefixing a time variable with
.Ql t: .Ql t:
will convert it to a string, so if will convert it to a string, so if