summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--runtime/doc/options.txt23
-rw-r--r--runtime/doc/syntax.txt2
-rw-r--r--runtime/doc/tags2
-rw-r--r--runtime/doc/todo.txt6
-rw-r--r--src/option.c137
-rw-r--r--src/option.h5
-rw-r--r--src/os_macosx.m69
-rw-r--r--src/proto/option.pro1
-rw-r--r--src/screen.c100
-rw-r--r--src/structs.h5
-rw-r--r--src/syntax.c4
-rw-r--r--src/vim.h3
-rw-r--r--src/window.c5
13 files changed, 257 insertions, 105 deletions
diff --git a/runtime/doc/options.txt b/runtime/doc/options.txt
index d8f4dfbaf1..f674154f61 100644
--- a/runtime/doc/options.txt
+++ b/runtime/doc/options.txt
@@ -2163,7 +2163,7 @@ A jump table for the options with a short description can be found at |Q_op|.
column. This option is useful for viewing the
differences between two versions of a file (see 'diff'); in diff mode,
inserted and deleted lines (though not characters within a line) are
- taken into account.
+ taken into account.
*'cursorcolumn'* *'cuc'* *'nocursorcolumn'* *'nocuc'*
@@ -4547,6 +4547,25 @@ A jump table for the options with a short description can be found at |Q_op|.
< This option cannot be set from a |modeline| or in the |sandbox|, for
security reasons.
+ *'colorcolumn'* *'cc'*
+'colorcolumn' 'cc' string (default "")
+ local to window
+ {not in Vi}
+ {not available when compiled without the |+syntax|
+ feature}
+ 'colorcolumn' is a comma separated list of screen columns that are
+ highlighted with ColorColumn |hl-ColorColumn|. Useful to align
+ text. Will make screen redrawing slower.
+ The screen column can be an absolute number, or a number preceded with
+ '+' or '-', which is added to or subtracted from 'textwidth'. >
+
+ :set cc=+1 " highlight column after 'textwidth'
+ :set cc=+1,+2,+3 " highlight three columns after 'textwidth'
+ :hi ColorColumn ctermbg=lightgrey guibg=lightgrey
+<
+ When 'textwidth' is zero then the items with '-' and '+' are not used.
+ A maximum of 256 columns are highlighted.
+
*'matchpairs'* *'mps'*
'matchpairs' 'mps' string (default "(:),{:},[:]")
local to buffer
@@ -6013,7 +6032,7 @@ A jump table for the options with a short description can be found at |Q_op|.
:set showbreak=>\
< Note the backslash to escape the trailing space. It's easier like
this: >
- :let &showbreak = '+++ '
+ :let &showbreak = '+++ '
< Only printable single-cell characters are allowed, excluding <Tab> and
comma (in a future version the comma might be used to separate the
part that is shown at the end and at the start of a line).
diff --git a/runtime/doc/syntax.txt b/runtime/doc/syntax.txt
index cd06f1683c..ebbe8915c4 100644
--- a/runtime/doc/syntax.txt
+++ b/runtime/doc/syntax.txt
@@ -4212,6 +4212,8 @@ These are the default highlighting groups. These groups are used by the
'highlight' option default. Note that the highlighting depends on the value
of 'background'. You can see the current settings with the ":highlight"
command.
+ *hl-ColorColumn*
+ColorColumn used for the columns set with 'colorcolumn'
*hl-Conceal*
Conceal placeholder characters substituted for concealed
text (see 'conceallevel')
diff --git a/runtime/doc/tags b/runtime/doc/tags
index c105b967a2..e72655dd35 100644
--- a/runtime/doc/tags
+++ b/runtime/doc/tags
@@ -101,6 +101,7 @@ $VIMRUNTIME starting.txt /*$VIMRUNTIME*
'buftype' options.txt /*'buftype'*
'casemap' options.txt /*'casemap'*
'cb' options.txt /*'cb'*
+'cc' options.txt /*'cc'*
'ccv' options.txt /*'ccv'*
'cd' options.txt /*'cd'*
'cdpath' options.txt /*'cdpath'*
@@ -126,6 +127,7 @@ $VIMRUNTIME starting.txt /*$VIMRUNTIME*
'cmp' options.txt /*'cmp'*
'cms' options.txt /*'cms'*
'co' options.txt /*'co'*
+'colorcolumn' options.txt /*'colorcolumn'*
'columns' options.txt /*'columns'*
'com' options.txt /*'com'*
'comments' options.txt /*'comments'*
diff --git a/runtime/doc/todo.txt b/runtime/doc/todo.txt
index b151eb78a9..5ff1e3b173 100644
--- a/runtime/doc/todo.txt
+++ b/runtime/doc/todo.txt
@@ -1098,12 +1098,8 @@ Vim 7.3:
- Conceal feature: no update when moving to another window. (Dominique Pelle,
2010 Jul 5) Vince will look into it.
Patches to possibly include:
-- Patch for vertical line at certain column position, 'guidecolumn' option.
- (Pankaj Garg, 2009 Apr 14, aka Lone, Apr 15)
- Update 2009 May 2, 'margincolumn'
+- 'colorcolumn': make it local to window.
Alternative patch. (2010 Feb 2, Gregor Uhlenheuer, update 2010 Jul 12)
- Fix by Lech Lorens, Apr 19
- When there are multiple columns it makes sense to call it 'guidecolumn'
- Another patch for Javascript indenting. (Hari Kumar, 2010 Jul 11)
Needs a few tests.
- Add different highlighting for a fold line depending on the fold level.
diff --git a/src/option.c b/src/option.c
index ac16d799c1..2dfb6d967c 100644
--- a/src/option.c
+++ b/src/option.c
@@ -232,6 +232,7 @@
#ifdef FEAT_SYN_HL
# define PV_CUC OPT_WIN(WV_CUC)
# define PV_CUL OPT_WIN(WV_CUL)
+# define PV_CC OPT_WIN(WV_CC)
#endif
#ifdef FEAT_STL_OPT
# define PV_STL OPT_BOTH(OPT_WIN(WV_STL))
@@ -466,7 +467,7 @@ struct vimoption
#if defined(FEAT_DIFF) || defined(FEAT_FOLDING) || defined(FEAT_SPELL) \
|| defined(FEAT_VERTSPLIT) || defined(FEAT_CLIPBOARD) \
|| defined(FEAT_INS_EXPAND) || defined(FEAT_SYN_HL) || defined(FEAT_CONCEAL)
-# define HIGHLIGHT_INIT "8:SpecialKey,@:NonText,d:Directory,e:ErrorMsg,i:IncSearch,l:Search,m:MoreMsg,M:ModeMsg,n:LineNr,r:Question,s:StatusLine,S:StatusLineNC,c:VertSplit,t:Title,v:Visual,V:VisualNOS,w:WarningMsg,W:WildMenu,f:Folded,F:FoldColumn,A:DiffAdd,C:DiffChange,D:DiffDelete,T:DiffText,>:SignColumn,-:Conceal,B:SpellBad,P:SpellCap,R:SpellRare,L:SpellLocal,+:Pmenu,=:PmenuSel,x:PmenuSbar,X:PmenuThumb,*:TabLine,#:TabLineSel,_:TabLineFill,!:CursorColumn,.:CursorLine"
+# define HIGHLIGHT_INIT "8:SpecialKey,@:NonText,d:Directory,e:ErrorMsg,i:IncSearch,l:Search,m:MoreMsg,M:ModeMsg,n:LineNr,r:Question,s:StatusLine,S:StatusLineNC,c:VertSplit,t:Title,v:Visual,V:VisualNOS,w:WarningMsg,W:WildMenu,f:Folded,F:FoldColumn,A:DiffAdd,C:DiffChange,D:DiffDelete,T:DiffText,>:SignColumn,-:Conceal,B:SpellBad,P:SpellCap,R:SpellRare,L:SpellLocal,+:Pmenu,=:PmenuSel,x:PmenuSbar,X:PmenuThumb,*:TabLine,#:TabLineSel,_:TabLineFill,!:CursorColumn,.:CursorLine,o:ColorColumn"
#else
# define HIGHLIGHT_INIT "8:SpecialKey,@:NonText,d:Directory,e:ErrorMsg,i:IncSearch,l:Search,m:MoreMsg,M:ModeMsg,n:LineNr,r:Question,s:StatusLine,S:StatusLineNC,t:Title,v:Visual,w:WarningMsg,W:WildMenu,>:SignColumn,*:TabLine,#:TabLineSel,_:TabLineFill"
#endif
@@ -774,6 +775,13 @@ static struct vimoption
(char_u *)NULL, PV_NONE,
#endif
{(char_u *)7L, (char_u *)0L} SCRIPTID_INIT},
+ {"colorcolumn", "cc", P_STRING|P_VI_DEF|P_COMMA|P_NODUP|P_RWIN,
+#ifdef FEAT_SYN_HL
+ (char_u *)VAR_WIN, PV_CC,
+#else
+ (char_u *)NULL, PV_NONE,
+#endif
+ {(char_u *)"", (char_u *)0L} SCRIPTID_INIT},
{"columns", "co", P_NUM|P_NODEFAULT|P_NO_MKRC|P_VI_DEF|P_RCLR,
(char_u *)&Columns, PV_NONE,
{(char_u *)80L, (char_u *)0L} SCRIPTID_INIT},
@@ -2526,7 +2534,7 @@ static struct vimoption
(char_u *)FALSE,
#endif
(char_u *)0L} SCRIPTID_INIT},
- {"textwidth", "tw", P_NUM|P_VI_DEF|P_VIM,
+ {"textwidth", "tw", P_NUM|P_VI_DEF|P_VIM|P_RBUF,
(char_u *)&p_tw, PV_TW,
{(char_u *)0L, (char_u *)0L} SCRIPTID_INIT},
{"thesaurus", "tsr", P_STRING|P_EXPAND|P_VI_DEF|P_COMMA|P_NODUP,
@@ -2975,6 +2983,9 @@ static void set_string_option_global __ARGS((int opt_idx, char_u **varp));
static void set_string_option __ARGS((int opt_idx, char_u *value, int opt_flags));
static char_u *did_set_string_option __ARGS((int opt_idx, char_u **varp, int new_value_alloced, char_u *oldval, char_u *errbuf, int opt_flags));
static char_u *set_chars_option __ARGS((char_u **varp));
+#ifdef FEAT_SYN_HL
+static int int_cmp __ARGS((const void *a, const void *b));
+#endif
#ifdef FEAT_CLIPBOARD
static char_u *check_clipboard_option __ARGS((void));
#endif
@@ -5638,6 +5649,12 @@ did_set_string_option(opt_idx, varp, new_value_alloced, oldval, errbuf,
}
}
+#ifdef FEAT_SYN_HL
+ /* 'colorcolumn' */
+ else if (varp == &curwin->w_p_cc)
+ errmsg = check_colorcolumn(curwin);
+#endif
+
#ifdef FEAT_MULTI_LANG
/* 'helplang' */
else if (varp == &p_hlg)
@@ -6911,6 +6928,85 @@ did_set_string_option(opt_idx, varp, new_value_alloced, oldval, errbuf,
return errmsg;
}
+#ifdef FEAT_SYN_HL
+/*
+ * Simple int comparison function for use with qsort()
+ */
+ static int
+int_cmp(a, b)
+ const void *a;
+ const void *b;
+{
+ return *(const int *)a - *(const int *)b;
+}
+
+/*
+ * Handle setting 'colorcolumn' or 'textwidth' in window "wp".
+ * Returns error message, NULL if it's OK.
+ */
+ char_u *
+check_colorcolumn(wp)
+ win_T *wp;
+{
+ char_u *s;
+ int col;
+ int count = 0;
+ int color_cols[256];
+ int i;
+ int j = 0;
+
+ for (s = wp->w_p_cc; *s != NUL && count < 255; ++s)
+ {
+ if (*s == '-' || *s == '+')
+ {
+ /* -N and +N: add to 'textwidth' */
+ col = (*s == '-') ? -1 : 1;
+ ++s;
+ if (!VIM_ISDIGIT(*s))
+ return e_invarg;
+ col = col * getdigits(&s);
+ if (wp->w_buffer->b_p_tw == 0)
+ continue; /* 'textwidth' not set, skip this item */
+ col += wp->w_buffer->b_p_tw;
+ if (col < 0)
+ continue;
+ }
+ else if (VIM_ISDIGIT(*s))
+ col = getdigits(&s);
+ else
+ return e_invarg;
+ color_cols[count++] = col - 1; /* 1-based to 0-based */
+
+ if (*s == NUL)
+ break;
+ if (*s != ',')
+ return e_invarg;
+ }
+
+ vim_free(wp->w_p_cc_cols);
+ if (count == 0)
+ wp->w_p_cc_cols = NULL;
+ else
+ {
+ wp->w_p_cc_cols = (int *)alloc((unsigned)sizeof(int) * (count + 1));
+ if (wp->w_p_cc_cols != NULL)
+ {
+ /* sort the columns for faster usage on screen redraw inside
+ * win_line() */
+ qsort(color_cols, count, sizeof(int), int_cmp);
+
+ for (i = 0; i < count; ++i)
+ /* skip duplicates */
+ if (j == 0 || wp->w_p_cc_cols[j - 1] != color_cols[i])
+ wp->w_p_cc_cols[j++] = color_cols[i];
+ wp->w_p_cc_cols[j] = -1; /* end marker */
+ }
+ }
+
+ return NULL; /* no error */
+}
+#endif
+
/*
* Handle setting 'listchars' or 'fillchars'.
* Returns error message, NULL if it's OK.
@@ -8179,6 +8275,28 @@ set_num_option(opt_idx, varp, value, errbuf, errbuflen, opt_flags)
}
#endif
+ else if (pp == &curbuf->b_p_tw)
+ {
+ if (curbuf->b_p_tw < 0)
+ {
+ errmsg = e_positive;
+ curbuf->b_p_tw = 0;
+ }
+#ifdef FEAT_SYN_HL
+# ifdef FEAT_WINDOWS
+ {
+ win_T *wp;
+ tabpage_T *tp;
+
+ FOR_ALL_TAB_WINDOWS(tp, wp)
+ check_colorcolumn(wp);
+ }
+# else
+ check_colorcolumn(curwin);
+# endif
+#endif
+ }
+
/*
* Check the bounds for numeric options here
*/
@@ -8251,11 +8369,6 @@ set_num_option(opt_idx, varp, value, errbuf, errbuflen, opt_flags)
errmsg = e_positive;
curbuf->b_p_ts = 8;
}
- if (curbuf->b_p_tw < 0)
- {
- errmsg = e_positive;
- curbuf->b_p_tw = 0;
- }
if (p_tm < 0)
{
errmsg = e_positive;
@@ -9341,6 +9454,7 @@ get_varp(p)
#ifdef FEAT_SYN_HL
case PV_CUC: return (char_u *)&(curwin->w_p_cuc);
case PV_CUL: return (char_u *)&(curwin->w_p_cul);
+ case PV_CC: return (char_u *)&(curwin->w_p_cc);
#endif
#ifdef FEAT_DIFF
case PV_DIFF: return (char_u *)&(curwin->w_p_diff);
@@ -9582,6 +9696,7 @@ copy_winopt(from, to)
#ifdef FEAT_SYN_HL
to->wo_cuc = from->wo_cuc;
to->wo_cul = from->wo_cul;
+ to->wo_cc = vim_strsave(from->wo_cc);
#endif
#ifdef FEAT_DIFF
to->wo_diff = from->wo_diff;
@@ -9636,6 +9751,9 @@ check_winopt(wop)
#ifdef FEAT_STL_OPT
check_string_option(&wop->wo_stl);
#endif
+#ifdef FEAT_SYN_HL
+ check_string_option(&wop->wo_cc);
+#endif
}
/*
@@ -9660,6 +9778,9 @@ clear_winopt(wop)
#ifdef FEAT_STL_OPT
clear_string_option(&wop->wo_stl);
#endif
+#ifdef FEAT_SYN_HL
+ clear_string_option(&wop->wo_cc);
+#endif
}
/*
@@ -9682,7 +9803,7 @@ buf_copy_options(buf, flags)
int did_isk = FALSE;
/*
- * Don't do anything of the buffer is invalid.
+ * Don't do anything if the buffer is invalid.
*/
if (buf == NULL || !buf_valid(buf))
return;
diff --git a/src/option.h b/src/option.h
index 08f1f4baa0..1693622dd7 100644
--- a/src/option.h
+++ b/src/option.h
@@ -589,6 +589,10 @@ EXTERN int p_magic; /* 'magic' */
EXTERN char_u *p_mef; /* 'makeef' */
EXTERN char_u *p_mp; /* 'makeprg' */
#endif
+#ifdef FEAT_SYN_HL
+EXTERN char_u *p_cc; /* 'colorcolumn' */
+EXTERN int p_cc_cols[256]; /* array for 'colorcolumn' columns */
+#endif
EXTERN long p_mat; /* 'matchtime' */
#ifdef FEAT_MBYTE
EXTERN long p_mco; /* 'maxcombine' */
@@ -1069,6 +1073,7 @@ enum
#ifdef FEAT_SYN_HL
, WV_CUC
, WV_CUL
+ , WV_CC
#endif
#ifdef FEAT_STL_OPT
, WV_STL
diff --git a/src/os_macosx.m b/src/os_macosx.m
index dcde55174e..619e86d691 100644
--- a/src/os_macosx.m
+++ b/src/os_macosx.m
@@ -544,75 +544,6 @@ iconv_errno()
}
#endif /* MACOS_X_ICONVEMU */
-#ifdef USE_MCH_GETTEXT
-
-#define GETTEXT_BUFNUM 64
-#define GETTEXT_BUFSIZE 256
-
- char *
-mch_gettext(const char *msgid)
-{
- static char buf[GETTEXT_BUFNUM][GETTEXT_BUFSIZE];
- static int bufnum = 0;
- const char *msg = NULL;
- CFStringRef strkey = NULL, strmsg = NULL;
- CFStringEncoding enc;
-
- if (!msgid)
- goto MCH_GETTEXT_FINISH;
- enc = CFStringGetSystemEncoding();
- TRACE("mch_gettext(%s)\n", msgid);
-
- strkey = CFStringCreateWithCString(NULL, msgid, enc);
- if (!strkey)
- {
- TRACE(" Can't create a CFString for msgid.\n");
- goto MCH_GETTEXT_FINISH;
- }
-
- strmsg = CFCopyLocalizedString(strkey, NULL);
- if (!strmsg)
- {
- TRACE(" No localized strings for msgid.\n");
- goto MCH_GETTEXT_FINISH;
- }
-
- msg = CFStringGetCStringPtr(strmsg, enc);
- if (!msg)
- {
- /* This is as backup when CFStringGetCStringPtr was failed */
- CFStringGetCString(strmsg, buf[bufnum], GETTEXT_BUFSIZE, enc);
- msg = buf[bufnum];
- if (++bufnum >= GETTEXT_BUFNUM)
- bufnum = 0;
- }
- TRACE(" Localized to: %s\n", msg);
-
-MCH_GETTEXT_FINISH:
- if (strkey)
- CFRelease(strkey);
- if (strmsg)
- CFRelease(strmsg);
- return (char *)(msg ? msg : msgid);
-}
-
- char *
-mch_bindtextdomain(const char *domain, const char *dirname)
-{
- TRACE("mch_bindtextdomain(%s, %s)\n", domain, dirname);
- return (char*)dirname;
-}
-
- char *
-mch_textdomain(const char *domain)
-{
- TRACE("mch_textdomain(%s)\n", domain);
- return (char*)domain;
-}
-#endif
-
-
-
#ifdef FEAT_CLIPBOARD
void
diff --git a/src/proto/option.pro b/src/proto/option.pro
index 9c58c3e9dc..d14c89b285 100644
--- a/src/proto/option.pro
+++ b/src/proto/option.pro
@@ -19,6 +19,7 @@ void clear_string_option __ARGS((char_u **pp));
void set_term_option_alloced __ARGS((char_u **p));
int was_set_insecurely __ARGS((char_u *opt, int opt_flags));
void set_string_option_direct __ARGS((char_u *name, int opt_idx, char_u *val, int opt_flags, int set_sid));
+char_u *check_colorcolumn __ARGS((win_T *wp));
char_u *check_stl_option __ARGS((char_u *s));
int get_option_value __ARGS((char_u *name, long *numval, char_u **stringval, int opt_flags));
void set_option_value __ARGS((char_u *name, long number, char_u *string, int opt_flags));
diff --git a/src/screen.c b/src/screen.c
index 3df7f665d3..0a2b9a941f 100644
--- a/src/screen.c
+++ b/src/screen.c
@@ -2126,6 +2126,23 @@ win_draw_end(wp, c1, c2, row, endrow, hl)
set_empty_rows(wp, row);
}
+#ifdef FEAT_SYN_HL
+static int advance_color_col __ARGS((int vcol, int **color_cols));
+
+/*
+ * Advance **color_cols and return TRUE when there are columns to draw.
+ */
+ static int
+advance_color_col(vcol, color_cols)
+ int vcol;
+ int **color_cols;
+{
+ while (**color_cols >= 0 && vcol > **color_cols)
+ ++*color_cols;
+ return (**color_cols >= 0);
+}
+#endif
+
#ifdef FEAT_FOLDING
/*
* Display one folded line.
@@ -2666,6 +2683,8 @@ win_line(wp, lnum, startrow, endrow, nochange)
int has_syntax = FALSE; /* this buffer has syntax highl. */
int save_did_emsg;
int eol_hl_off = 0; /* 1 if highlighted char after EOL */
+ int draw_color_col = FALSE; /* highlight colorcolumn */
+ int *color_cols = NULL; /* pointer to according columns array */
#endif
#ifdef FEAT_SPELL
int has_spell = FALSE; /* this buffer has spell checking */
@@ -2795,6 +2814,11 @@ win_line(wp, lnum, startrow, endrow, nochange)
extra_check = TRUE;
}
}
+
+ /* Check for columns to display for 'colorcolumn'. */
+ color_cols = wp->w_p_cc_cols;
+ if (color_cols != NULL)
+ draw_color_col = advance_color_col(vcol, &color_cols);
#endif
#ifdef FEAT_SPELL
@@ -3073,6 +3097,7 @@ win_line(wp, lnum, startrow, endrow, nochange)
#if defined(FEAT_SYN_HL) || defined(FEAT_VIRTUALEDIT) || defined(FEAT_VISUAL)
/* When:
* - 'cuc' is set, or
+ * - 'colorcolumn' is set, or
* - 'virtualedit' is set, or
* - the visual mode is active,
* the end of the line may be before the start of the displayed part.
@@ -3080,6 +3105,7 @@ win_line(wp, lnum, startrow, endrow, nochange)
if (vcol < v && (
# ifdef FEAT_SYN_HL
wp->w_p_cuc
+ || draw_color_col
# if defined(FEAT_VIRTUALEDIT) || defined(FEAT_VISUAL)
||
# endif
@@ -4641,25 +4667,41 @@ win_line(wp, lnum, startrow, endrow, nochange)
--vcol;
}
- /* Highlight 'cursorcolumn' past end of the line. */
+ /* Highlight 'cursorcolumn' & 'colorcolumn' past end of the line. */
if (wp->w_p_wrap)
v = wp->w_skipcol;
else
v = wp->w_leftcol;
+
/* check if line ends before left margin */
if (vcol < v + col - win_col_off(wp))
-
vcol = v + col - win_col_off(wp);
- if (wp->w_p_cuc
- && (int)wp->w_virtcol >= vcol - eol_hl_off
- && (int)wp->w_virtcol < W_WIDTH(wp) * (row - startrow + 1)
+
+ if (draw_color_col)
+ draw_color_col = advance_color_col(vcol, &color_cols);
+
+ if (((wp->w_p_cuc
+ && (int)wp->w_virtcol >= vcol - eol_hl_off
+ && (int)wp->w_virtcol < W_WIDTH(wp) * (row - startrow + 1)
+ v
- && lnum != wp->w_cursor.lnum
+ && lnum != wp->w_cursor.lnum)
+ || draw_color_col)
# ifdef FEAT_RIGHTLEFT
&& !wp->w_p_rl
# endif
)
{
+ int rightmost_vcol = 0;
+ int i;
+
+ if (wp->w_p_cuc)
+ rightmost_vcol = wp->w_virtcol;
+ if (draw_color_col)
+ /* determine rightmost colorcolumn to possibly draw */
+ for (i = 0; color_cols[i] >= 0; ++i)
+ if (rightmost_vcol < color_cols[i])
+ rightmost_vcol = color_cols[i];
+
while (col < W_WIDTH(wp))
{
ScreenLines[off] = ' ';
@@ -4668,12 +4710,19 @@ win_line(wp, lnum, startrow, endrow, nochange)
ScreenLinesUC[off] = 0;
#endif
++col;
- if (vcol == (long)wp->w_virtcol)
- {
- ScreenAttrs[off] = hl_attr(HLF_CUC);
+ if (wp->w_p_cuc && vcol == (long)wp->w_virtcol)
+ ScreenAttrs[off++] = hl_attr(HLF_CUC);
+ else if (draw_color_col && vcol == *color_cols)
+ ScreenAttrs[off++] = hl_attr(HLF_MC);
+ else
+ ScreenAttrs[off++] = 0;
+
+ if (vcol >= rightmost_vcol)
break;
- }
- ScreenAttrs[off++] = 0;
+
+ if (draw_color_col)
+ draw_color_col = advance_color_col(vcol, &color_cols);
+
++vcol;
}
}
@@ -4737,18 +4786,29 @@ win_line(wp, lnum, startrow, endrow, nochange)
}
#ifdef FEAT_SYN_HL
+ /* advance to the next 'colorcolumn' */
+ if (draw_color_col)
+ draw_color_col = advance_color_col(vcol, &color_cols);
+
/* Highlight the cursor column if 'cursorcolumn' is set. But don't
- * highlight the cursor position itself. */
- if (wp->w_p_cuc && vcol == (long)wp->w_virtcol
- && lnum != wp->w_cursor.lnum
- && draw_state == WL_LINE
- && !lnum_in_visual_area)
+ * highlight the cursor position itself.
+ * Also highlight the 'colorcolumn' if it is different than
+ * 'cursorcolumn' */
+ vcol_save_attr = -1;
+ if (draw_state == WL_LINE && !lnum_in_visual_area)
{
- vcol_save_attr = char_attr;
- char_attr = hl_combine_attr(char_attr, hl_attr(HLF_CUC));
+ if (wp->w_p_cuc && vcol == (long)wp->w_virtcol
+ && lnum != wp->w_cursor.lnum)
+ {
+ vcol_save_attr = char_attr;
+ char_attr = hl_combine_attr(char_attr, hl_attr(HLF_CUC));
+ }
+ else if (draw_color_col && vcol == *color_cols)
+ {
+ vcol_save_attr = char_attr;
+ char_attr = hl_combine_attr(char_attr, hl_attr(HLF_MC));
+ }
}
- else
- vcol_save_attr = -1;
#endif
/*
diff --git a/src/structs.h b/src/structs.h
index a95e1ba38f..c0e31c0d75 100644
--- a/src/structs.h
+++ b/src/structs.h
@@ -202,6 +202,8 @@ typedef struct
# define w_p_cuc w_onebuf_opt.wo_cuc /* 'cursorcolumn' */
int wo_cul;
# define w_p_cul w_onebuf_opt.wo_cul /* 'cursorline' */
+ char_u *wo_cc;
+# define w_p_cc w_onebuf_opt.wo_cc /* 'colorcolumn' */
#endif
#ifdef FEAT_STL_OPT
char_u *wo_stl;
@@ -2010,6 +2012,9 @@ struct window_S
long_u w_p_fde_flags; /* flags for 'foldexpr' */
long_u w_p_fdt_flags; /* flags for 'foldtext' */
#endif
+#ifdef FEAT_SYN_HL
+ int *w_p_cc_cols; /* array of columns to highlight or NULL */
+#endif
/* transform a pointer to a "onebuf" option into a "allbuf" option */
#define GLOBAL_WO(p) ((char *)p + sizeof(winopt_T))
diff --git a/src/syntax.c b/src/syntax.c
index 3278810a4c..0e113f0fd3 100644
--- a/src/syntax.c
+++ b/src/syntax.c
@@ -6531,6 +6531,8 @@ static char *(highlight_init_light[]) =
"CursorColumn term=reverse ctermbg=LightGrey guibg=Grey90"),
CENT("CursorLine term=underline cterm=underline",
"CursorLine term=underline cterm=underline guibg=Grey90"),
+ CENT("ColorColumn term=reverse ctermbg=LightRed",
+ "ColorColumn term=reverse ctermbg=LightRed guibg=LightRed"),
#endif
#ifdef FEAT_CONCEAL
CENT("Conceal ctermbg=DarkGrey ctermfg=LightGrey",
@@ -6615,6 +6617,8 @@ static char *(highlight_init_dark[]) =
"CursorColumn term=reverse ctermbg=DarkGrey guibg=Grey40"),
CENT("CursorLine term=underline cterm=underline",
"CursorLine term=underline cterm=underline guibg=Grey40"),
+ CENT("ColorColumn term=reverse ctermbg=DarkRed",
+ "ColorColumn term=reverse ctermbg=DarkRed guibg=DarkRed"),
#endif
#ifdef FEAT_AUTOCMD
CENT("MatchParen term=reverse ctermbg=DarkCyan",
diff --git a/src/vim.h b/src/vim.h
index e7d74ed8f6..bbddbbfea0 100644
--- a/src/vim.h
+++ b/src/vim.h
@@ -1334,6 +1334,7 @@ typedef enum
, HLF_TPF /* tabpage line filler */
, HLF_CUC /* 'cursurcolumn' */
, HLF_CUL /* 'cursurline' */
+ , HLF_MC /* 'colorcolumn' */
, HLF_COUNT /* MUST be the last one */
} hlf_T;
@@ -1343,7 +1344,7 @@ typedef enum
'n', 'r', 's', 'S', 'c', 't', 'v', 'V', 'w', 'W', \
'f', 'F', 'A', 'C', 'D', 'T', '-', '>', \
'B', 'P', 'R', 'L', \
- '+', '=', 'x', 'X', '*', '#', '_', '!', '.'}
+ '+', '=', 'x', 'X', '*', '#', '_', '!', '.', 'o'}
/*
* Boolean constants
diff --git a/src/window.c b/src/window.c
index c2590e5f91..2c780dfb5c 100644
--- a/src/window.c
+++ b/src/window.c
@@ -1225,6 +1225,10 @@ win_init(newp, oldp, flags)
# endif
win_init_some(newp, oldp);
+
+# ifdef FEAT_SYN_HL
+ check_colorcolumn(newp);
+# endif
}
/*
@@ -4413,6 +4417,7 @@ win_free(wp, tp)
#ifdef FEAT_SYN_HL
reset_synblock(wp); /* free independent synblock */
+ vim_free(wp->w_p_cc_cols);
#endif
#ifdef FEAT_AUTOCMD