diff --git a/src/strings.c b/src/strings.c index d2d37d80f6..bc88ce5f6e 100644 --- a/src/strings.c +++ b/src/strings.c @@ -2137,14 +2137,15 @@ vim_vsnprintf_typval( char *q = memchr(str_arg, '\0', precision <= (size_t)0x7fffffffL ? precision : (size_t)0x7fffffffL); + str_arg_l = (q == NULL) ? precision : (size_t)(q - str_arg); } if (fmt_spec == 'S') { - if (min_field_width != 0) - min_field_width += STRLEN(str_arg) - - mb_string2cells((char_u *)str_arg, -1); + size_t base_width = min_field_width; + size_t pad_cell = 0; + if (precision) { char_u *p1; @@ -2157,8 +2158,12 @@ vim_vsnprintf_typval( if (i > precision) break; } - str_arg_l = precision = p1 - (char_u *)str_arg; + pad_cell = min_field_width - precision; + base_width = str_arg_l = precision = + p1 - (char_u *)str_arg; } + if (min_field_width != 0) + min_field_width = base_width + pad_cell; } break; diff --git a/src/testdir/test_expr.vim b/src/testdir/test_expr.vim index 080eee7e10..9700974278 100644 --- a/src/testdir/test_expr.vim +++ b/src/testdir/test_expr.vim @@ -297,6 +297,11 @@ function Test_printf_misc() call assert_equal('🐍', printf('%.2S', '🐍🐍')) call assert_equal('', printf('%.1S', '🐍🐍')) + call assert_equal('[ あいう]', printf('[%10.6S]', 'あいうえお')) + call assert_equal('[ あいうえ]', printf('[%10.8S]', 'あいうえお')) + call assert_equal('[あいうえお]', printf('[%10.10S]', 'あいうえお')) + call assert_equal('[あいうえお]', printf('[%10.12S]', 'あいうえお')) + call assert_equal('1%', printf('%d%%', 1)) endfunc diff --git a/src/version.c b/src/version.c index b30979a0b7..4fb0e9eb77 100644 --- a/src/version.c +++ b/src/version.c @@ -757,6 +757,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 3630, /**/ 3629, /**/