On 04/11/2010 04:33 PM, Bram Moolenaar wrote:
>
> I will try to include a few patches that have been pending for a while.
> I don't have much time available, thus I will only include things that
> take a few hours of my time. That basically means patches that are
> ready to be included.
>
Hi,
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
--
You received this message from the "vim_use" 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
Subscription settings: http://groups.google.com/group/vim_use/subscribe?hl=en
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