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

patch 8.1.1061: when substitute string throws error, substitute happens anyway

Problem:    When substitute string throws error, substitute happens anyway.
Solution:   Skip substitution when aborting. (closes #4161)
This commit is contained in:
Bram Moolenaar
2019-03-27 22:53:53 +01:00
parent 760285dd4f
commit 0e97b94875
3 changed files with 38 additions and 1 deletions

View File

@@ -5574,7 +5574,12 @@ do_sub(exarg_T *eap)
sub_firstlnum - regmatch.startpos[0].lnum,
sub, sub_firstline, FALSE, p_magic, TRUE);
#ifdef FEAT_EVAL
/* Don't keep flags set by a recursive call. */
// If getting the substitute string caused an error, don't do
// the replacement.
if (aborting())
goto skip;
// Don't keep flags set by a recursive call.
subflags = subflags_save;
if (subflags.do_count)
{

View File

@@ -610,3 +610,33 @@ func Test_sub_cmd_8()
enew!
set titlestring&
endfunc
func Test_nocatch_sub_failure_handling()
" normal error results in all replacements
func! Foo()
foobar
endfunc
new
call setline(1, ['1 aaa', '2 aaa', '3 aaa'])
%s/aaa/\=Foo()/g
call assert_equal(['1 0', '2 0', '3 0'], getline(1, 3))
" Trow without try-catch causes abort after the first line.
" We cannot test this, since it would stop executing the test script.
" try/catch does not result in any changes
func! Foo()
throw 'error'
endfunc
call setline(1, ['1 aaa', '2 aaa', '3 aaa'])
let error_caught = 0
try
%s/aaa/\=Foo()/g
catch
let error_caught = 1
endtry
call assert_equal(1, error_caught)
call assert_equal(['1 aaa', '2 aaa', '3 aaa'], getline(1, 3))
bwipe!
endfunc

View File

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