diff options
| author | zeertzjq <zeertzjq@outlook.com> | 2026-06-15 08:06:50 +0800 |
|---|---|---|
| committer | zeertzjq <zeertzjq@outlook.com> | 2026-06-15 08:15:26 +0800 |
| commit | 2fe91d02259198bb50a4dce0a80da76dbfede86a (patch) | |
| tree | a4e217233faabf5e40011559e767625e4110dd3b /src | |
| parent | 0c63e41b5dfde4dd055aed9e671f5db6380d0af9 (diff) | |
| download | rneovim-2fe91d02259198bb50a4dce0a80da76dbfede86a.tar.gz rneovim-2fe91d02259198bb50a4dce0a80da76dbfede86a.tar.bz2 rneovim-2fe91d02259198bb50a4dce0a80da76dbfede86a.zip | |
vim-patch:9.2.0645: Composing chars no longer accepted in end-id abbr
Problem: Composing chars are no longer accepted in end-id abbreviation
(after 9.2.0629).
Solution: Unescape all chars using vim_unescape_csi() instead of using
mb_unescape() on individual chars, so that mb_ptr2len() and
MB_PTR_ADV() can still be used.
closes: vim/vim#20514
https://github.com/vim/vim/commit/23a84d28a8c4acfda1d01bde2b5366a496431d88
Diffstat (limited to 'src')
| -rw-r--r-- | src/nvim/keycodes.c | 4 | ||||
| -rw-r--r-- | src/nvim/mapping.c | 26 |
2 files changed, 15 insertions, 15 deletions
diff --git a/src/nvim/keycodes.c b/src/nvim/keycodes.c index ef067f68e2..9827604d67 100644 --- a/src/nvim/keycodes.c +++ b/src/nvim/keycodes.c @@ -850,7 +850,8 @@ char *vim_strsave_escape_ks(char *p) /// Remove escaping from K_SPECIAL characters. Reverse of /// vim_strsave_escape_ks(). Works in-place. -void vim_unescape_ks(char *p) +/// Returns the number of bytes in the unescaped string. +size_t vim_unescape_ks(char *p) { uint8_t *s = (uint8_t *)p; uint8_t *d = (uint8_t *)p; @@ -864,4 +865,5 @@ void vim_unescape_ks(char *p) } } *d = NUL; + return (size_t)((char *)d - p); } diff --git a/src/nvim/mapping.c b/src/nvim/mapping.c index a922d42b1f..3bebbb62eb 100644 --- a/src/nvim/mapping.c +++ b/src/nvim/mapping.c @@ -628,29 +628,28 @@ static int buf_do_map(int maptype, MapArguments *args, int mode, bool is_abbrev, // vi-compatible way. int same = -1; - const char *p = lhs; - const char *p_char = mb_unescape(&p); - if (p_char == NULL) { - p_char = p++; - } - const int first = vim_iswordp(p_char); + char keys_unescaped[MAXMAPLEN + 1]; + xmemcpyz(keys_unescaped, lhs, (size_t)len); + size_t keys_unescaped_len = vim_unescape_ks(keys_unescaped); + const char *p = keys_unescaped; + + const int first = vim_iswordp(p); int last = first; + MB_PTR_ADV(p); int n = 1; - while (p < lhs + len) { + while (p < keys_unescaped + keys_unescaped_len) { n++; // nr of (multi-byte) chars - p_char = mb_unescape(&p); - if (p_char == NULL) { - p_char = p++; - } - last = vim_iswordp(p_char); // type of last char + last = vim_iswordp(p); // type of last char if (same == -1 && last != first) { same = n - 1; // count of same char type } + MB_PTR_ADV(p); } if (last && n > 2 && same >= 0 && same < n - 1) { retval = 1; goto theend; } + // An abbreviation cannot contain white space. for (n = 0; n < len; n++) { if (ascii_iswhite(lhs[n])) { @@ -1537,8 +1536,7 @@ bool check_abbr(int c, char *ptr, int col, int mincol) if (strchr(mp->m_keys, K_SPECIAL) != NULL) { // Might have K_SPECIAL escaped mp->m_keys. q = xstrdup(mp->m_keys); - vim_unescape_ks(q); - qlen = (int)strlen(q); + qlen = (int)vim_unescape_ks(q); } // find entries with right mode and keys int match = (mp->m_mode & State) |