aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorzeertzjq <zeertzjq@outlook.com>2026-06-15 08:06:50 +0800
committerzeertzjq <zeertzjq@outlook.com>2026-06-15 08:15:26 +0800
commit2fe91d02259198bb50a4dce0a80da76dbfede86a (patch)
treea4e217233faabf5e40011559e767625e4110dd3b /src
parent0c63e41b5dfde4dd055aed9e671f5db6380d0af9 (diff)
downloadrneovim-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.c4
-rw-r--r--src/nvim/mapping.c26
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)