mirror of
https://github.com/vim/vim.git
synced 2025-07-26 11:04:33 -04:00
Added 'colorcolumn' option. Partly by Gregor Uhlenheuer.
This commit is contained in:
parent
b28ebbca84
commit
1a38442dbc
@ -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
|
||||
|
@ -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')
|
||||
|
@ -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'*
|
||||
|
@ -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.
|
||||
|
137
src/option.c
137
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;
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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));
|
||||
|
100
src/screen.c
100
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
|
||||
|
||||
/*
|
||||
|
@ -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))
|
||||
|
@ -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",
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user