aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorzeertzjq <zeertzjq@outlook.com>2023-08-23 18:10:30 +0800
committerzeertzjq <zeertzjq@outlook.com>2023-08-23 18:24:14 +0800
commita1e5cef557ec7c989b3db29026f2c8123d295a43 (patch)
tree8fb1af5663b38e581106fa7054d13c45f1141fb5
parent3f32cb88c2cf2bcc1ca95fe24a800abd9d731827 (diff)
downloadrneovim-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.c252
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.