Patch 7.4.603
Problem:    'foldcolumn' may be set such that it fills the whole window, not
            leaving space for text.
Solution:   Reduce the foldcolumn width when there is not sufficient room.
            (idea by Christian Brabandt)
Files:      src/srcreen.c


*** ../vim-7.4.602/src/screen.c 2015-01-20 19:01:32.380444290 +0100
--- src/screen.c        2015-01-27 16:25:47.264690419 +0100
***************
*** 109,114 ****
--- 109,115 ----
  
  #ifdef FEAT_FOLDING
  static foldinfo_T win_foldinfo;       /* info for 'foldcolumn' */
+ static int compute_foldcolumn __ARGS((win_T *wp, int col));
  #endif
  
  /*
***************
*** 1202,1208 ****
                        lnumb = wp->w_lines[i].wl_lnum;
                        /* When there is a fold column it might need updating
                         * in the next line ("J" just above an open fold). */
!                       if (wp->w_p_fdc > 0)
                            ++lnumb;
                    }
                }
--- 1203,1209 ----
                        lnumb = wp->w_lines[i].wl_lnum;
                        /* When there is a fold column it might need updating
                         * in the next line ("J" just above an open fold). */
!                       if (compute_foldcolumn(wp, 0) > 0)
                            ++lnumb;
                    }
                }
