0
0
mirror of https://github.com/vim/vim.git synced 2025-09-24 03:44:06 -04:00

patch 8.2.2616: Vim9: if 'cpo' is change in Vim9 script it may be restored

Problem:    Vim9: if 'cpo' is change in Vim9 script it may be restored.
Solution:   Apply the changes to 'cpo' to the restored value.
This commit is contained in:
Bram Moolenaar
2021-03-17 17:46:00 +01:00
parent a4c81bea38
commit 3e1916947d
4 changed files with 41 additions and 4 deletions

View File

@@ -1082,7 +1082,9 @@ A side effect of `:vim9script` is that the 'cpoptions' option is set to the
Vim default value, like with: > Vim default value, like with: >
:set cpo&vim :set cpo&vim
One of the effects is that |line-continuation| is always enabled. One of the effects is that |line-continuation| is always enabled.
The original value of 'cpoptions' is restored at the end of the script. The original value of 'cpoptions' is restored at the end of the script, while
flags added or removed in the script are also added to or removed from the
original value to get the same effect. The order of flags may change.
*vim9-mix* *vim9-mix*
There is one way to use both legacy and Vim9 syntax in one script file: > There is one way to use both legacy and Vim9 syntax in one script file: >

View File

@@ -1459,6 +1459,33 @@ almosttheend:
si = SCRIPT_ITEM(current_sctx.sc_sid); si = SCRIPT_ITEM(current_sctx.sc_sid);
if (si->sn_save_cpo != NULL) if (si->sn_save_cpo != NULL)
{ {
if (STRCMP(p_cpo, CPO_VIM) != 0)
{
char_u *f;
char_u *t;
// 'cpo' was changed in the script. Apply the same change to the
// saved value, if possible.
for (f = (char_u *)CPO_VIM; *f != NUL; ++f)
if (vim_strchr(p_cpo, *f) == NULL
&& (t = vim_strchr(si->sn_save_cpo, *f)) != NULL)
// flag was removed, also remove it from the saved 'cpo'
mch_memmove(t, t + 1, STRLEN(t));
for (f = p_cpo; *f != NUL; ++f)
if (vim_strchr((char_u *)CPO_VIM, *f) == NULL
&& vim_strchr(si->sn_save_cpo, *f) == NULL)
{
// flag was added, also add it to the saved 'cpo'
t = alloc(STRLEN(si->sn_save_cpo) + 2);
if (t != NULL)
{
*t = *f;
STRCPY(t + 1, si->sn_save_cpo);
vim_free(si->sn_save_cpo);
si->sn_save_cpo = t;
}
}
}
set_option_value((char_u *)"cpo", 0L, si->sn_save_cpo, OPT_NO_REDRAW); set_option_value((char_u *)"cpo", 0L, si->sn_save_cpo, OPT_NO_REDRAW);
VIM_CLEAR(si->sn_save_cpo); VIM_CLEAR(si->sn_save_cpo);
} }

View File

@@ -1250,17 +1250,23 @@ def Test_vim9_import_export()
delete('Xexport.vim') delete('Xexport.vim')
# Check that in a Vim9 script 'cpo' is set to the Vim default. # Check that in a Vim9 script 'cpo' is set to the Vim default.
set cpo&vi # Flags added or removed are also applied to the restored value.
var cpo_before = &cpo set cpo=abcd
var lines =<< trim END var lines =<< trim END
vim9script vim9script
g:cpo_in_vim9script = &cpo g:cpo_in_vim9script = &cpo
set cpo+=f
set cpo-=c
g:cpo_after_vim9script = &cpo
END END
writefile(lines, 'Xvim9_script') writefile(lines, 'Xvim9_script')
source Xvim9_script source Xvim9_script
assert_equal(cpo_before, &cpo) assert_equal('fabd', &cpo)
set cpo&vim set cpo&vim
assert_equal(&cpo, g:cpo_in_vim9script) assert_equal(&cpo, g:cpo_in_vim9script)
var newcpo = substitute(&cpo, 'c', '', '') .. 'f'
assert_equal(newcpo, g:cpo_after_vim9script)
delete('Xvim9_script') delete('Xvim9_script')
enddef enddef

View File

@@ -750,6 +750,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 */
/**/
2616,
/**/ /**/
2615, 2615,
/**/ /**/