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

Reply via email to