aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorbfredl <bjorn.linse@gmail.com>2024-09-03 12:04:42 +0200
committerGitHub <noreply@github.com>2024-09-03 12:04:42 +0200
commitceddaedfadae80996fb4852bfca86fe8929ab454 (patch)
treef12891c4c65f5ef708d1d6fbb58ab0189ba8f9fb /src
parentea2d9493514a82bb5077e73957a22648cb5d7d14 (diff)
parent50a576ba576b5eff44d1c476da013eab11b4f3ed (diff)
downloadrneovim-ceddaedfadae80996fb4852bfca86fe8929ab454.tar.gz
rneovim-ceddaedfadae80996fb4852bfca86fe8929ab454.tar.bz2
rneovim-ceddaedfadae80996fb4852bfca86fe8929ab454.zip
Merge pull request #30232 from bfredl/emoji2
fix(mbyte): mark any 0xFE0F sequence as a TUI ambiguous width char
Diffstat (limited to 'src')
-rw-r--r--src/nvim/mbyte.c17
1 files changed, 13 insertions, 4 deletions
diff --git a/src/nvim/mbyte.c b/src/nvim/mbyte.c
index db4730408b..6fd51e773d 100644
--- a/src/nvim/mbyte.c
+++ b/src/nvim/mbyte.c
@@ -1339,13 +1339,22 @@ int utf_class_tab(const int c, const uint64_t *const chartab)
bool utf_ambiguous_width(const char *p)
{
- int c = utf_ptr2char(p);
- if (c < 0x80) {
+ // be quick if there is nothing to print or ASCII-only
+ if (p[0] == NUL || p[1] == NUL) {
return false;
}
- const utf8proc_property_t *prop = utf8proc_get_property(c);
- return prop->ambiguous_width || prop_is_emojilike(prop);
+ CharInfo info = utf_ptr2CharInfo(p);
+ if (info.value >= 0x80) {
+ const utf8proc_property_t *prop = utf8proc_get_property(info.value);
+ if (prop->ambiguous_width || prop_is_emojilike(prop)) {
+ return true;
+ }
+ }
+
+ // check if second sequence is 0xFE0F VS-16 which can turn things into emoji,
+ // safe with NUL (no second sequence)
+ return memcmp(p + info.len, "\xef\xb8\x8f", 3) == 0;
}
// Return the folded-case equivalent of "a", which is a UCS-4 character. Uses