Hi,
a few months ago a guidecolumn/margincolumn patch was discussed on the
vim_dev mailing list which caught my interest. Sadly I wasn't
subscribed to the list at that time and I discovered that nice
patch only a few days ago. Now I have tried to apply that patch to the
latest vim source code (7.2.351) available via the mercurial repo.
So far I didn't got it to work properly but I just want to share my
current state - maybe there's someone (or even the original author of
the patch) who is interested in this margincolumn feature too. Probaby
I just need some vim-source-experienced eyes that discover my mistake(s).
That's what I get when I start vim -u NONE -U NONE and do :set mc=20
Program received signal SIGSEGV, Segmentation fault.
0x000000000053580d in showruler (always=0) at screen.c:9586
9586 if ((*p_stl != NUL || *curwin->w_p_stl != NUL) &&
curwin->w_status_height)
(gdb) bt
#0 0x000000000053580d in showruler (always=0) at screen.c:9586
#1 0x00000000004a52a9 in main_loop (cmdwin=0, noexmode=0) at
main.c:1160
#2 0x00000000004a4e85 in main (argc=6, argv=0x7fffffffe058) at
main.c:955
It crashes when dereferencing a NULL pointer (*curwin->w_p_stl) where
w_p_stl is a shortcut for w_onebuf_opt.wo_stl (statusline option I
think). I see no connection between the margincolumn code and the
statusline.
I am interested in any input.
The hg diff to vim-7.2.351 is attached
Best regards,
Gregor Uhlenheuer
diff -r 2bd96108392e runtime/doc/options.txt
--- a/runtime/doc/options.txt Thu Jan 28 22:58:16 2010 +0100
+++ b/runtime/doc/options.txt Mon Feb 01 18:21:01 2010 +0100
@@ -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 2bd96108392e src/option.c
--- a/src/option.c Thu Jan 28 22:58:16 2010 +0100
+++ b/src/option.c Mon Feb 01 18:21:01 2010 +0100
@@ -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,
@@ -9182,6 +9190,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);
@@ -9409,6 +9418,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 2bd96108392e src/option.h
--- a/src/option.h Thu Jan 28 22:58:16 2010 +0100
+++ b/src/option.h Mon Feb 01 18:21:01 2010 +0100
@@ -1059,6 +1059,7 @@
#ifdef FEAT_SYN_HL
, WV_CUC
, WV_CUL
+ , WV_MC
#endif
#ifdef FEAT_STL_OPT
, WV_STL
diff -r 2bd96108392e src/screen.c
--- a/src/screen.c Thu Jan 28 22:58:16 2010 +0100
+++ b/src/screen.c Mon Feb 01 18:21:01 2010 +0100
@@ -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 2bd96108392e src/structs.h
--- a/src/structs.h Thu Jan 28 22:58:16 2010 +0100
+++ b/src/structs.h Mon Feb 01 18:21:01 2010 +0100
@@ -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' */
+ int wo_mc;
+# define w_p_mc w_onebuf_opt.wo_mc /* 'margincolumn' */
#endif
#ifdef FEAT_STL_OPT
char_u *wo_stl;
diff -r 2bd96108392e src/syntax.c
--- a/src/syntax.c Thu Jan 28 22:58:16 2010 +0100
+++ b/src/syntax.c Mon Feb 01 18:21:01 2010 +0100
@@ -6311,6 +6311,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",
@@ -6391,6 +6393,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 2bd96108392e src/vim.h
--- a/src/vim.h Thu Jan 28 22:58:16 2010 +0100
+++ b/src/vim.h Mon Feb 01 18:21:01 2010 +0100
@@ -1255,6 +1255,7 @@
, HLF_TPF /* tabpage line filler */
, HLF_CUC /* 'cursurcolumn' */
, HLF_CUL /* 'cursurline' */
+ , HLF_MC /* 'margincolumn' */
, HLF_COUNT /* MUST be the last one */
} hlf_T;
@@ -1264,7 +1265,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
--
You received this message from the "vim_dev" maillist.
For more information, visit http://www.vim.org/maillist.php