diff options
author | K.Takata <kentkt@csc.jp> | 2023-01-20 16:00:55 +0000 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2023-01-20 16:00:55 +0000 |
commit | 7193323b7796c05573f3aa89d422e848feb3a8dc (patch) | |
tree | ffcff2f43e6fee4264f8da426f0c7e1583688406 /src | |
parent | e446a017ffeaf1941589ac51ce9153b859018e5b (diff) | |
download | vim-git-7193323b7796c05573f3aa89d422e848feb3a8dc.tar.gz |
patch 9.0.1223: cannot use setcellwidths() below 0x100v9.0.1223
Problem: Cannot use setcellwidths() below 0x100.
Solution: Also accept characters between 0x80 and 0x100. (Ken Takata,
closes #11834)
Diffstat (limited to 'src')
-rw-r--r-- | src/errors.h | 4 | ||||
-rw-r--r-- | src/mbyte.c | 25 | ||||
-rw-r--r-- | src/testdir/test_utf8.vim | 33 | ||||
-rw-r--r-- | src/version.c | 2 |
4 files changed, 53 insertions, 11 deletions
diff --git a/src/errors.h b/src/errors.h index 3b6307f0b..3b54f1d9f 100644 --- a/src/errors.h +++ b/src/errors.h @@ -2841,8 +2841,8 @@ EXTERN char e_list_item_nr_cell_width_invalid[] INIT(= N_("E1112: List item %d cell width invalid")); EXTERN char e_overlapping_ranges_for_nr[] INIT(= N_("E1113: Overlapping ranges for 0x%lx")); -EXTERN char e_only_values_of_0x100_and_higher_supported[] - INIT(= N_("E1114: Only values of 0x100 and higher supported")); +EXTERN char e_only_values_of_0x80_and_higher_supported[] + INIT(= N_("E1114: Only values of 0x80 and higher supported")); EXTERN char e_assert_fails_fourth_argument[] INIT(= N_("E1115: \"assert_fails()\" fourth argument must be a number")); EXTERN char e_assert_fails_fifth_argument[] diff --git a/src/mbyte.c b/src/mbyte.c index 6d7137ed5..57aa61999 100644 --- a/src/mbyte.c +++ b/src/mbyte.c @@ -1589,19 +1589,26 @@ utf_char2cells(int c) #endif }; - if (c >= 0x100) - { -#if defined(FEAT_EVAL) || defined(USE_WCHAR_FUNCTIONS) - int n; -#endif - #ifdef FEAT_EVAL - n = cw_value(c); + // Use the value from setcellwidths() at 0x80 and higher, unless the + // character is not printable. + if (c >= 0x80 && +# ifdef USE_WCHAR_FUNCTIONS + wcwidth(c) >= 1 && +# endif + vim_isprintc(c)) + { + int n = cw_value(c); if (n != 0) return n; + } #endif + if (c >= 0x100) + { #ifdef USE_WCHAR_FUNCTIONS + int n; + /* * Assume the library function wcwidth() works better than our own * stuff. It should return 1 for ambiguous width chars! @@ -5661,9 +5668,9 @@ f_setcellwidths(typval_T *argvars, typval_T *rettv UNUSED) if (i == 0) { n1 = lili->li_tv.vval.v_number; - if (n1 < 0x100) + if (n1 < 0x80) { - emsg(_(e_only_values_of_0x100_and_higher_supported)); + emsg(_(e_only_values_of_0x80_and_higher_supported)); vim_free(ptrs); return; } diff --git a/src/testdir/test_utf8.vim b/src/testdir/test_utf8.vim index d71d7ad03..9ad7828d4 100644 --- a/src/testdir/test_utf8.vim +++ b/src/testdir/test_utf8.vim @@ -167,6 +167,39 @@ func Test_setcellwidths() call assert_equal(2, strwidth("\u1339")) call assert_equal(1, strwidth("\u133a")) + for aw in ['single', 'double'] + exe 'set ambiwidth=' . aw + " Handle \u0080 to \u009F as control chars even on MS-Windows. + set isprint=@,161-255 + + call setcellwidths([]) + " Control chars + call assert_equal(4, strwidth("\u0081")) + call assert_equal(6, strwidth("\uFEFF")) + " Ambiguous width chars + call assert_equal((aw == 'single') ? 1 : 2, strwidth("\u00A1")) + call assert_equal((aw == 'single') ? 1 : 2, strwidth("\u2010")) + + call setcellwidths([[0x81, 0x81, 1], [0xA1, 0xA1, 1], + \ [0x2010, 0x2010, 1], [0xFEFF, 0xFEFF, 1]]) + " Control chars + call assert_equal(4, strwidth("\u0081")) + call assert_equal(6, strwidth("\uFEFF")) + " Ambiguous width chars + call assert_equal(1, strwidth("\u00A1")) + call assert_equal(1, strwidth("\u2010")) + + call setcellwidths([[0x81, 0x81, 2], [0xA1, 0xA1, 2], + \ [0x2010, 0x2010, 2], [0xFEFF, 0xFEFF, 2]]) + " Control chars + call assert_equal(4, strwidth("\u0081")) + call assert_equal(6, strwidth("\uFEFF")) + " Ambiguous width chars + call assert_equal(2, strwidth("\u00A1")) + call assert_equal(2, strwidth("\u2010")) + endfor + set ambiwidth& isprint& + call setcellwidths([]) call assert_fails('call setcellwidths(1)', 'E1211:') diff --git a/src/version.c b/src/version.c index 22a8e8b77..f15061adc 100644 --- a/src/version.c +++ b/src/version.c @@ -696,6 +696,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 1223, +/**/ 1222, /**/ 1221, |