pretty: support %>> that steal trailing spaces
This is pretty useful in `%<(100)%s%Cred%>(20)% an' where %s does not use up all 100 columns and %an needs more than 20 columns. By replacing %>(20) with %>>(20), %an can steal spaces from %s. %>> understands escape sequences, so %Cred does not stop it from stealing spaces in %<(100). Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:

committed by
Junio C Hamano

parent
a7f01c6b4d
commit
1640632b4f
34
pretty.c
34
pretty.c
@ -773,6 +773,7 @@ enum flush_type {
|
||||
no_flush,
|
||||
flush_right,
|
||||
flush_left,
|
||||
flush_left_and_steal,
|
||||
flush_both
|
||||
};
|
||||
|
||||
@ -1026,6 +1027,9 @@ static size_t parse_padding_placeholder(struct strbuf *sb,
|
||||
if (*ch == '<') {
|
||||
flush_type = flush_both;
|
||||
ch++;
|
||||
} else if (*ch == '>') {
|
||||
flush_type = flush_left_and_steal;
|
||||
ch++;
|
||||
} else
|
||||
flush_type = flush_left;
|
||||
break;
|
||||
@ -1334,6 +1338,36 @@ static size_t format_and_pad_commit(struct strbuf *sb, /* in UTF-8 */
|
||||
total_consumed++;
|
||||
}
|
||||
len = utf8_strnwidth(local_sb.buf, -1, 1);
|
||||
|
||||
if (c->flush_type == flush_left_and_steal) {
|
||||
const char *ch = sb->buf + sb->len - 1;
|
||||
while (len > padding && ch > sb->buf) {
|
||||
const char *p;
|
||||
if (*ch == ' ') {
|
||||
ch--;
|
||||
padding++;
|
||||
continue;
|
||||
}
|
||||
/* check for trailing ansi sequences */
|
||||
if (*ch != 'm')
|
||||
break;
|
||||
p = ch - 1;
|
||||
while (ch - p < 10 && *p != '\033')
|
||||
p--;
|
||||
if (*p != '\033' ||
|
||||
ch + 1 - p != display_mode_esc_sequence_len(p))
|
||||
break;
|
||||
/*
|
||||
* got a good ansi sequence, put it back to
|
||||
* local_sb as we're cutting sb
|
||||
*/
|
||||
strbuf_insert(&local_sb, 0, p, ch + 1 - p);
|
||||
ch = p - 1;
|
||||
}
|
||||
strbuf_setlen(sb, ch + 1 - sb->buf);
|
||||
c->flush_type = flush_left;
|
||||
}
|
||||
|
||||
if (len > padding) {
|
||||
switch (c->truncate) {
|
||||
case trunc_left:
|
||||
|
Reference in New Issue
Block a user