diff options
author | bfredl <bjorn.linse@gmail.com> | 2024-11-04 14:07:10 +0100 |
---|---|---|
committer | bfredl <bjorn.linse@gmail.com> | 2024-11-08 11:25:34 +0100 |
commit | 092042b43d58254807c9e1151d8b6efb4d6410c4 (patch) | |
tree | ef61ba6ec0433a6c03128b2ff4f72c5eaa191385 /src/nvim/ex_getln.c | |
parent | 8ab1903092f0ab193adf17ee635da838cce01dfa (diff) | |
download | rneovim-092042b43d58254807c9e1151d8b6efb4d6410c4.tar.gz rneovim-092042b43d58254807c9e1151d8b6efb4d6410c4.tar.bz2 rneovim-092042b43d58254807c9e1151d8b6efb4d6410c4.zip |
fix(cmdline): simplify and correct grapheme cluster adjustment
Diffstat (limited to 'src/nvim/ex_getln.c')
-rw-r--r-- | src/nvim/ex_getln.c | 36 |
1 files changed, 6 insertions, 30 deletions
diff --git a/src/nvim/ex_getln.c b/src/nvim/ex_getln.c index dda1a18fa6..9c606c9606 100644 --- a/src/nvim/ex_getln.c +++ b/src/nvim/ex_getln.c @@ -3596,38 +3596,14 @@ void put_on_cmdline(const char *str, int len, bool redraw) memmove(ccline.cmdbuff + ccline.cmdpos, str, (size_t)len); ccline.cmdbuff[ccline.cmdlen] = NUL; - { - // When the inserted text starts with a composing character, - // backup to the character before it. There could be two of them. - int i = 0; - int c = utf_ptr2char(ccline.cmdbuff + ccline.cmdpos); - // TODO(bfredl): this can be corrected/simplified as utf_head_off implements the - // correct grapheme cluster breaks - while (ccline.cmdpos > 0 && utf_iscomposing_legacy(c)) { - i = utf_head_off(ccline.cmdbuff, ccline.cmdbuff + ccline.cmdpos - 1) + 1; + // When the inserted text starts with a composing character, + // backup to the character before it. + if (ccline.cmdpos > 0 && (uint8_t)ccline.cmdbuff[ccline.cmdpos] >= 0x80) { + int i = utf_head_off(ccline.cmdbuff, ccline.cmdbuff + ccline.cmdpos); + if (i != 0) { ccline.cmdpos -= i; len += i; - c = utf_ptr2char(ccline.cmdbuff + ccline.cmdpos); - } - if (i == 0 && ccline.cmdpos > 0 && arabic_maycombine(c)) { - // Check the previous character for Arabic combining pair. - i = utf_head_off(ccline.cmdbuff, ccline.cmdbuff + ccline.cmdpos - 1) + 1; - if (arabic_combine(utf_ptr2char(ccline.cmdbuff + ccline.cmdpos - i), c)) { - ccline.cmdpos -= i; - len += i; - } else { - i = 0; - } - } - if (i != 0) { - // Also backup the cursor position. - i = ptr2cells(ccline.cmdbuff + ccline.cmdpos); - ccline.cmdspos -= i; - msg_col -= i; - if (msg_col < 0) { - msg_col += Columns; - msg_row--; - } + ccline.cmdspos = cmd_screencol(ccline.cmdpos); } } |