Mercurial > vim
changeset 24150:4919f2d8d7fd v8.2.2616
patch 8.2.2616: Vim9: if 'cpo' is change in Vim9 script it may be restored
Commit: https://github.com/vim/vim/commit/3e1916947d5b29f67af554ce3b874b03a84c9093
Author: Bram Moolenaar <Bram@vim.org>
Date: Wed Mar 17 17:46:00 2021 +0100
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.
author | Bram Moolenaar <Bram@vim.org> |
---|---|
date | Wed, 17 Mar 2021 18:00:04 +0100 |
parents | 68189fc87087 |
children | 6eae6237cc7d |
files | runtime/doc/vim9.txt src/scriptfile.c src/testdir/test_vim9_script.vim src/version.c |
diffstat | 4 files changed, 41 insertions(+), 4 deletions(-) [+] |
line wrap: on
line diff
--- a/runtime/doc/vim9.txt +++ b/runtime/doc/vim9.txt @@ -1082,7 +1082,9 @@ A side effect of `:vim9script` is that t Vim default value, like with: > :set cpo&vim 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* There is one way to use both legacy and Vim9 syntax in one script file: >
--- a/src/scriptfile.c +++ b/src/scriptfile.c @@ -1459,6 +1459,33 @@ almosttheend: si = SCRIPT_ITEM(current_sctx.sc_sid); 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); VIM_CLEAR(si->sn_save_cpo); }
--- a/src/testdir/test_vim9_script.vim +++ b/src/testdir/test_vim9_script.vim @@ -1250,17 +1250,23 @@ def Test_vim9_import_export() delete('Xexport.vim') # Check that in a Vim9 script 'cpo' is set to the Vim default. - set cpo&vi - var cpo_before = &cpo + # Flags added or removed are also applied to the restored value. + set cpo=abcd var lines =<< trim END vim9script g:cpo_in_vim9script = &cpo + set cpo+=f + set cpo-=c + g:cpo_after_vim9script = &cpo END writefile(lines, 'Xvim9_script') source Xvim9_script - assert_equal(cpo_before, &cpo) + assert_equal('fabd', &cpo) set cpo&vim assert_equal(&cpo, g:cpo_in_vim9script) + var newcpo = substitute(&cpo, 'c', '', '') .. 'f' + assert_equal(newcpo, g:cpo_after_vim9script) + delete('Xvim9_script') enddef