commit ad7f9a701cf25f598cb8ee3d05ad0604fa9a9a65
parent aa5f3a7962c3b96d1a939a83bf2dacad72d8e898
Author: zeertzjq <zeertzjq@outlook.com>
Date: Fri, 5 May 2023 20:48:25 +0800
vim-patch:8.2.2141: a user command with try/catch may not catch an expression error
Problem: A user command with try/catch may not catch an expression error.
Solution: When an expression fails check for following "|". (closes vim/vim#7469)
https://github.com/vim/vim/commit/8143a53c533bc7776c57e5db063d185bdd5750f3
Co-authored-by: Bram Moolenaar <Bram@vim.org>
Diffstat:
2 files changed, 30 insertions(+), 1 deletion(-)
diff --git a/src/nvim/eval.c b/src/nvim/eval.c
@@ -2369,7 +2369,11 @@ int eval0(char *arg, typval_T *rettv, exarg_T *eap, evalarg_T *const evalarg)
}
// Some of the expression may not have been consumed. Do not check for
- // a next command to avoid more errors.
+ // a next command to avoid more errors, unless "|" is following, which
+ // could only be a command separator.
+ if (eap != NULL && skipwhite(p)[0] == '|' && skipwhite(p)[1] != '|') {
+ eap->nextcmd = check_nextcmd(p);
+ }
return FAIL;
}
diff --git a/test/old/testdir/test_trycatch.vim b/test/old/testdir/test_trycatch.vim
@@ -2220,6 +2220,31 @@ func Test_BufEnter_exception()
%bwipe!
endfunc
+" Test for using try/catch in a user command with a failing expression {{{1
+func Test_user_command_try_catch()
+ let lines =<< trim END
+ function s:throw() abort
+ throw 'error'
+ endfunction
+
+ command! Execute
+ \ try
+ \ | let s:x = s:throw()
+ \ | catch
+ \ | let g:caught = 'caught'
+ \ | endtry
+
+ let g:caught = 'no'
+ Execute
+ call assert_equal('caught', g:caught)
+ END
+ call writefile(lines, 'XtestTryCatch')
+ source XtestTryCatch
+
+ call delete('XtestTryCatch')
+ unlet g:caught
+endfunc
+
" Test for using throw in a called function with following error {{{1
func Test_user_command_throw_in_function_call()
let lines =<< trim END