diff options
author | zeertzjq <zeertzjq@outlook.com> | 2023-08-23 18:10:30 +0800 |
---|---|---|
committer | zeertzjq <zeertzjq@outlook.com> | 2023-08-23 18:24:14 +0800 |
commit | a1e5cef557ec7c989b3db29026f2c8123d295a43 (patch) | |
tree | 8fb1af5663b38e581106fa7054d13c45f1141fb5 | |
parent | 3f32cb88c2cf2bcc1ca95fe24a800abd9d731827 (diff) | |
download | rneovim-a1e5cef557ec7c989b3db29026f2c8123d295a43.tar.gz rneovim-a1e5cef557ec7c989b3db29026f2c8123d295a43.tar.bz2 rneovim-a1e5cef557ec7c989b3db29026f2c8123d295a43.zip |
refactor(option.c): move paste_option_changed() into did_set_paste()
-rw-r--r-- | src/nvim/option.c | 252 |
1 files changed, 123 insertions, 129 deletions
diff --git a/src/nvim/option.c b/src/nvim/option.c index 3648601ab8..62a93f1293 100644 --- a/src/nvim/option.c +++ b/src/nvim/option.c @@ -2161,8 +2161,129 @@ static const char *did_set_swapfile(optset_T *args) /// Process the updated 'paste' option value. static const char *did_set_paste(optset_T *args FUNC_ATTR_UNUSED) { - // when 'paste' is set or reset also change other options - paste_option_changed(); + static int old_p_paste = false; + static int save_sm = 0; + static int save_sta = 0; + static int save_ru = 0; + static int save_ri = 0; + + if (p_paste) { + // Paste switched from off to on. + // Save the current values, so they can be restored later. + if (!old_p_paste) { + // save options for each buffer + FOR_ALL_BUFFERS(buf) { + buf->b_p_tw_nopaste = buf->b_p_tw; + buf->b_p_wm_nopaste = buf->b_p_wm; + buf->b_p_sts_nopaste = buf->b_p_sts; + buf->b_p_ai_nopaste = buf->b_p_ai; + buf->b_p_et_nopaste = buf->b_p_et; + if (buf->b_p_vsts_nopaste) { + xfree(buf->b_p_vsts_nopaste); + } + buf->b_p_vsts_nopaste = buf->b_p_vsts && buf->b_p_vsts != empty_option + ? xstrdup(buf->b_p_vsts) + : NULL; + } + + // save global options + save_sm = p_sm; + save_sta = p_sta; + save_ru = p_ru; + save_ri = p_ri; + // save global values for local buffer options + p_ai_nopaste = p_ai; + p_et_nopaste = p_et; + p_sts_nopaste = p_sts; + p_tw_nopaste = p_tw; + p_wm_nopaste = p_wm; + if (p_vsts_nopaste) { + xfree(p_vsts_nopaste); + } + p_vsts_nopaste = p_vsts && p_vsts != empty_option ? xstrdup(p_vsts) : NULL; + } + + // Always set the option values, also when 'paste' is set when it is + // already on. + // set options for each buffer + FOR_ALL_BUFFERS(buf) { + buf->b_p_tw = 0; // textwidth is 0 + buf->b_p_wm = 0; // wrapmargin is 0 + buf->b_p_sts = 0; // softtabstop is 0 + buf->b_p_ai = 0; // no auto-indent + buf->b_p_et = 0; // no expandtab + if (buf->b_p_vsts) { + free_string_option(buf->b_p_vsts); + } + buf->b_p_vsts = empty_option; + XFREE_CLEAR(buf->b_p_vsts_array); + } + + // set global options + p_sm = 0; // no showmatch + p_sta = 0; // no smarttab + if (p_ru) { + status_redraw_all(); // redraw to remove the ruler + } + p_ru = 0; // no ruler + p_ri = 0; // no reverse insert + // set global values for local buffer options + p_tw = 0; + p_wm = 0; + p_sts = 0; + p_ai = 0; + p_et = 0; + if (p_vsts) { + free_string_option(p_vsts); + } + p_vsts = empty_option; + } else if (old_p_paste) { + // Paste switched from on to off: Restore saved values. + + // restore options for each buffer + FOR_ALL_BUFFERS(buf) { + buf->b_p_tw = buf->b_p_tw_nopaste; + buf->b_p_wm = buf->b_p_wm_nopaste; + buf->b_p_sts = buf->b_p_sts_nopaste; + buf->b_p_ai = buf->b_p_ai_nopaste; + buf->b_p_et = buf->b_p_et_nopaste; + if (buf->b_p_vsts) { + free_string_option(buf->b_p_vsts); + } + buf->b_p_vsts = buf->b_p_vsts_nopaste ? xstrdup(buf->b_p_vsts_nopaste) : empty_option; + xfree(buf->b_p_vsts_array); + if (buf->b_p_vsts && buf->b_p_vsts != empty_option) { + (void)tabstop_set(buf->b_p_vsts, &buf->b_p_vsts_array); + } else { + buf->b_p_vsts_array = NULL; + } + } + + // restore global options + p_sm = save_sm; + p_sta = save_sta; + if (p_ru != save_ru) { + status_redraw_all(); // redraw to draw the ruler + } + p_ru = save_ru; + p_ri = save_ri; + // set global values for local buffer options + p_ai = p_ai_nopaste; + p_et = p_et_nopaste; + p_sts = p_sts_nopaste; + p_tw = p_tw_nopaste; + p_wm = p_wm_nopaste; + if (p_vsts) { + free_string_option(p_vsts); + } + p_vsts = p_vsts_nopaste ? xstrdup(p_vsts_nopaste) : empty_option; + } + + old_p_paste = p_paste; + + // Remember where the dependent options were reset + didset_options_sctx((OPT_LOCAL | OPT_GLOBAL), p_paste_dep_opts); + return NULL; } @@ -5545,133 +5666,6 @@ bool shortmess(int x) && vim_strchr(SHM_ALL_ABBREVIATIONS, x) != NULL))); } -/// paste_option_changed() - Called after p_paste was set or reset. -static void paste_option_changed(void) -{ - static int old_p_paste = false; - static int save_sm = 0; - static int save_sta = 0; - static int save_ru = 0; - static int save_ri = 0; - - if (p_paste) { - // Paste switched from off to on. - // Save the current values, so they can be restored later. - if (!old_p_paste) { - // save options for each buffer - FOR_ALL_BUFFERS(buf) { - buf->b_p_tw_nopaste = buf->b_p_tw; - buf->b_p_wm_nopaste = buf->b_p_wm; - buf->b_p_sts_nopaste = buf->b_p_sts; - buf->b_p_ai_nopaste = buf->b_p_ai; - buf->b_p_et_nopaste = buf->b_p_et; - if (buf->b_p_vsts_nopaste) { - xfree(buf->b_p_vsts_nopaste); - } - buf->b_p_vsts_nopaste = buf->b_p_vsts && buf->b_p_vsts != empty_option - ? xstrdup(buf->b_p_vsts) - : NULL; - } - - // save global options - save_sm = p_sm; - save_sta = p_sta; - save_ru = p_ru; - save_ri = p_ri; - // save global values for local buffer options - p_ai_nopaste = p_ai; - p_et_nopaste = p_et; - p_sts_nopaste = p_sts; - p_tw_nopaste = p_tw; - p_wm_nopaste = p_wm; - if (p_vsts_nopaste) { - xfree(p_vsts_nopaste); - } - p_vsts_nopaste = p_vsts && p_vsts != empty_option ? xstrdup(p_vsts) : NULL; - } - - // Always set the option values, also when 'paste' is set when it is - // already on. - // set options for each buffer - FOR_ALL_BUFFERS(buf) { - buf->b_p_tw = 0; // textwidth is 0 - buf->b_p_wm = 0; // wrapmargin is 0 - buf->b_p_sts = 0; // softtabstop is 0 - buf->b_p_ai = 0; // no auto-indent - buf->b_p_et = 0; // no expandtab - if (buf->b_p_vsts) { - free_string_option(buf->b_p_vsts); - } - buf->b_p_vsts = empty_option; - XFREE_CLEAR(buf->b_p_vsts_array); - } - - // set global options - p_sm = 0; // no showmatch - p_sta = 0; // no smarttab - if (p_ru) { - status_redraw_all(); // redraw to remove the ruler - } - p_ru = 0; // no ruler - p_ri = 0; // no reverse insert - // set global values for local buffer options - p_tw = 0; - p_wm = 0; - p_sts = 0; - p_ai = 0; - p_et = 0; - if (p_vsts) { - free_string_option(p_vsts); - } - p_vsts = empty_option; - } else if (old_p_paste) { - // Paste switched from on to off: Restore saved values. - - // restore options for each buffer - FOR_ALL_BUFFERS(buf) { - buf->b_p_tw = buf->b_p_tw_nopaste; - buf->b_p_wm = buf->b_p_wm_nopaste; - buf->b_p_sts = buf->b_p_sts_nopaste; - buf->b_p_ai = buf->b_p_ai_nopaste; - buf->b_p_et = buf->b_p_et_nopaste; - if (buf->b_p_vsts) { - free_string_option(buf->b_p_vsts); - } - buf->b_p_vsts = buf->b_p_vsts_nopaste ? xstrdup(buf->b_p_vsts_nopaste) : empty_option; - xfree(buf->b_p_vsts_array); - if (buf->b_p_vsts && buf->b_p_vsts != empty_option) { - (void)tabstop_set(buf->b_p_vsts, &buf->b_p_vsts_array); - } else { - buf->b_p_vsts_array = NULL; - } - } - - // restore global options - p_sm = save_sm; - p_sta = save_sta; - if (p_ru != save_ru) { - status_redraw_all(); // redraw to draw the ruler - } - p_ru = save_ru; - p_ri = save_ri; - // set global values for local buffer options - p_ai = p_ai_nopaste; - p_et = p_et_nopaste; - p_sts = p_sts_nopaste; - p_tw = p_tw_nopaste; - p_wm = p_wm_nopaste; - if (p_vsts) { - free_string_option(p_vsts); - } - p_vsts = p_vsts_nopaste ? xstrdup(p_vsts_nopaste) : empty_option; - } - - old_p_paste = p_paste; - - // Remember where the dependent options were reset - didset_options_sctx((OPT_LOCAL | OPT_GLOBAL), p_paste_dep_opts); -} - /// vimrc_found() - Called when a vimrc or "VIMINIT" has been found. /// /// Set the values for options that didn't get set yet to the defaults. |