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

Raspunde prin e-mail lui