@@ -4787,6 +4787,8 @@ set_chars_option(win_T *wp, char_u **varp)
47874787 int round , i , len , entries ;
47884788 char_u * p , * s ;
47894789 int c1 = 0 , c2 = 0 , c3 = 0 ;
4790+ char_u * last_multispace ; // Last occurrence of "multispace:"
4791+ int multispace_len = 0 ; // Length of lcs-multispace string
47904792 struct charstab
47914793 {
47924794 int * cp ;
@@ -4853,6 +4855,13 @@ set_chars_option(win_T *wp, char_u **varp)
48534855 {
48544856 lcs_chars .tab1 = NUL ;
48554857 lcs_chars .tab3 = NUL ;
4858+ if (multispace_len )
4859+ {
4860+ lcs_chars .multispace = ALLOC_MULT (int , multispace_len + 1 );
4861+ lcs_chars .multispace [multispace_len ] = NUL ;
4862+ }
4863+ else
4864+ lcs_chars .multispace = NULL ;
48564865 }
48574866 else
48584867 {
@@ -4877,19 +4886,19 @@ set_chars_option(win_T *wp, char_u **varp)
48774886 s = p + len + 1 ;
48784887 c1 = mb_ptr2char_adv (& s );
48794888 if (mb_char2cells (c1 ) > 1 )
4880- continue ;
4889+ return e_invarg ;
48814890 if (tab [i ].cp == & lcs_chars .tab2 )
48824891 {
48834892 if (* s == NUL )
4884- continue ;
4893+ return e_invarg ;
48854894 c2 = mb_ptr2char_adv (& s );
48864895 if (mb_char2cells (c2 ) > 1 )
4887- continue ;
4896+ return e_invarg ;
48884897 if (!(* s == ',' || * s == NUL ))
48894898 {
48904899 c3 = mb_ptr2char_adv (& s );
48914900 if (mb_char2cells (c3 ) > 1 )
4892- continue ;
4901+ return e_invarg ;
48934902 }
48944903 }
48954904
@@ -4914,13 +4923,57 @@ set_chars_option(win_T *wp, char_u **varp)
49144923 }
49154924
49164925 if (i == entries )
4917- return e_invarg ;
4926+ {
4927+ len = STRLEN ("multispace" );
4928+ if ((varp == & p_lcs || varp == & wp -> w_p_lcs )
4929+ && STRNCMP (p , "multispace" , len ) == 0
4930+ && p [len ] == ':'
4931+ && p [len + 1 ] != NUL )
4932+ {
4933+ s = p + len + 1 ;
4934+ if (round == 0 )
4935+ {
4936+ // Get length of lcs-multispace string in first round
4937+ last_multispace = p ;
4938+ multispace_len = 0 ;
4939+ while (* s != NUL && * s != ',' )
4940+ {
4941+ c1 = mb_ptr2char_adv (& s );
4942+ if (mb_char2cells (c1 ) > 1 )
4943+ return e_invarg ;
4944+ ++ multispace_len ;
4945+ }
4946+ if (multispace_len == 0 )
4947+ // lcs-multispace cannot be an empty string
4948+ return e_invarg ;
4949+ p = s ;
4950+ }
4951+ else
4952+ {
4953+ int multispace_pos = 0 ;
4954+ while (* s != NUL && * s != ',' )
4955+ {
4956+ c1 = mb_ptr2char_adv (& s );
4957+ if (p == last_multispace )
4958+ lcs_chars .multispace [multispace_pos ++ ] = c1 ;
4959+ }
4960+ p = s ;
4961+ }
4962+ }
4963+ else
4964+ return e_invarg ;
4965+ }
4966+
49184967 if (* p == ',' )
49194968 ++ p ;
49204969 }
49214970 }
49224971 if (tab == lcstab )
4972+ {
4973+ if (wp -> w_lcs_chars .multispace != NULL )
4974+ vim_free (wp -> w_lcs_chars .multispace );
49234975 wp -> w_lcs_chars = lcs_chars ;
4976+ }
49244977
49254978 return NULL ; // no error
49264979}
0 commit comments