***************
*** 2238,2250 ****
  #else
  # define FDC_OFF 0
  #endif
  
  #ifdef FEAT_RIGHTLEFT
      if (wp->w_p_rl)
      {
        /* No check for cmdline window: should never be right-left. */
  # ifdef FEAT_FOLDING
!       n = wp->w_p_fdc;
  
        if (n > 0)
        {
--- 2239,2254 ----
  #else
  # define FDC_OFF 0
  #endif
+ #ifdef FEAT_FOLDING
+     int               fdc = compute_foldcolumn(wp, 0);
+ #endif
  
  #ifdef FEAT_RIGHTLEFT
      if (wp->w_p_rl)
      {
        /* No check for cmdline window: should never be right-left. */
  # ifdef FEAT_FOLDING
!       n = fdc;
  
        if (n > 0)
        {
***************
*** 2293,2301 ****
        }
  #endif
  #ifdef FEAT_FOLDING
!       if (wp->w_p_fdc > 0)
        {
!           int     nn = n + wp->w_p_fdc;
  
            /* draw the fold column at the left */
            if (nn > W_WIDTH(wp))
--- 2297,2305 ----
        }
  #endif
  #ifdef FEAT_FOLDING
!       if (fdc > 0)
        {
!           int     nn = n + fdc;
  
            /* draw the fold column at the left */
            if (nn > W_WIDTH(wp))
***************
*** 2346,2351 ****
--- 2350,2373 ----
  
  #ifdef FEAT_FOLDING
  /*
+  * Compute the width of the foldcolumn.  Based on 'foldcolumn' and how much
+  * space is available for window "wp", minus "col".
+  */
+     static int
+ compute_foldcolumn(wp, col)
+     win_T *wp;
+     int   col;
+ {
+     int fdc = wp->w_p_fdc;
+     int wmw = wp == curwin && p_wmw == 0 ? 1 : p_wmw;
+     int wwidth = W_WIDTH(wp);
+ 
+     if (fdc > wwidth - (col + wmw))
+       fdc = wwidth - (col + wmw);
+     return fdc;
+ }
+ 
+ /*
   * Display one folded line.
   */
      static void
***************
*** 2396,2405 ****
  
      /*
       * 2. Add the 'foldcolumn'
       */
!     fdc = wp->w_p_fdc;
!     if (fdc > W_WIDTH(wp) - col)
!       fdc = W_WIDTH(wp) - col;
      if (fdc > 0)
      {
        fill_foldcolumn(buf, wp, TRUE, lnum);
--- 2418,2426 ----
  
      /*
       * 2. Add the 'foldcolumn'
+      *    Reduce the width when there is not enough space.
       */
!     fdc = compute_foldcolumn(wp, col);
      if (fdc > 0)
      {
        fill_foldcolumn(buf, wp, TRUE, lnum);
***************
*** 2787,2809 ****
      int               level;
      int               first_level;
      int               empty;
  
      /* Init to all spaces. */
!     copy_spaces(p, (size_t)wp->w_p_fdc);
  
      level = win_foldinfo.fi_level;
      if (level > 0)
      {
        /* If there is only one column put more info in it. */
!       empty = (wp->w_p_fdc == 1) ? 0 : 1;
  
        /* If the column is too narrow, we start at the lowest level that
         * fits and use numbers to indicated the depth. */
!       first_level = level - wp->w_p_fdc - closed + 1 + empty;
        if (first_level < 1)
            first_level = 1;
  
!       for (i = 0; i + empty < wp->w_p_fdc; ++i)
        {
            if (win_foldinfo.fi_lnum == lnum
                              && first_level + i >= win_foldinfo.fi_low_level)
--- 2808,2831 ----
      int               level;
      int               first_level;
      int               empty;
+     int               fdc = compute_foldcolumn(wp, 0);
  
      /* Init to all spaces. */
!     copy_spaces(p, (size_t)fdc);
  
      level = win_foldinfo.fi_level;
      if (level > 0)
      {
        /* If there is only one column put more info in it. */
!       empty = (fdc == 1) ? 0 : 1;
  
        /* If the column is too narrow, we start at the lowest level that
         * fits and use numbers to indicated the depth. */
!       first_level = level - fdc - closed + 1 + empty;
        if (first_level < 1)
            first_level = 1;
  
!       for (i = 0; i + empty < fdc; ++i)
        {
            if (win_foldinfo.fi_lnum == lnum
                              && first_level + i >= win_foldinfo.fi_low_level)
***************
*** 2819,2825 ****
        }
      }
      if (closed)
!       p[i >= wp->w_p_fdc ? i - 1 : i] = '+';
  }
  #endif /* FEAT_FOLDING */
  
--- 2841,2847 ----
        }
      }
      if (closed)
!       p[i >= fdc ? i - 1 : i] = '+';
  }
  #endif /* FEAT_FOLDING */
  
***************
*** 3556,3567 ****
  #ifdef FEAT_FOLDING
            if (draw_state == WL_FOLD - 1 && n_extra == 0)
            {
                draw_state = WL_FOLD;
!               if (wp->w_p_fdc > 0)
                {
                    /* Draw the 'foldcolumn'. */
                    fill_foldcolumn(extra, wp, FALSE, lnum);
!                   n_extra = wp->w_p_fdc;
                    p_extra = extra;
                    p_extra[n_extra] = NUL;
                    c_extra = NUL;
--- 3578,3591 ----
  #ifdef FEAT_FOLDING
            if (draw_state == WL_FOLD - 1 && n_extra == 0)
            {
+               int fdc = compute_foldcolumn(wp, 0);
+ 
                draw_state = WL_FOLD;
!               if (fdc > 0)
                {
                    /* Draw the 'foldcolumn'. */
                    fill_foldcolumn(extra, wp, FALSE, lnum);
!                   n_extra = fdc;
                    p_extra = extra;
                    p_extra[n_extra] = NUL;
                    c_extra = NUL;
*** ../vim-7.4.602/src/version.c        2015-01-27 15:58:37.202395482 +0100
--- src/version.c       2015-01-27 16:14:45.703878550 +0100
***************
*** 743,744 ****
--- 743,746 ----
  {   /* Add new patch number below this line */
+ /**/
+     603,
  /**/

-- 
hundred-and-one symptoms of being an internet addict:
129. You cancel your newspaper subscription.

 /// Bram Moolenaar -- [email protected] -- http://www.Moolenaar.net   \\\
///        sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
\\\  an exciting new programming language -- http://www.Zimbu.org        ///
 \\\            help me help AIDS victims -- http://ICCF-Holland.org    ///

-- 
-- 
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

--- 
You received this message because you are subscribed to the Google Groups 
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Raspunde prin e-mail lui