On 19-Apr-2010 Lech Lorens <[email protected]> wrote:
> On 18-Apr-2010 Gregor Uhlenheuer <[email protected]> wrote:
> >
> > a few months ago I posted an updated patch for the margincolumn
> > feature that actually allows you to highlight a specified column (i.e.
> > to show the current buffer's textwidth). Since then I kept updating it
> > and use it without any problems.
> >
> > The patch for vim-7.2.411 is attached.
> >
> > Cheers,
> > Gregor
>
> I like the feature very much. However, I used the version of the patch
> which called it 'guidecolumn'. I can remember an argument that
> 'guidecolumn' is not a good name because it would be confusing to get
> the option when trying to complete ":help gui". But in the same manner
> isn't it confusing that ":help win" completes both the functions for
> window interaction and features related to the Windows OS?
>
> I prefer 'guidecolumn' to 'margincolumn' and feel that the former name
> better reflects what the option is about since other editors allegedly
> call it guide lines. Try searching the web for images of "Visual Studio
> margin line" (no hits in the first 40 results) vs "Visual Studio guide
> line" (I got 6 hits among the first 8 images; don't feel like checking
> the first 40 results).
By the way, the patch suffers from the same problem as the problems
fixed in the patch sent in message 20091031234444.ga5...@neo (
http://groups.google.com/group/vim_dev/browse_frm/thread/e4ae0ece884bf356/b669f55218f127fb?q=#b669f55218f127fb
).
I attached an updated patch for 'margincolumn' with a tiny fix.
--
Cheers,
Lech
--
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php
diff --git a/runtime/doc/options.txt b/runtime/doc/options.txt
index e178613..1367ef1 100644
--- a/runtime/doc/options.txt
+++ b/runtime/doc/options.txt
@@ -4475,6 +4475,21 @@ 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.
+ *'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 --git a/src/option.c b/src/option.c
index ba17c11..f9db0de 100644
--- a/src/option.c
+++ b/src/option.c
@@ -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 @@ 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)
-# 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 @@ static struct vimoption
{(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 @@ 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_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 @@ 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_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 @@ copy_winopt(from, to)
#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 --git a/src/option.h b/src/option.h
index cfa7692..2dd3dc0 100644
--- a/src/option.h
+++ b/src/option.h
@@ -1059,6 +1059,7 @@ enum
#ifdef FEAT_SYN_HL
, WV_CUC
, WV_CUL
+ , WV_MC
#endif
#ifdef FEAT_STL_OPT
, WV_STL
diff --git a/src/screen.c b/src/screen.c
index 7f929ac..838da7b 100644
--- a/src/screen.c
+++ b/src/screen.c
@@ -2622,6 +2622,9 @@ 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 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 */
@@ -3028,6 +3031,7 @@ win_line(wp, lnum, startrow, endrow, nochange)
if (vcol < v && (
# ifdef FEAT_SYN_HL
wp->w_p_cuc
+ || wp->w_p_mc
# if defined(FEAT_VIRTUALEDIT) || defined(FEAT_VISUAL)
||
# endif
@@ -4497,6 +4501,23 @@ win_line(wp, lnum, startrow, endrow, nochange)
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 +4527,33 @@ win_line(wp, lnum, startrow, endrow, nochange)
--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 +4562,22 @@ win_line(wp, lnum, startrow, endrow, nochange)
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);
- break;
+ ScreenAttrs[off++] = hl_attr(HLF_CUC);
+ }
+ else if (draw_margin_col && vcol == margin_vcol)
+ {
+ ScreenAttrs[off++] = hl_attr(HLF_MC);
+ }
+ else
+ {
+ ScreenAttrs[off++] = 0;
}
- ScreenAttrs[off++] = 0;
+
+ if (vcol >= rightmost_vcol)
+ break;
+
++vcol;
}
}
@@ -4596,8 +4635,27 @@ win_line(wp, lnum, startrow, endrow, nochange)
}
#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 +4664,13 @@ win_line(wp, lnum, startrow, endrow, nochange)
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 --git a/src/structs.h b/src/structs.h
index 99afecf..0494a61 100644
--- a/src/structs.h
+++ b/src/structs.h
@@ -200,6 +200,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' */
+ long wo_mc;
+# define w_p_mc w_onebuf_opt.wo_mc /* 'margincolumn' */
#endif
#ifdef FEAT_STL_OPT
char_u *wo_stl;
diff --git a/src/syntax.c b/src/syntax.c
index 9a24d43..f2b8e51 100644
--- a/src/syntax.c
+++ b/src/syntax.c
@@ -6315,6 +6315,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("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 @@ 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("MarginColumn term=reverse ctermbg=DarkRed",
+ "MarginColumn 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 9a36b9b..613d717 100644
--- a/src/vim.h
+++ b/src/vim.h
@@ -1276,6 +1276,7 @@ typedef enum
, 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 @@ 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', '*', '#', '_', '!', '.', 'g'}
/*
* Boolean constants