patch 9.0.1961: 'listchars' completion misses "multispace" and "leadmultispace"
Problem: Cmdline completion for 'listchars' fields doesn't include
"multispace" and "leadmultispace" (after 9.0.1958).
Solution: Include "multispace" and "leadmultispace" in lcstab.
closes: #13225
Signed-off-by: Christian Brabandt <cb@256bit.org>
Co-authored-by: zeertzjq <zeertzjq@outlook.com>
diff --git a/src/screen.c b/src/screen.c
index 4b86eb8..3d931ab 100644
--- a/src/screen.c
+++ b/src/screen.c
@@ -4693,6 +4693,8 @@
#else
{NULL, "conceal"},
#endif
+ {NULL, "multispace"},
+ {NULL, "leadmultispace"},
};
/*
@@ -4706,7 +4708,7 @@
static char *
set_chars_option(win_T *wp, char_u *value, int is_listchars, int apply)
{
- int round, i, len, len2, entries;
+ int round, i, len, entries;
char_u *p, *s;
int c1 = 0, c2 = 0, c3 = 0;
char_u *last_multispace = NULL; // Last occurrence of "multispace:"
@@ -4784,58 +4786,12 @@
for (i = 0; i < entries; ++i)
{
len = (int)STRLEN(tab[i].name);
- if (STRNCMP(p, tab[i].name, len) == 0
+ if (!(STRNCMP(p, tab[i].name, len) == 0
&& p[len] == ':'
- && p[len + 1] != NUL)
- {
- c2 = c3 = 0;
- s = p + len + 1;
- c1 = get_encoded_char_adv(&s);
- if (char2cells(c1) > 1)
- return e_invalid_argument;
- if (tab[i].cp == &lcs_chars.tab2)
- {
- if (*s == NUL)
- return e_invalid_argument;
- c2 = get_encoded_char_adv(&s);
- if (char2cells(c2) > 1)
- return e_invalid_argument;
- if (!(*s == ',' || *s == NUL))
- {
- c3 = get_encoded_char_adv(&s);
- if (char2cells(c3) > 1)
- return e_invalid_argument;
- }
- }
+ && p[len + 1] != NUL))
+ continue;
- if (*s == ',' || *s == NUL)
- {
- if (round > 0)
- {
- if (tab[i].cp == &lcs_chars.tab2)
- {
- lcs_chars.tab1 = c1;
- lcs_chars.tab2 = c2;
- lcs_chars.tab3 = c3;
- }
- else if (tab[i].cp != NULL)
- *(tab[i].cp) = c1;
-
- }
- p = s;
- break;
- }
- }
- }
-
- if (i == entries)
- {
- len = (int)STRLEN("multispace");
- len2 = (int)STRLEN("leadmultispace");
- if (is_listchars
- && STRNCMP(p, "multispace", len) == 0
- && p[len] == ':'
- && p[len + 1] != NUL)
+ if (is_listchars && strcmp(tab[i].name, "multispace") == 0)
{
s = p + len + 1;
if (round == 0)
@@ -4867,14 +4823,12 @@
}
p = s;
}
+ break;
}
- else if (is_listchars
- && STRNCMP(p, "leadmultispace", len2) == 0
- && p[len2] == ':'
- && p[len2 + 1] != NUL)
+ if (is_listchars && strcmp(tab[i].name, "leadmultispace") == 0)
{
- s = p + len2 + 1;
+ s = p + len + 1;
if (round == 0)
{
// get length of lcs-leadmultispace string in first
@@ -4905,11 +4859,51 @@
}
p = s;
}
+ break;
}
- else
+
+ c2 = c3 = 0;
+ s = p + len + 1;
+ c1 = get_encoded_char_adv(&s);
+ if (char2cells(c1) > 1)
return e_invalid_argument;
+ if (tab[i].cp == &lcs_chars.tab2)
+ {
+ if (*s == NUL)
+ return e_invalid_argument;
+ c2 = get_encoded_char_adv(&s);
+ if (char2cells(c2) > 1)
+ return e_invalid_argument;
+ if (!(*s == ',' || *s == NUL))
+ {
+ c3 = get_encoded_char_adv(&s);
+ if (char2cells(c3) > 1)
+ return e_invalid_argument;
+ }
+ }
+
+ if (*s == ',' || *s == NUL)
+ {
+ if (round > 0)
+ {
+ if (tab[i].cp == &lcs_chars.tab2)
+ {
+ lcs_chars.tab1 = c1;
+ lcs_chars.tab2 = c2;
+ lcs_chars.tab3 = c3;
+ }
+ else if (tab[i].cp != NULL)
+ *(tab[i].cp) = c1;
+
+ }
+ p = s;
+ break;
+ }
}
+ if (i == entries)
+ return e_invalid_argument;
+
if (*p == ',')
++p;
}