diff -r 24100651daa9 -r 335a1bd18eed runtime/doc/options.txt --- a/runtime/doc/options.txt Tue Mar 23 18:22:46 2010 +0100 +++ b/runtime/doc/options.txt Wed Apr 14 17:10:24 2010 +0200 @@ -4475,6 +4475,21 @@ < This option cannot be set from a |modeline| or in the |sandbox|, for security reasons. + *'margincolumn'* *'mc'* +'margincolumn' 'mc' number (default 0) + local to window + {not in Vi} + {not available when compiled without the |+syntax| + feature} + Highlight a particular screen column with MarginColumn + |hl-MarginColumn|. Useful to align text. Will make screen redrawing + slower. + If 'margincolumn' < 0 then 'margincolumn' is set equal to 'textwidth'. + If you only want the highlighting in the current window you can use + these autocommands: > + au WinLeave * set mc=0 + au WinEnter * set mc=81 + *'matchpairs'* *'mps'* 'matchpairs' 'mps' string (default "(:),{:},[:]") local to buffer diff -r 24100651daa9 -r 335a1bd18eed src/option.c --- a/src/option.c Tue Mar 23 18:22:46 2010 +0100 +++ b/src/option.c Wed Apr 14 17:10:24 2010 +0200 @@ -227,6 +227,7 @@ #ifdef FEAT_SYN_HL # define PV_CUC OPT_WIN(WV_CUC) # define PV_CUL OPT_WIN(WV_CUL) +# define PV_MC OPT_WIN(WV_MC) #endif #ifdef FEAT_STL_OPT # define PV_STL OPT_BOTH(OPT_WIN(WV_STL)) @@ -450,7 +451,7 @@ #if defined(FEAT_DIFF) || defined(FEAT_FOLDING) || defined(FEAT_SPELL) \ || defined(FEAT_VERTSPLIT) || defined(FEAT_CLIPBOARD) \ || defined(FEAT_INS_EXPAND) || defined(FEAT_SYN_HL) -# 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,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,B:SpellBad,P:SpellCap,R:SpellRare,L:SpellLocal,+:Pmenu,=:PmenuSel,x:PmenuSbar,X:PmenuThumb,*:TabLine,#:TabLineSel,_:TabLineFill,!:CursorColumn,.:CursorLine,g:MarginColumn" #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 @@ -1677,6 +1678,13 @@ {(char_u *)NULL, (char_u *)0L} #endif SCRIPTID_INIT}, + {"margincolumn", "mc", P_NUM|P_VI_DEF|P_RWIN, +#ifdef FEAT_SYN_HL + (char_u *)VAR_WIN, PV_MC, +#else + (char_u *)NULL, PV_NONE, +#endif + {(char_u *)0L, (char_u *)0L} SCRIPTID_INIT}, {"matchpairs", "mps", P_STRING|P_ALLOCED|P_VI_DEF|P_COMMA|P_NODUP, (char_u *)&p_mps, PV_MPS, {(char_u *)"(:),{:},[:]", (char_u *)0L} @@ -2485,7 +2493,7 @@ (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_RWIN, (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, @@ -9190,6 +9198,7 @@ #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_MC: return (char_u *)&(curwin->w_p_mc); #endif #ifdef FEAT_DIFF case PV_DIFF: return (char_u *)&(curwin->w_p_diff); @@ -9417,6 +9426,7 @@ #ifdef FEAT_SYN_HL to->wo_cuc = from->wo_cuc; to->wo_cul = from->wo_cul; + to->wo_mc = from->wo_mc; #endif #ifdef FEAT_DIFF to->wo_diff = from->wo_diff; diff -r 24100651daa9 -r 335a1bd18eed src/option.h --- a/src/option.h Tue Mar 23 18:22:46 2010 +0100 +++ b/src/option.h Wed Apr 14 17:10:24 2010 +0200 @@ -1059,6 +1059,7 @@ #ifdef FEAT_SYN_HL , WV_CUC , WV_CUL + , WV_MC #endif #ifdef FEAT_STL_OPT , WV_STL diff -r 24100651daa9 -r 335a1bd18eed src/screen.c --- a/src/screen.c Tue Mar 23 18:22:46 2010 +0100 +++ b/src/screen.c Wed Apr 14 17:10:24 2010 +0200 @@ -2622,6 +2622,9 @@ 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 margin_vcol = 0; /* ('margincolumn'-1) (= 0 based col)*/ + int draw_margin_col = 0; /* Only highlight margincolumn if 1*/ + int rightmost_vcol; /* rightmost vcol that needs to draw */ #endif #ifdef FEAT_SPELL int has_spell = FALSE; /* this buffer has spell checking */ @@ -4497,6 +4500,23 @@ if (c == NUL) { #ifdef FEAT_SYN_HL + if (wp->w_p_mc > 0) + { + margin_vcol = wp->w_p_mc - 1; + draw_margin_col = 1; + } + else if (wp->w_p_mc < 0 + && curbuf->b_p_tw > 0) + { + margin_vcol = curbuf->b_p_tw; + draw_margin_col = 1; + } + else + { + margin_vcol = -1; + draw_margin_col = 0; + } + if (eol_hl_off > 0 && vcol - eol_hl_off == (long)wp->w_virtcol && lnum == wp->w_cursor.lnum) { @@ -4506,25 +4526,33 @@ --vcol; } - /* Highlight 'cursorcolumn' past end of the line. */ + /* Highlight 'cursorcolumn' & 'margincolumn' 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 + + 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_margin_col + && margin_vcol >= vcol - eol_hl_off + && margin_vcol < W_WIDTH(wp) * (row - startrow + 1) + + v)) # ifdef FEAT_RIGHTLEFT && !wp->w_p_rl # endif ) { + rightmost_vcol = (margin_vcol > (long)wp->w_virtcol) ? + margin_vcol : wp->w_virtcol; + while (col < W_WIDTH(wp)) { ScreenLines[off] = ' '; @@ -4533,12 +4561,22 @@ ScreenLinesUC[off] = 0; #endif ++col; - if (vcol == (long)wp->w_virtcol) + if (wp->w_p_cuc && vcol == (long)wp->w_virtcol) { - ScreenAttrs[off] = hl_attr(HLF_CUC); + ScreenAttrs[off++] = hl_attr(HLF_CUC); + } + else if (draw_margin_col && vcol == margin_vcol) + { + ScreenAttrs[off++] = hl_attr(HLF_MC); + } + else + { + ScreenAttrs[off++] = 0; + } + + if (vcol >= rightmost_vcol) break; - } - ScreenAttrs[off++] = 0; + ++vcol; } } @@ -4596,8 +4634,27 @@ } #ifdef FEAT_SYN_HL + if (wp->w_p_mc > 0) + { + margin_vcol = wp->w_p_mc - 1; + draw_margin_col = 1; + } + else if (wp->w_p_mc < 0 + && curbuf->b_p_tw > 0) + { + margin_vcol = curbuf->b_p_tw; + draw_margin_col = 1; + } + else + { + draw_margin_col = 0; + } + + vcol_save_attr = -1; /* Highlight the cursor column if 'cursorcolumn' is set. But don't - * highlight the cursor position itself. */ + * highlight the cursor position itself. + * Also highlight the 'margincolumn' if it is different than + * 'cursorcolumn' */ if (wp->w_p_cuc && vcol == (long)wp->w_virtcol && lnum != wp->w_cursor.lnum && draw_state == WL_LINE @@ -4606,8 +4663,13 @@ vcol_save_attr = char_attr; char_attr = hl_combine_attr(char_attr, hl_attr(HLF_CUC)); } - else - vcol_save_attr = -1; + else if (draw_margin_col && vcol == margin_vcol + && draw_state == WL_LINE + && !lnum_in_visual_area) + { + vcol_save_attr = char_attr; + char_attr = hl_combine_attr(char_attr, hl_attr(HLF_MC)); + } #endif /* diff -r 24100651daa9 -r 335a1bd18eed src/structs.h --- a/src/structs.h Tue Mar 23 18:22:46 2010 +0100 +++ b/src/structs.h Wed Apr 14 17:10:24 2010 +0200 @@ -200,6 +200,8 @@ # define w_p_cuc w_onebuf_opt.wo_cuc /* 'cursorcolumn' */ int wo_cul; # define w_p_cul w_onebuf_opt.wo_cul /* 'cursorline' */ + long wo_mc; +# define w_p_mc w_onebuf_opt.wo_mc /* 'margincolumn' */ #endif #ifdef FEAT_STL_OPT char_u *wo_stl; diff -r 24100651daa9 -r 335a1bd18eed src/syntax.c --- a/src/syntax.c Tue Mar 23 18:22:46 2010 +0100 +++ b/src/syntax.c Wed Apr 14 17:10:24 2010 +0200 @@ -6315,6 +6315,8 @@ "CursorColumn term=reverse ctermbg=LightGrey guibg=Grey90"), CENT("CursorLine term=underline cterm=underline", "CursorLine term=underline cterm=underline guibg=Grey90"), + CENT("MarginColumn term=reverse ctermbg=Red", + "MarginColumn term=reverse ctermbg=Red guibg=Red"), #endif #ifdef FEAT_AUTOCMD CENT("MatchParen term=reverse ctermbg=Cyan", @@ -6395,6 +6397,8 @@ "CursorColumn term=reverse ctermbg=DarkGrey guibg=Grey40"), CENT("CursorLine term=underline cterm=underline", "CursorLine term=underline cterm=underline guibg=Grey40"), + CENT("MarginColumn term=reverse ctermbg=DarkRed", + "MarginColumn term=reverse ctermbg=DarkRed guibg=DarkRed"), #endif #ifdef FEAT_AUTOCMD CENT("MatchParen term=reverse ctermbg=DarkCyan", diff -r 24100651daa9 -r 335a1bd18eed src/vim.h --- a/src/vim.h Tue Mar 23 18:22:46 2010 +0100 +++ b/src/vim.h Wed Apr 14 17:10:24 2010 +0200 @@ -1276,6 +1276,7 @@ , HLF_TPF /* tabpage line filler */ , HLF_CUC /* 'cursurcolumn' */ , HLF_CUL /* 'cursurline' */ + , HLF_MC /* 'margincolumn' */ , HLF_COUNT /* MUST be the last one */ } hlf_T; @@ -1285,7 +1286,7 @@ 'n', 'r', 's', 'S', 'c', 't', 'v', 'V', 'w', 'W', \ 'f', 'F', 'A', 'C', 'D', 'T', '>', \ 'B', 'P', 'R', 'L', \ - '+', '=', 'x', 'X', '*', '#', '_', '!', '.'} + '+', '=', 'x', 'X', '*', '#', '_', '!', '.', 'g'} /* * Boolean constants