Patch 9.0.1293
Problem:    The set_num_option() is too long.
Solution:   Move code to separate functions. (Yegappan Lakshmanan,
            closes #11954)
Files:      src/option.c


*** ../vim-9.0.1292/src/option.c        2023-02-06 16:40:45.382942052 +0000
--- src/option.c        2023-02-09 12:20:42.812694358 +0000
***************
*** 540,546 ****
   * utf-8.
   */
      void
! set_fencs_unicode()
  {
      set_string_option_direct((char_u *)"fencs", -1, fencs_utf8_default,
                                                                  OPT_FREE, 0);
--- 540,546 ----
   * utf-8.
   */
      void
! set_fencs_unicode(void)
  {
      set_string_option_direct((char_u *)"fencs", -1, fencs_utf8_default,
                                                                  OPT_FREE, 0);
***************
*** 3479,3888 ****
  }
  
  /*
!  * Set the value of a number option, and take care of side effects.
!  * Returns NULL for success, or an error message for an error.
   */
      static char *
! set_num_option(
!     int               opt_idx,                // index in options[] table
!     char_u    *varp,                  // pointer to the option variable
!     long      value,                  // new value
!     char      *errbuf,                // buffer for error messages
!     size_t    errbuflen,              // length of "errbuf"
!     int               opt_flags)              // OPT_LOCAL, OPT_GLOBAL,
!                                       // OPT_MODELINE, etc.
  {
!     char      *errmsg = NULL;
!     long      old_value = *(long *)varp;
! #if defined(FEAT_EVAL)
!     long      old_global_value = 0;   // only used when setting a local and
!                                       // global option
! #endif
!     long      old_Rows = Rows;        // remember old Rows
!     long      old_Columns = Columns;  // remember old Columns
!     long      *pp = (long *)varp;
! 
!     // Disallow changing some options from secure mode.
!     if ((secure
! #ifdef HAVE_SANDBOX
!               || sandbox != 0
! #endif
!               ) && (options[opt_idx].flags & P_SECURE))
!       return e_not_allowed_here;
! 
! #if defined(FEAT_EVAL)
!     // Save the global value before changing anything. This is needed as for
!     // a global-only option setting the "local value" in fact sets the global
!     // value (since there is only one value).
!     if ((opt_flags & (OPT_LOCAL | OPT_GLOBAL)) == 0)
!       old_global_value = *(long *)get_varp_scope(&(options[opt_idx]),
!                                                                  OPT_GLOBAL);
! #endif
! 
!     *pp = value;
! #ifdef FEAT_EVAL
!     // Remember where the option was set.
!     set_option_sctx_idx(opt_idx, opt_flags, current_sctx);
! #endif
! #ifdef FEAT_GUI
!     need_mouse_correct = TRUE;
! #endif
! 
!     if (curbuf->b_p_sw < 0)
      {
        errmsg = e_argument_must_be_positive;
! #ifdef FEAT_VARTABS
!       // Use the first 'vartabstop' value, or 'tabstop' if vts isn't in use.
!       curbuf->b_p_sw = tabstop_count(curbuf->b_p_vts_array) > 0
!                      ? tabstop_first(curbuf->b_p_vts_array)
!                      : curbuf->b_p_ts;
! #else
!       curbuf->b_p_sw = curbuf->b_p_ts;
! #endif
      }
! 
!     /*
!      * Number options that need some action when changed
!      */
!     if (pp == &p_wh || pp == &p_hh)
      {
!       // 'winheight' and 'helpheight'
!       if (p_wh < 1)
!       {
!           errmsg = e_argument_must_be_positive;
!           p_wh = 1;
!       }
!       if (p_wmh > p_wh)
!       {
!           errmsg = e_winheight_cannot_be_smaller_than_winminheight;
!           p_wh = p_wmh;
!       }
!       if (p_hh < 0)
!       {
!           errmsg = e_argument_must_be_positive;
!           p_hh = 0;
!       }
! 
!       // Change window height NOW
!       if (!ONE_WINDOW)
!       {
!           if (pp == &p_wh && curwin->w_height < p_wh)
!               win_setheight((int)p_wh);
!           if (pp == &p_hh && curbuf->b_help && curwin->w_height < p_hh)
!               win_setheight((int)p_hh);
!       }
      }
!     else if (pp == &p_wmh)
      {
!       // 'winminheight'
!       if (p_wmh < 0)
!       {
!           errmsg = e_argument_must_be_positive;
!           p_wmh = 0;
!       }
!       if (p_wmh > p_wh)
!       {
!           errmsg = e_winheight_cannot_be_smaller_than_winminheight;
!           p_wmh = p_wh;
!       }
!       win_setminheight();
      }
!     else if (pp == &p_wiw)
      {
!       // 'winwidth'
!       if (p_wiw < 1)
!       {
!           errmsg = e_argument_must_be_positive;
!           p_wiw = 1;
!       }
!       if (p_wmw > p_wiw)
!       {
!           errmsg = e_winwidth_cannot_be_smaller_than_winminwidth;
!           p_wiw = p_wmw;
!       }
  
!       // Change window width NOW
!       if (!ONE_WINDOW && curwin->w_width < p_wiw)
!           win_setwidth((int)p_wiw);
      }
!     else if (pp == &p_wmw)
      {
!       // 'winminwidth'
!       if (p_wmw < 0)
!       {
!           errmsg = e_argument_must_be_positive;
!           p_wmw = 0;
!       }
!       if (p_wmw > p_wiw)
!       {
!           errmsg = e_winwidth_cannot_be_smaller_than_winminwidth;
!           p_wmw = p_wiw;
!       }
!       win_setminwidth();
      }
  
!     // (re)set last window status line
!     else if (pp == &p_ls)
      {
!       last_status(FALSE);
      }
! 
!     // (re)set tab page line
!     else if (pp == &p_stal)
      {
!       shell_new_rows();       // recompute window positions and heights
      }
  
! #ifdef FEAT_GUI
!     else if (pp == &p_linespace)
      {
!       // Recompute gui.char_height and resize the Vim window to keep the
!       // same number of lines.
!       if (gui.in_use && gui_mch_adjust_charheight() == OK)
!           gui_set_shellsize(FALSE, FALSE, RESIZE_VERT);
      }
  #endif
  
  #ifdef FEAT_FOLDING
!     // 'foldlevel'
!     else if (pp == &curwin->w_p_fdl)
!     {
!       if (curwin->w_p_fdl < 0)
!           curwin->w_p_fdl = 0;
!       newFoldLevel();
!     }
  
!     // 'foldminlines'
!     else if (pp == &curwin->w_p_fml)
!     {
        foldUpdateAll(curwin);
!     }
  
!     // 'foldnestmax'
!     else if (pp == &curwin->w_p_fdn)
      {
!       if (foldmethodIsSyntax(curwin) || foldmethodIsIndent(curwin))
!           foldUpdateAll(curwin);
      }
! 
!     // 'foldcolumn'
!     else if (pp == &curwin->w_p_fdc)
      {
!       if (curwin->w_p_fdc < 0)
!       {
!           errmsg = e_argument_must_be_positive;
!           curwin->w_p_fdc = 0;
!       }
!       else if (curwin->w_p_fdc > 12)
!       {
!           errmsg = e_invalid_argument;
!           curwin->w_p_fdc = 12;
!       }
      }
- #endif // FEAT_FOLDING
  
!     // 'shiftwidth' or 'tabstop'
!     else if (pp == &curbuf->b_p_sw || pp == &curbuf->b_p_ts)
!     {
  #ifdef FEAT_FOLDING
!       if (foldmethodIsIndent(curwin))
!           foldUpdateAll(curwin);
  #endif
!       // When 'shiftwidth' changes, or it's zero and 'tabstop' changes:
!       // parse 'cinoptions'.
!       if (pp == &curbuf->b_p_sw || curbuf->b_p_sw == 0)
!           parse_cino(curbuf);
!     }
  
!     // 'maxcombine'
!     else if (pp == &p_mco)
!     {
!       if (p_mco > MAX_MCO)
!           p_mco = MAX_MCO;
!       else if (p_mco < 0)
!           p_mco = 0;
!       screenclear();      // will re-allocate the screen
!     }
  
!     else if (pp == &curbuf->b_p_iminsert)
      {
!       if (curbuf->b_p_iminsert < 0 || curbuf->b_p_iminsert > B_IMODE_LAST)
!       {
!           errmsg = e_invalid_argument;
!           curbuf->b_p_iminsert = B_IMODE_NONE;
!       }
!       p_iminsert = curbuf->b_p_iminsert;
!       if (termcap_active)     // don't do this in the alternate screen
!           showmode();
  #if defined(FEAT_KEYMAP)
!       // Show/unshow value of 'keymap' in status lines.
!       status_redraw_curbuf();
  #endif
!     }
  
  #if defined(FEAT_XIM) && defined(FEAT_GUI_GTK)
!     // 'imstyle'
!     else if (pp == &p_imst)
!     {
!       if (p_imst != IM_ON_THE_SPOT && p_imst != IM_OVER_THE_SPOT)
!           errmsg = e_invalid_argument;
!     }
  #endif
  
!     else if (pp == &p_window)
!     {
!       if (p_window < 1)
!           p_window = 1;
!       else if (p_window >= Rows)
!           p_window = Rows - 1;
!     }
  
!     else if (pp == &curbuf->b_p_imsearch)
      {
!       if (curbuf->b_p_imsearch < -1 || curbuf->b_p_imsearch > B_IMODE_LAST)
!       {
!           errmsg = e_invalid_argument;
!           curbuf->b_p_imsearch = B_IMODE_NONE;
!       }
!       p_imsearch = curbuf->b_p_imsearch;
      }
  
      // if 'titlelen' has changed, redraw the title
!     else if (pp == &p_titlelen)
      {
!       if (p_titlelen < 0)
!       {
!           errmsg = e_argument_must_be_positive;
!           p_titlelen = 85;
!       }
!       if (starting != NO_SCREEN && old_value != p_titlelen)
!           need_maketitle = TRUE;
      }
  
      // if p_ch changed value, change the command line height
!     else if (pp == &p_ch)
      {
!       if (p_ch < 1)
!       {
!           errmsg = e_argument_must_be_positive;
!           p_ch = 1;
!       }
!       if (p_ch > Rows - min_rows() + 1)
!           p_ch = Rows - min_rows() + 1;
  
!       // Only compute the new window layout when startup has been
!       // completed. Otherwise the frame sizes may be wrong.
!       if ((p_ch != old_value
!                     || tabline_height() + topframe->fr_height != Rows - p_ch)
!               && full_screen
  #ifdef FEAT_GUI
!               && !gui.starting
  #endif
!                      )
!           command_height();
!     }
  
      // when 'updatecount' changes from zero to non-zero, open swap files
!     else if (pp == &p_uc)
      {
!       if (p_uc < 0)
!       {
!           errmsg = e_argument_must_be_positive;
!           p_uc = 100;
!       }
!       if (p_uc && !old_value)
!           ml_open_files();
      }
  #ifdef FEAT_CONCEAL
!     else if (pp == &curwin->w_p_cole)
      {
!       if (curwin->w_p_cole < 0)
!       {
!           errmsg = e_argument_must_be_positive;
!           curwin->w_p_cole = 0;
!       }
!       else if (curwin->w_p_cole > 3)
!       {
!           errmsg = e_invalid_argument;
!           curwin->w_p_cole = 3;
!       }
      }
! #endif
! #ifdef MZSCHEME_GUI_THREADS
!     else if (pp == &p_mzq)
!       mzvim_reset_timer();
  #endif
  
  #if defined(FEAT_PYTHON) || defined(FEAT_PYTHON3)
!     // 'pyxversion'
!     else if (pp == &p_pyx)
!     {
!       if (p_pyx != 0 && p_pyx != 2 && p_pyx != 3)
!           errmsg = e_invalid_argument;
!     }
  #endif
  
      // sync undo before 'undolevels' changes
!     else if (pp == &p_ul)
!     {
!       // use the old value, otherwise u_sync() may not work properly
!       p_ul = old_value;
!       u_sync(TRUE);
!       p_ul = value;
!     }
!     else if (pp == &curbuf->b_p_ul)
!     {
!       // use the old value, otherwise u_sync() may not work properly
!       curbuf->b_p_ul = old_value;
!       u_sync(TRUE);
!       curbuf->b_p_ul = value;
!     }
  
  #ifdef FEAT_LINEBREAK
      // 'numberwidth' must be positive
!     else if (pp == &curwin->w_p_nuw)
      {
!       if (curwin->w_p_nuw < 1)
!       {
!           errmsg = e_argument_must_be_positive;
!           curwin->w_p_nuw = 1;
!       }
!       if (curwin->w_p_nuw > 20)
!       {
!           errmsg = e_invalid_argument;
!           curwin->w_p_nuw = 20;
!       }
!       curwin->w_nrwidth_line_count = 0; // trigger a redraw
      }
  #endif
  
!     else if (pp == &curbuf->b_p_tw)
      {
!       if (curbuf->b_p_tw < 0)
!       {
!           errmsg = e_argument_must_be_positive;
!           curbuf->b_p_tw = 0;
!       }
  #ifdef FEAT_SYN_HL
!       {
!           win_T       *wp;
!           tabpage_T   *tp;
  
!           FOR_ALL_TAB_WINDOWS(tp, wp)
!               check_colorcolumn(wp);
!       }
! #endif
      }
  
!     /*
!      * Check the bounds for numeric options here
!      */
      if (Rows < min_rows() && full_screen)
      {
        if (errbuf != NULL)
        {
            vim_snprintf(errbuf, errbuflen,
!                              _(e_need_at_least_nr_lines), min_rows());
            errmsg = errbuf;
        }
        Rows = min_rows();
--- 3479,4034 ----
  }
  
  /*
!  * Process the new 'winheight' or the 'helpheight' option value.
   */
      static char *
! did_set_winheight_helpheight(long *pp, char *errmsg)
  {
!     if (p_wh < 1)
      {
        errmsg = e_argument_must_be_positive;
!       p_wh = 1;
      }
!     if (p_wmh > p_wh)
      {
!       errmsg = e_winheight_cannot_be_smaller_than_winminheight;
!       p_wh = p_wmh;
      }
!     if (p_hh < 0)
      {
!       errmsg = e_argument_must_be_positive;
!       p_hh = 0;
      }
! 
!     // Change window height NOW
!     if (!ONE_WINDOW)
      {
!       if (pp == &p_wh && curwin->w_height < p_wh)
!           win_setheight((int)p_wh);
!       if (pp == &p_hh && curbuf->b_help && curwin->w_height < p_hh)
!           win_setheight((int)p_hh);
!     }
  
!     return errmsg;
! }
! 
! /*
!  * Process the new 'winminheight' option value.
!  */
!     static char *
! did_set_winminheight(char *errmsg)
! {
!     if (p_wmh < 0)
!     {
!       errmsg = e_argument_must_be_positive;
!       p_wmh = 0;
      }
!     if (p_wmh > p_wh)
      {
!       errmsg = e_winheight_cannot_be_smaller_than_winminheight;
!       p_wmh = p_wh;
      }
+     win_setminheight();
  
!     return errmsg;
! }
! 
! /*
!  * Process the new 'winwidth' option value.
!  */
!     static char *
! did_set_winwidth(char *errmsg)
! {
!     if (p_wiw < 1)
      {
!       errmsg = e_argument_must_be_positive;
!       p_wiw = 1;
      }
!     if (p_wmw > p_wiw)
      {
!       errmsg = e_winwidth_cannot_be_smaller_than_winminwidth;
!       p_wiw = p_wmw;
      }
  
!     // Change window width NOW
!     if (!ONE_WINDOW && curwin->w_width < p_wiw)
!       win_setwidth((int)p_wiw);
! 
!     return errmsg;
! }
! 
! /*
!  * Process the new 'winminwidth' option value.
!  */
!     static char *
! did_set_winminwidth(char *errmsg)
! {
!     if (p_wmw < 0)
!     {
!       errmsg = e_argument_must_be_positive;
!       p_wmw = 0;
!     }
!     if (p_wmw > p_wiw)
      {
!       errmsg = e_winwidth_cannot_be_smaller_than_winminwidth;
!       p_wmw = p_wiw;
      }
+     win_setminwidth();
+ 
+     return errmsg;
+ }
+ 
+ /*
+  * Process the new 'laststatus' option value.
+  */
+     static void
+ did_set_laststatus(void)
+ {
+     last_status(FALSE);       // (re)set last window status line
+ }
+ 
+ /*
+  * Process the new 'showtabline' option value.
+  */
+     static void
+ did_set_showtabline(void)
+ {
+     shell_new_rows(); // recompute window positions and heights
+ }
+ 
+ #ifdef FEAT_GUI
+ /*
+  * Process the new 'linespace' option value.
+  */
+     static void
+ did_set_linespace(void)
+ {
+     // Recompute gui.char_height and resize the Vim window to keep the
+     // same number of lines.
+     if (gui.in_use && gui_mch_adjust_charheight() == OK)
+       gui_set_shellsize(FALSE, FALSE, RESIZE_VERT);
+ }
  #endif
  
  #ifdef FEAT_FOLDING
! /*
!  * Process the new 'foldlevel' option value.
!  */
!     static void
! did_set_foldlevel(void)
! {
!     if (curwin->w_p_fdl < 0)
!       curwin->w_p_fdl = 0;
!     newFoldLevel();
! }
  
! /*
!  * Process the new 'foldminlines' option value.
!  */
!     static void
! did_set_foldminlines(void)
! {
!     foldUpdateAll(curwin);
! }
! 
! /*
!  * Process the new 'foldnestmax' option value.
!  */
!     static void
! did_set_foldnestmax(void)
! {
!     if (foldmethodIsSyntax(curwin) || foldmethodIsIndent(curwin))
        foldUpdateAll(curwin);
! }
  
! /*
!  * Process the new 'foldcolumn' option value.
!  */
!     static char *
! did_set_foldcolumn(char *errmsg)
! {
!     if (curwin->w_p_fdc < 0)
      {
!       errmsg = e_argument_must_be_positive;
!       curwin->w_p_fdc = 0;
      }
!     else if (curwin->w_p_fdc > 12)
      {
!       errmsg = e_invalid_argument;
!       curwin->w_p_fdc = 12;
      }
  
!     return errmsg;
! }
! #endif
! 
! /*
!  * Process the new 'shiftwidth' or the 'tabstop' option value.
!  */
!     static void
! did_set_shiftwidth_tabstop(long *pp)
! {
  #ifdef FEAT_FOLDING
!     if (foldmethodIsIndent(curwin))
!       foldUpdateAll(curwin);
  #endif
!     // When 'shiftwidth' changes, or it's zero and 'tabstop' changes:
!     // parse 'cinoptions'.
!     if (pp == &curbuf->b_p_sw || curbuf->b_p_sw == 0)
!       parse_cino(curbuf);
! }
  
! /*
!  * Process the new 'maxcombine' option value.
!  */
!     static void
! did_set_maxcombine(void)
! {
!     if (p_mco > MAX_MCO)
!       p_mco = MAX_MCO;
!     else if (p_mco < 0)
!       p_mco = 0;
!     screenclear();        // will re-allocate the screen
! }
  
! /*
!  * Process the new 'iminsert' option value.
!  */
!     static char *
! did_set_iminsert(char *errmsg)
! {
!     if (curbuf->b_p_iminsert < 0 || curbuf->b_p_iminsert > B_IMODE_LAST)
      {
!       errmsg = e_invalid_argument;
!       curbuf->b_p_iminsert = B_IMODE_NONE;
!     }
!     p_iminsert = curbuf->b_p_iminsert;
!     if (termcap_active)       // don't do this in the alternate screen
!       showmode();
  #if defined(FEAT_KEYMAP)
!     // Show/unshow value of 'keymap' in status lines.
!     status_redraw_curbuf();
  #endif
! 
!     return errmsg;
! }
  
  #if defined(FEAT_XIM) && defined(FEAT_GUI_GTK)
! /*
!  * Process the new 'imstyle' option value.
!  */
!     static char *
! did_set_imstyle(char *errmsg)
! {
!     if (p_imst != IM_ON_THE_SPOT && p_imst != IM_OVER_THE_SPOT)
!       errmsg = e_invalid_argument;
! 
!     return errmsg;
! }
  #endif
  
! /*
!  * Process the new 'window' option value.
!  */
!     static void
! did_set_window(void)
! {
!     if (p_window < 1)
!       p_window = 1;
!     else if (p_window >= Rows)
!       p_window = Rows - 1;
! }
  
! /*
!  * Process the new 'imsearch' option value.
!  */
!     static char *
! did_set_imsearch(char *errmsg)
! {
!     if (curbuf->b_p_imsearch < -1 || curbuf->b_p_imsearch > B_IMODE_LAST)
      {
!       errmsg = e_invalid_argument;
!       curbuf->b_p_imsearch = B_IMODE_NONE;
      }
+     p_imsearch = curbuf->b_p_imsearch;
+ 
+     return errmsg;
+ }
  
+ /*
+  * Process the new 'titlelen' option value.
+  */
+     static char *
+ did_set_titlelen(long old_value, char *errmsg)
+ {
      // if 'titlelen' has changed, redraw the title
!     if (p_titlelen < 0)
      {
!       errmsg = e_argument_must_be_positive;
!       p_titlelen = 85;
      }
+     if (starting != NO_SCREEN && old_value != p_titlelen)
+       need_maketitle = TRUE;
  
+     return errmsg;
+ }
+ 
+ /*
+  * Process the new 'cmdheight' option value.
+  */
+     static char *
+ did_set_cmdheight(long old_value, char *errmsg)
+ {
      // if p_ch changed value, change the command line height
!     if (p_ch < 1)
      {
!       errmsg = e_argument_must_be_positive;
!       p_ch = 1;
!     }
!     if (p_ch > Rows - min_rows() + 1)
!       p_ch = Rows - min_rows() + 1;
  
!     // Only compute the new window layout when startup has been
!     // completed. Otherwise the frame sizes may be wrong.
!     if ((p_ch != old_value
!               || tabline_height() + topframe->fr_height != Rows - p_ch)
!           && full_screen
  #ifdef FEAT_GUI
!           && !gui.starting
  #endif
!        )
!       command_height();
  
+     return errmsg;
+ }
+ 
+ /*
+  * Process the new 'updatecount' option value.
+  */
+     static char *
+ did_set_updatecount(long old_value, char *errmsg)
+ {
      // when 'updatecount' changes from zero to non-zero, open swap files
!     if (p_uc < 0)
      {
!       errmsg = e_argument_must_be_positive;
!       p_uc = 100;
      }
+     if (p_uc && !old_value)
+       ml_open_files();
+ 
+     return errmsg;
+ }
+ 
  #ifdef FEAT_CONCEAL
! /*
!  * Process the new 'conceallevel' option value.
!  */
!     static char *
! did_set_conceallevel(char *errmsg)
! {
!     if (curwin->w_p_cole < 0)
      {
!       errmsg = e_argument_must_be_positive;
!       curwin->w_p_cole = 0;
      }
!     else if (curwin->w_p_cole > 3)
!     {
!       errmsg = e_invalid_argument;
!       curwin->w_p_cole = 3;
!     }
! 
!     return errmsg;
! }
  #endif
  
  #if defined(FEAT_PYTHON) || defined(FEAT_PYTHON3)
! /*
!  * Process the new 'pyxversion' option value.
!  */
!     static char *
! did_set_pyxversion(char *errmsg)
! {
!     if (p_pyx != 0 && p_pyx != 2 && p_pyx != 3)
!       errmsg = e_invalid_argument;
! 
!     return errmsg;
! }
  #endif
  
+ /*
+  * Process the new global 'undolevels' option value.
+  */
+     static void
+ did_set_global_undolevels(long value, long old_value)
+ {
      // sync undo before 'undolevels' changes
! 
!     // use the old value, otherwise u_sync() may not work properly
!     p_ul = old_value;
!     u_sync(TRUE);
!     p_ul = value;
! }
! 
! /*
!  * Process the new buffer local 'undolevels' option value.
!  */
!     static void
! did_set_buflocal_undolevels(long value, long old_value)
! {
!     // use the old value, otherwise u_sync() may not work properly
!     curbuf->b_p_ul = old_value;
!     u_sync(TRUE);
!     curbuf->b_p_ul = value;
! }
  
  #ifdef FEAT_LINEBREAK
+ /*
+  * Process the new 'numberwidth' option value.
+  */
+     static char *
+ did_set_numberwidth(char *errmsg)
+ {
      // 'numberwidth' must be positive
!     if (curwin->w_p_nuw < 1)
      {
!       errmsg = e_argument_must_be_positive;
!       curwin->w_p_nuw = 1;
!     }
!     if (curwin->w_p_nuw > 20)
!     {
!       errmsg = e_invalid_argument;
!       curwin->w_p_nuw = 20;
      }
+     curwin->w_nrwidth_line_count = 0; // trigger a redraw
+ 
+     return errmsg;
+ }
  #endif
  
! /*
!  * Process the new 'textwidth' option value.
!  */
!     static char *
! did_set_textwidth(char *errmsg)
! {
!     if (curbuf->b_p_tw < 0)
      {
!       errmsg = e_argument_must_be_positive;
!       curbuf->b_p_tw = 0;
!     }
  #ifdef FEAT_SYN_HL
!     {
!       win_T   *wp;
!       tabpage_T       *tp;
  
!       FOR_ALL_TAB_WINDOWS(tp, wp)
!           check_colorcolumn(wp);
      }
+ #endif
  
!     return errmsg;
! }
! 
! /*
!  * When some number options are changed, need to take some action.
!  */
!     static char *
! did_set_num_option(long *pp, long value, long old_value, char *errmsg)
! {
!     if (pp == &p_wh                           // 'winheight'
!           || pp == &p_hh)                     // 'helpheight'
!       errmsg = did_set_winheight_helpheight(pp, errmsg);
!     else if (pp == &p_wmh)                    // 'winminheight'
!       errmsg = did_set_winminheight(errmsg);
!     else if (pp == &p_wiw)                    // 'winwidth'
!       errmsg = did_set_winwidth(errmsg);
!     else if (pp == &p_wmw)                    // 'winminwidth'
!       errmsg = did_set_winminwidth(errmsg);
!     else if (pp == &p_ls)
!       did_set_laststatus();                   // 'laststatus'
!     else if (pp == &p_stal)
!       did_set_showtabline();                  // 'showtabline'
! #ifdef FEAT_GUI
!     else if (pp == &p_linespace)              // 'linespace'
!       did_set_linespace();
! #endif
! #ifdef FEAT_FOLDING
!     else if (pp == &curwin->w_p_fdl)          // 'foldlevel'
!       did_set_foldlevel();
!     else if (pp == &curwin->w_p_fml)          // 'foldminlines'
!       did_set_foldminlines();
!     else if (pp == &curwin->w_p_fdn)          // 'foldnestmax'
!       did_set_foldnestmax();
!     else if (pp == &curwin->w_p_fdc)          // 'foldcolumn'
!       errmsg = did_set_foldcolumn(errmsg);
! #endif // FEAT_FOLDING
!     else if (  pp == &curbuf->b_p_sw          // 'shiftwidth'
!           || pp == &curbuf->b_p_ts)           // 'tabstop'
!       did_set_shiftwidth_tabstop(pp);
!     else if (pp == &p_mco)                    // 'maxcombine'
!       did_set_maxcombine();
!     else if (pp == &curbuf->b_p_iminsert)     // 'iminsert'
!       errmsg = did_set_iminsert(errmsg);
! #if defined(FEAT_XIM) && defined(FEAT_GUI_GTK)
!     else if (pp == &p_imst)                   // 'imstyle'
!       errmsg = did_set_imstyle(errmsg);
! #endif
!     else if (pp == &p_window)                 // 'window'
!       did_set_window();
!     else if (pp == &curbuf->b_p_imsearch)     // 'imsearch'
!       errmsg = did_set_imsearch(errmsg);
!     else if (pp == &p_titlelen)                       // 'titlelen'
!       errmsg = did_set_titlelen(old_value, errmsg);
!     else if (pp == &p_ch)                     // 'cmdheight'
!       errmsg = did_set_cmdheight(old_value, errmsg);
!     else if (pp == &p_uc)                     // 'updatecount'
!       errmsg = did_set_updatecount(old_value, errmsg);
! #ifdef FEAT_CONCEAL
!     else if (pp == &curwin->w_p_cole)         // 'conceallevel'
!       errmsg = did_set_conceallevel(errmsg);
! #endif
! #ifdef MZSCHEME_GUI_THREADS
!     else if (pp == &p_mzq)                    // 'mzquantum'
!       mzvim_reset_timer();
! #endif
! #if defined(FEAT_PYTHON) || defined(FEAT_PYTHON3)
!     else if (pp == &p_pyx)                    // 'pyxversion'
!       errmsg = did_set_pyxversion(errmsg);
! #endif
!     else if (pp == &p_ul)                     // global 'undolevels'
!       did_set_global_undolevels(value, old_value);
!     else if (pp == &curbuf->b_p_ul)           // buffer local 'undolevels'
!       did_set_buflocal_undolevels(value, old_value);
! #ifdef FEAT_LINEBREAK
!     else if (pp == &curwin->w_p_nuw)          // 'numberwidth'
!       errmsg = did_set_numberwidth(errmsg);
! #endif
!     else if (pp == &curbuf->b_p_tw)           // 'textwidth'
!       errmsg = did_set_textwidth(errmsg);
! 
!     return errmsg;
! }
! 
! /*
!  * Check the bounds of numeric options.
!  */
!     static char *
! check_num_option_bounds(
!     long      *pp,
!     long      old_value,
!     long      old_Rows,
!     long      old_Columns,
!     char      *errbuf,
!     size_t    errbuflen,
!     char      *errmsg)
! {
      if (Rows < min_rows() && full_screen)
      {
        if (errbuf != NULL)
        {
            vim_snprintf(errbuf, errbuflen,
!                   _(e_need_at_least_nr_lines), min_rows());
            errmsg = errbuf;
        }
        Rows = min_rows();
***************
*** 3892,3898 ****
        if (errbuf != NULL)
        {
            vim_snprintf(errbuf, errbuflen,
!                           _(e_need_at_least_nr_columns), MIN_COLUMNS);
            errmsg = errbuf;
        }
        Columns = MIN_COLUMNS;
--- 4038,4044 ----
        if (errbuf != NULL)
        {
            vim_snprintf(errbuf, errbuflen,
!                   _(e_need_at_least_nr_columns), MIN_COLUMNS);
            errmsg = errbuf;
        }
        Columns = MIN_COLUMNS;
***************
*** 3912,3918 ****
  #ifdef FEAT_GUI
                && !gui.starting
  #endif
!           )
            set_shellsize((int)Columns, (int)Rows, TRUE);
        else
        {
--- 4058,4064 ----
  #ifdef FEAT_GUI
                && !gui.starting
  #endif
!               )
            set_shellsize((int)Columns, (int)Rows, TRUE);
        else
        {
***************
*** 4015,4020 ****
--- 4161,4243 ----
        p_ss = 0;
      }
  
+     return errmsg;
+ }
+ 
+ /*
+  * Set the value of a number option, and take care of side effects.
+  * Returns NULL for success, or an error message for an error.
+  */
+     static char *
+ set_num_option(
+     int               opt_idx,                // index in options[] table
+     char_u    *varp,                  // pointer to the option variable
+     long      value,                  // new value
+     char      *errbuf,                // buffer for error messages
+     size_t    errbuflen,              // length of "errbuf"
+     int               opt_flags)              // OPT_LOCAL, OPT_GLOBAL,
+                                       // OPT_MODELINE, etc.
+ {
+     char      *errmsg = NULL;
+     long      old_value = *(long *)varp;
+ #if defined(FEAT_EVAL)
+     long      old_global_value = 0;   // only used when setting a local and
+                                       // global option
+ #endif
+     long      old_Rows = Rows;        // remember old Rows
+     long      old_Columns = Columns;  // remember old Columns
+     long      *pp = (long *)varp;
+ 
+     // Disallow changing some options from secure mode.
+     if ((secure
+ #ifdef HAVE_SANDBOX
+               || sandbox != 0
+ #endif
+               ) && (options[opt_idx].flags & P_SECURE))
+       return e_not_allowed_here;
+ 
+ #if defined(FEAT_EVAL)
+     // Save the global value before changing anything. This is needed as for
+     // a global-only option setting the "local value" in fact sets the global
+     // value (since there is only one value).
+     if ((opt_flags & (OPT_LOCAL | OPT_GLOBAL)) == 0)
+       old_global_value = *(long *)get_varp_scope(&(options[opt_idx]),
+                                                                  OPT_GLOBAL);
+ #endif
+ 
+     *pp = value;
+ #ifdef FEAT_EVAL
+     // Remember where the option was set.
+     set_option_sctx_idx(opt_idx, opt_flags, current_sctx);
+ #endif
+ #ifdef FEAT_GUI
+     need_mouse_correct = TRUE;
+ #endif
+ 
+     if (curbuf->b_p_sw < 0)
+     {
+       errmsg = e_argument_must_be_positive;
+ #ifdef FEAT_VARTABS
+       // Use the first 'vartabstop' value, or 'tabstop' if vts isn't in use.
+       curbuf->b_p_sw = tabstop_count(curbuf->b_p_vts_array) > 0
+                      ? tabstop_first(curbuf->b_p_vts_array)
+                      : curbuf->b_p_ts;
+ #else
+       curbuf->b_p_sw = curbuf->b_p_ts;
+ #endif
+     }
+ 
+     /*
+      * Number options that need some action when changed
+      */
+     errmsg = did_set_num_option(pp, value, old_value, errmsg);
+ 
+     /*
+      * Check the bounds for numeric options here
+      */
+     errmsg = check_num_option_bounds(pp, old_value, old_Rows, old_Columns,
+                                               errbuf, errbuflen, errmsg);
+ 
      // May set global value for local option.
      if ((opt_flags & (OPT_LOCAL | OPT_GLOBAL)) == 0)
        *(long *)get_varp_scope(&(options[opt_idx]), OPT_GLOBAL) = *pp;
*** ../vim-9.0.1292/src/version.c       2023-02-08 20:55:23.936100739 +0000
--- src/version.c       2023-02-09 12:22:57.888553211 +0000
***************
*** 697,698 ****
--- 697,700 ----
  {   /* Add new patch number below this line */
+ /**/
+     1293,
  /**/

-- 
hundred-and-one symptoms of being an internet addict:
102. When filling out your driver's license application, you give
     your IP address.

 /// Bram Moolenaar -- [email protected] -- http://www.Moolenaar.net   \\\
///                                                                      \\\
\\\        sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ ///
 \\\            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].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/vim_dev/20230209122405.9155B1C247D%40moolenaar.net.

Raspunde prin e-mail lui