0
0
mirror of https://github.com/vim/vim.git synced 2025-09-23 03:43:49 -04:00

patch 9.0.1781: Problems when setting bin/paste option

Problem:  Problems when setting bin/paste option
Solution: When setting binary/paste, remember that this also affects
          depending options, so that :verbose set returns the right
          location.

Mention if depending options for 'binary' or 'paste' have been reset
indirectly. Add a test to verify it works.

Also noticed as small bug, that the global option value for expandtab
was not reset when paste option is set, so fix that while at it.

closes: #12837
closes: #12879

Signed-off-by: Christian Brabandt <cb@256bit.org>
Co-authored-by: zeertzjq <zeertzjq@outlook.com>
This commit is contained in:
Christian Brabandt
2023-08-22 21:44:10 +02:00
parent 618e47d1cd
commit 757593c07a
3 changed files with 124 additions and 0 deletions

View File

@@ -68,6 +68,21 @@ static void check_winopt(winopt_T *wop);
static int wc_use_keyname(char_u *varp, long *wcp); static int wc_use_keyname(char_u *varp, long *wcp);
static void compatible_set(void); static void compatible_set(void);
#if defined(FEAT_EVAL) || defined(PROTO)
static char *(p_bin_dep_opts[]) = {"textwidth", "wrapmargin", "modeline", "expandtab", NULL};
static char *(p_paste_dep_opts[]) = {"autoindent", "expandtab", "ruler", "showmatch", "smarttab",
"softtabstop", "textwidth", "wrapmargin",
#ifdef FEAT_RIGHTLEFT
"hkmap", "revins",
#endif
#ifdef FEAT_VARTABS
"varsofttabstop",
#endif
NULL};
static void didset_options_sctx(int opt_flags, char **buf);
#endif
/* /*
* Initialize the 'shell' option to a default value. * Initialize the 'shell' option to a default value.
*/ */
@@ -2763,6 +2778,10 @@ set_options_bin(
p_et = p_et_nobin; p_et = p_et_nobin;
} }
} }
#if defined(FEAT_EVAL) || defined(PROTO)
// Remember where the dependent option were reset
didset_options_sctx(opt_flags, p_bin_dep_opts);
#endif
} }
/* /*
@@ -3846,6 +3865,7 @@ did_set_paste(optset_T *args UNUSED)
p_wm = 0; p_wm = 0;
p_sts = 0; p_sts = 0;
p_ai = 0; p_ai = 0;
p_et = 0;
#ifdef FEAT_VARTABS #ifdef FEAT_VARTABS
if (p_vsts) if (p_vsts)
free_string_option(p_vsts); free_string_option(p_vsts);
@@ -3902,6 +3922,11 @@ did_set_paste(optset_T *args UNUSED)
old_p_paste = p_paste; old_p_paste = p_paste;
#if defined(FEAT_EVAL) || defined(PROTO)
// Remember where the dependent options were reset
didset_options_sctx((OPT_LOCAL | OPT_GLOBAL), p_paste_dep_opts);
#endif
return NULL; return NULL;
} }
@@ -8170,3 +8195,19 @@ option_set_callback_func(char_u *optval UNUSED, callback_T *optcb UNUSED)
return FAIL; return FAIL;
#endif #endif
} }
#if defined(FEAT_EVAL) || defined(PROTO)
static void
didset_options_sctx(int opt_flags, char **buf)
{
for (int i = 0; ; ++i)
{
if (buf[i] == NULL)
break;
int idx = findoption((char_u *)buf[i]);
if (idx >= 0)
set_option_sctx_idx(idx, opt_flags, current_sctx);
}
}
#endif

View File

@@ -1774,4 +1774,85 @@ func Test_set_option_window_global_local_all()
bw! bw!
endfunc endfunc
func Test_paste_depending_options()
" setting the paste option, resets all dependent options
" and will be reported correctly using :verbose set <option>?
let lines =<< trim [CODE]
" set paste test
set autoindent
set expandtab
" disabled, because depends on compiled feature set
" set hkmap
" set revins
" set varsofttabstop=8,32,8
set ruler
set showmatch
set smarttab
set softtabstop=4
set textwidth=80
set wrapmargin=10
source Xvimrc_paste2
redir > Xoutput_paste
verbose set expandtab?
verbose setg expandtab?
verbose setl expandtab?
redir END
qall!
[CODE]
call writefile(lines, 'Xvimrc_paste', 'D')
call writefile(['set paste'], 'Xvimrc_paste2', 'D')
if !RunVim([], lines, '--clean')
return
endif
let result = readfile('Xoutput_paste')->filter('!empty(v:val)')
call assert_equal('noexpandtab', result[0])
call assert_match("^\tLast set from .*Xvimrc_paste2 line 1$", result[1])
call assert_equal('noexpandtab', result[2])
call assert_match("^\tLast set from .*Xvimrc_paste2 line 1$", result[3])
call assert_equal('noexpandtab', result[4])
call assert_match("^\tLast set from .*Xvimrc_paste2 line 1$", result[5])
call delete('Xoutput_paste')
endfunc
func Test_binary_depending_options()
" setting the paste option, resets all dependent options
" and will be reported correctly using :verbose set <option>?
let lines =<< trim [CODE]
" set binary test
set expandtab
source Xvimrc_bin2
redir > Xoutput_bin
verbose set expandtab?
verbose setg expandtab?
verbose setl expandtab?
redir END
qall!
[CODE]
call writefile(lines, 'Xvimrc_bin', 'D')
call writefile(['set binary'], 'Xvimrc_bin2', 'D')
if !RunVim([], lines, '--clean')
return
endif
let result = readfile('Xoutput_bin')->filter('!empty(v:val)')
call assert_equal('noexpandtab', result[0])
call assert_match("^\tLast set from .*Xvimrc_bin2 line 1$", result[1])
call assert_equal('noexpandtab', result[2])
call assert_match("^\tLast set from .*Xvimrc_bin2 line 1$", result[3])
call assert_equal('noexpandtab', result[4])
call assert_match("^\tLast set from .*Xvimrc_bin2 line 1$", result[5])
call delete('Xoutput_bin')
endfunc
" vim: shiftwidth=2 sts=2 expandtab " vim: shiftwidth=2 sts=2 expandtab

View File

@@ -699,6 +699,8 @@ static char *(features[]) =
static int included_patches[] = static int included_patches[] =
{ /* Add new patch number below this line */ { /* Add new patch number below this line */
/**/
1781,
/**/ /**/
1780, 1780,
/**/ /**/