mirror of
https://github.com/vim/vim.git
synced 2025-09-24 03:44:06 -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:
@@ -5574,7 +5574,12 @@ do_sub(exarg_T *eap)
|
|||||||
sub_firstlnum - regmatch.startpos[0].lnum,
|
sub_firstlnum - regmatch.startpos[0].lnum,
|
||||||
sub, sub_firstline, FALSE, p_magic, TRUE);
|
sub, sub_firstline, FALSE, p_magic, TRUE);
|
||||||
#ifdef FEAT_EVAL
|
#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;
|
subflags = subflags_save;
|
||||||
if (subflags.do_count)
|
if (subflags.do_count)
|
||||||
{
|
{
|
||||||
|
@@ -610,3 +610,33 @@ func Test_sub_cmd_8()
|
|||||||
enew!
|
enew!
|
||||||
set titlestring&
|
set titlestring&
|
||||||
endfunc
|
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
|
||||||
|
@@ -775,6 +775,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 */
|
||||||
|
/**/
|
||||||
|
1061,
|
||||||
/**/
|
/**/
|
||||||
1060,
|
1060,
|
||||||
/**/
|
/**/
|
||||||
|
Reference in New Issue
Block a user