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.