From 663bb2331626944cea156374858131fcd323b9e9 Mon Sep 17 00:00:00 2001 From: Bram Moolenaar Date: Thu, 22 Jun 2017 19:12:10 +0200 Subject: patch 8.0.0654: no warning for text after :endfunction Problem: Text found after :endfunction is silently ignored. Solution: Give a warning if 'verbose' is set. When | or \n are used, execute the text as a command. --- runtime/doc/eval.txt | 24 +++++++++++++++++++----- src/testdir/test_vimscript.vim | 27 +++++++++++++++++++++++++++ src/userfunc.c | 8 ++++++++ src/version.c | 2 ++ 4 files changed, 56 insertions(+), 5 deletions(-) diff --git a/runtime/doc/eval.txt b/runtime/doc/eval.txt index dec960bb78..19eb673039 100644 --- a/runtime/doc/eval.txt +++ b/runtime/doc/eval.txt @@ -1,4 +1,4 @@ -*eval.txt* For Vim version 8.0. Last change: 2017 Jun 13 +*eval.txt* For Vim version 8.0. Last change: 2017 Jun 22 VIM REFERENCE MANUAL by Bram Moolenaar @@ -8764,18 +8764,32 @@ See |:verbose-cmd| for more information. implies that the effect of |:nohlsearch| is undone when the function returns. - *:endf* *:endfunction* *E126* *E193* -:endf[unction] The end of a function definition. Must be on a line - by its own, without other commands. + *:endf* *:endfunction* *E126* *E193* *E946* +:endf[unction] [argument] + The end of a function definition. Best is to put it + on a line by its own, without [argument]. + + [argument] can be: + | command command to execute next + \n command command to execute next + " comment always ignored + anything else ignored, unless 'verbose' is + non-zero + The support for a following command was added in Vim + 8.0.0654, before that any argument was silently + ignored. *:delf* *:delfunction* *E130* *E131* *E933* -:delf[unction] {name} Delete function {name}. +:delf[unction][!] {name} + Delete function {name}. {name} can also be a |Dictionary| entry that is a |Funcref|: > :delfunc dict.init < This will remove the "init" entry from "dict". The function is deleted if there are no more references to it. + With the ! there is no error if the function does not + exist. *:retu* *:return* *E133* :retu[rn] [expr] Return from a function. When "[expr]" is given, it is evaluated and returned as the result of the function. diff --git a/src/testdir/test_vimscript.vim b/src/testdir/test_vimscript.vim index f4d2cd03d5..6f5a73fb86 100644 --- a/src/testdir/test_vimscript.vim +++ b/src/testdir/test_vimscript.vim @@ -1363,6 +1363,33 @@ func Test_bitwise_functions() call assert_fails("call invert({})", 'E728:') endfunc +" Test trailing text after :endfunction {{{1 +func Test_endfunction_trailing() + call assert_false(exists('*Xtest')) + + exe "func Xtest()\necho 'hello'\nendfunc\nlet done = 'yes'" + call assert_true(exists('*Xtest')) + call assert_equal('yes', done) + delfunc Xtest + unlet done + + exe "func Xtest()\necho 'hello'\nendfunc|let done = 'yes'" + call assert_true(exists('*Xtest')) + call assert_equal('yes', done) + delfunc Xtest + unlet done + + set verbose=1 + exe "func Xtest()\necho 'hello'\nendfunc \" garbage" + call assert_true(exists('*Xtest')) + delfunc Xtest + + call assert_fails("func Xtest()\necho 'hello'\nendfunc garbage", 'E946') + call assert_true(exists('*Xtest')) + delfunc Xtest + set verbose=0 +endfunc + "------------------------------------------------------------------------------- " Modelines {{{1 " vim: ts=8 sw=4 tw=80 fdm=marker diff --git a/src/userfunc.c b/src/userfunc.c index 859e6ebec0..de089bb68d 100644 --- a/src/userfunc.c +++ b/src/userfunc.c @@ -2130,6 +2130,14 @@ ex_function(exarg_T *eap) /* Check for "endfunction". */ if (checkforcmd(&p, "endfunction", 4) && nesting-- == 0) { + if (*p == '|') + /* Another command follows. */ + eap->nextcmd = vim_strsave(p + 1); + else if (line_arg != NULL && *skipwhite(line_arg) != NUL) + /* Another command follows. */ + eap->nextcmd = line_arg; + else if (*p != NUL && *p != '"' && p_verbose > 0) + EMSG2((char_u *)_("E946: Text found after :endfunction: %s"), p); if (line_arg == NULL) vim_free(theline); break; diff --git a/src/version.c b/src/version.c index 149a83f882..1e7d648618 100644 --- a/src/version.c +++ b/src/version.c @@ -764,6 +764,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 654, /**/ 653, /**/ -- cgit v1.2.3