changeset 36368:387395e4c5f8 draft v9.1.0804

patch 9.1.0804: tests: no error check when setting global 'cc' Commit: https://github.com/vim/vim/commit/a441a3eaabbfc14b4772e07ecbecaaff3bd06a58 Author: Milly <milly.ca@gmail.com> Date: Tue Oct 22 22:43:01 2024 +0200 patch 9.1.0804: tests: no error check when setting global 'cc' Problem: tests: no error check when setting global 'cc' Solution: also parse and check global 'cc' value (Milly) closes: #15914 Signed-off-by: Milly <milly.ca@gmail.com> Signed-off-by: Christian Brabandt <cb@256bit.org>
author Christian Brabandt <cb@256bit.org>
date Tue, 22 Oct 2024 23:00:04 +0200
parents 5bc2cab29bfd
children 0a9d8c8bd5c9
files src/buffer.c src/option.c src/optionstr.c src/proto/window.pro src/testdir/gen_opt_test.vim src/version.c src/window.c
diffstat 7 files changed, 37 insertions(+), 16 deletions(-) [+]
line wrap: on
line diff
--- a/src/buffer.c
+++ b/src/buffer.c
@@ -214,7 +214,7 @@ open_buffer(
 	enter_buffer(curbuf);
 #ifdef FEAT_SYN_HL
 	if (old_tw != curbuf->b_p_tw)
-	    check_colorcolumn(curwin);
+	    check_colorcolumn(NULL, curwin);
 #endif
 	return FAIL;
     }
@@ -1213,7 +1213,7 @@ handle_swap_exists(bufref_T *old_curbuf)
 
 #ifdef FEAT_SYN_HL
 	    if (old_tw != curbuf->b_p_tw)
-		check_colorcolumn(curwin);
+		check_colorcolumn(NULL, curwin);
 #endif
 	}
 	// If "old_curbuf" is NULL we are in big trouble here...
@@ -1911,7 +1911,7 @@ set_curbuf(buf_T *buf, int action)
 	    enter_buffer(buf);
 #ifdef FEAT_SYN_HL
 	if (old_tw != curbuf->b_p_tw)
-	    check_colorcolumn(curwin);
+	    check_colorcolumn(NULL, curwin);
 #endif
     }
 }
--- a/src/option.c
+++ b/src/option.c
@@ -4328,7 +4328,7 @@ did_set_textwidth(optset_T *args UNUSED)
 	tabpage_T	*tp;
 
 	FOR_ALL_TAB_WINDOWS(tp, wp)
-	    check_colorcolumn(wp);
+	    check_colorcolumn(NULL, wp);
     }
 #endif
 
@@ -6755,7 +6755,7 @@ after_copy_winopt(win_T *wp)
 #endif
 #ifdef FEAT_SYN_HL
     fill_culopt_flags(NULL, wp);
-    check_colorcolumn(wp);
+    check_colorcolumn(NULL, wp);
 #endif
     set_listchars_option(wp, wp->w_p_lcs, TRUE, NULL, 0);
     set_fillchars_option(wp, wp->w_p_fcs, TRUE, NULL, 0);
--- a/src/optionstr.c
+++ b/src/optionstr.c
@@ -1478,9 +1478,11 @@ did_set_cinoptions(optset_T *args UNUSED
  * The 'colorcolumn' option is changed.
  */
     char *
-did_set_colorcolumn(optset_T *args UNUSED)
-{
-    return check_colorcolumn(curwin);
+did_set_colorcolumn(optset_T *args)
+{
+    char_u	**varp = (char_u **)args->os_varp;
+
+    return check_colorcolumn(*varp, varp == &curwin->w_p_cc ? curwin : NULL);
 }
 #endif
 
--- a/src/proto/window.pro
+++ b/src/proto/window.pro
@@ -98,7 +98,7 @@ void restore_snapshot(int idx, int close
 int win_hasvertsplit(void);
 int get_win_number(win_T *wp, win_T *first_win);
 int get_tab_number(tabpage_T *tp);
-char *check_colorcolumn(win_T *wp);
+char *check_colorcolumn(char_u *cc, win_T *wp);
 int get_last_winid(void);
 int win_locked(win_T *wp);
 /* vim: set ft=c : */
--- a/src/testdir/gen_opt_test.vim
+++ b/src/testdir/gen_opt_test.vim
@@ -46,7 +46,6 @@ let skip_setglobal_reasons = #{
       \ iminsert: 'The global value is always overwritten by the local value',
       \ imsearch: 'The global value is always overwritten by the local value',
       \ breakindentopt:	'TODO: fix missing error handling for setglobal',
-      \ colorcolumn:	'TODO: fix missing error handling for setglobal',
       \ conceallevel:	'TODO: fix missing error handling for setglobal',
       \ foldcolumn:	'TODO: fix missing error handling for setglobal',
       \ numberwidth:	'TODO: fix missing error handling for setglobal',
--- a/src/version.c
+++ b/src/version.c
@@ -705,6 +705,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    804,
+/**/
     803,
 /**/
     802,
--- a/src/window.c
+++ b/src/window.c
@@ -7925,23 +7925,38 @@ int_cmp(const void *pa, const void *pb)
 }
 
 /*
- * Handle setting 'colorcolumn' or 'textwidth' in window "wp".
+ * Check "cc" as 'colorcolumn' and update the members of "wp".
+ * This is called when 'colorcolumn' or 'textwidth' is changed.
  * Returns error message, NULL if it's OK.
  */
     char *
-check_colorcolumn(win_T *wp)
+check_colorcolumn(
+    char_u *cc,		// when NULL: use "wp->w_p_cc"
+    win_T *wp)		// when NULL: only parse "cc"
 {
     char_u	*s;
+    int		tw;
     int		col;
     int		count = 0;
     int		color_cols[256];
     int		i;
     int		j = 0;
 
-    if (wp->w_buffer == NULL)
+    if (wp != NULL && wp->w_buffer == NULL)
 	return NULL;  // buffer was closed
 
-    for (s = wp->w_p_cc; *s != NUL && count < 255;)
+    if (cc != NULL)
+	s = cc;
+    else
+	s = wp->w_p_cc;
+
+    if (wp != NULL)
+	tw = wp->w_buffer->b_p_tw;
+    else
+	// buffer-local value not set, assume zero
+	tw = 0;
+
+    while (*s != NUL && count < 255)
     {
 	if (*s == '-' || *s == '+')
 	{
@@ -7951,9 +7966,9 @@ check_colorcolumn(win_T *wp)
 	    if (!VIM_ISDIGIT(*s))
 		return e_invalid_argument;
 	    col = col * getdigits(&s);
-	    if (wp->w_buffer->b_p_tw == 0)
+	    if (tw == 0)
 		goto skip;  // 'textwidth' not set, skip this item
-	    col += wp->w_buffer->b_p_tw;
+	    col += tw;
 	    if (col < 0)
 		goto skip;
 	}
@@ -7971,6 +7986,9 @@ skip:
 	    return e_invalid_argument;  // illegal trailing comma as in "set cc=80,"
     }
 
+    if (wp == NULL)
+	return NULL;  // only parse "cc"
+
     vim_free(wp->w_p_cc_cols);
     if (count == 0)
 	wp->w_p_cc_cols = NULL;