vim-patch:8.2.{1536,1540}: charclass() (#19748)

vim-patch:8.2.1536: cannot get the class of a character; emoji widths are wrong

Problem:    Cannot get the class of a character; emoji widths are wrong in
            some environments.
Solution:   Add charclass(). Update some emoji widths.  Add script to check
            emoji widths.
4e4473c927

Use latest charclass() docs from Vim.
Rewrite DoIt() in emoji_list.vim in Lua.
Omit emoji table updates:
- emoji_width update looks wrong as these added ranges are only double-width when followed by 0xFE0F.
- Other updates are too old.

vim-patch:8.2.1540: the user cannot try out emoji character widths

Problem:    The user cannot try out emoji character widths.
Solution:   Move the emoji script to the runtime/tools directory.
98945560c1
This commit is contained in:
zeertzjq
2022-08-13 11:29:38 +08:00
committed by GitHub
parent 6f14c5d2dd
commit 754892e59d
6 changed files with 60 additions and 6 deletions

View File

@@ -1182,6 +1182,11 @@ int utf_class_tab(const int c, const uint64_t *const chartab)
return 1; // punctuation
}
// emoji
if (intable(emoji_all, ARRAY_SIZE(emoji_all), c)) {
return 3;
}
// binary search in table
while (top >= bot) {
mid = (bot + top) / 2;
@@ -1194,11 +1199,6 @@ int utf_class_tab(const int c, const uint64_t *const chartab)
}
}
// emoji
if (intable(emoji_all, ARRAY_SIZE(emoji_all), c)) {
return 3;
}
// most other characters are "word" characters
return 2;
}
@@ -2858,3 +2858,14 @@ void f_setcellwidths(typval_T *argvars, typval_T *rettv, FunPtr fptr)
xfree(cw_table_save);
redraw_all_later(NOT_VALID);
}
void f_charclass(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
if (argvars[0].v_type != VAR_STRING
|| argvars[0].vval.v_string == NULL
|| *argvars[0].vval.v_string == NUL) {
emsg(_(e_stringreq));
return;
}
rettv->vval.v_number = mb_get_class((const char_u *)argvars[0].vval.v_string);
}