# HG changeset patch # User Bram Moolenaar # Date 1352913056 -3600 # Node ID f15769bce0b811fc840fd455035270288e8d744d # Parent 57e8b75298d6b6e9ef899af66c79a22cb6334988 updated for version 7.3.713 Problem: printf() can only align to bytes, not characters. Solution: Add the "S" item. (Christian Brabandt) diff --git a/runtime/doc/eval.txt b/runtime/doc/eval.txt --- a/runtime/doc/eval.txt +++ b/runtime/doc/eval.txt @@ -4451,6 +4451,7 @@ printf({fmt}, {expr1} ...) *printf()* Often used items are: %s string + %6S string right-aligned in 6 display cells %6s string right-aligned in 6 bytes %.9s string truncated to 9 bytes %c single byte @@ -4565,6 +4566,10 @@ printf({fmt}, {expr1} ...) *printf()* s The text of the String argument is used. If a precision is specified, no more bytes than the number specified are used. + S The text of the String argument is used. If a + precision is specified, no more display cells than the + number specified are used. Without the |+multi_byte| + feature works just like 's'. *printf-f* *E807* f The Float argument is converted into a string of the diff --git a/src/message.c b/src/message.c --- a/src/message.c +++ b/src/message.c @@ -4290,6 +4290,7 @@ vim_snprintf(str, str_m, fmt, a1, a2, a3 case '%': case 'c': case 's': + case 'S': length_modifier = '\0'; str_arg_l = 1; switch (fmt_spec) @@ -4318,6 +4319,7 @@ vim_snprintf(str, str_m, fmt, a1, a2, a3 } case 's': + case 'S': str_arg = #ifndef HAVE_STDARG_H (char *)get_a_arg(arg_idx); @@ -4354,6 +4356,24 @@ vim_snprintf(str, str_m, fmt, a1, a2, a3 str_arg_l = (q == NULL) ? precision : (size_t)(q - str_arg); } +#ifdef FEAT_MBYTE + if (fmt_spec == 'S') + { + if (min_field_width != 0) + min_field_width += STRLEN(str_arg) + - mb_string2cells((char_u *)str_arg, -1); + if (precision) + { + char_u *p1 = (char_u *)str_arg; + size_t i; + + for (i = 0; i < precision && *p1; i++) + p1 += mb_ptr2len(p1); + + str_arg_l = precision = p1 - (char_u *)str_arg; + } + } +#endif break; default: diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -726,6 +726,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 713, +/**/ 712, /**/ 711,