diff options
author | Jan Edmund Lazo <jan.lazo@mail.utoronto.ca> | 2018-11-06 07:49:20 -0500 |
---|---|---|
committer | Justin M. Keyes <justinkz@gmail.com> | 2018-11-06 13:49:20 +0100 |
commit | f08869cff2eae65eede8df41fab274c77dd76c60 (patch) | |
tree | b0ffeef87abc0b3a62c1b2e1ad20c7ccad032a3c /src | |
parent | 5320eb57df01e57ace29ab841d6f912bc2c88ade (diff) | |
download | rneovim-f08869cff2eae65eede8df41fab274c77dd76c60.tar.gz rneovim-f08869cff2eae65eede8df41fab274c77dd76c60.tar.bz2 rneovim-f08869cff2eae65eede8df41fab274c77dd76c60.zip |
vim-patch:8.1.0511: ml_get error when calling a function with a range (#9207)
Problem: ml_get error when calling a function with a range.
Solution: Don't position the cursor after the last line.
https://github.com/vim/vim/commit/9e353b5265bd7fa103caf4e5a9b3c99f344f548e
Diffstat (limited to 'src')
-rw-r--r-- | src/nvim/eval.c | 6 | ||||
-rw-r--r-- | src/nvim/testdir/test_functions.vim | 19 |
2 files changed, 25 insertions, 0 deletions
diff --git a/src/nvim/eval.c b/src/nvim/eval.c index 4e0e3f6f1f..2fb9bd7367 100644 --- a/src/nvim/eval.c +++ b/src/nvim/eval.c @@ -2728,6 +2728,12 @@ void ex_call(exarg_T *eap) lnum = eap->line1; for (; lnum <= eap->line2; lnum++) { if (eap->addr_count > 0) { // -V560 + if (lnum > curbuf->b_ml.ml_line_count) { + // If the function deleted lines or switched to another buffer + // the line number may become invalid. + EMSG(_(e_invrange)); + break; + } curwin->w_cursor.lnum = lnum; curwin->w_cursor.col = 0; curwin->w_cursor.coladd = 0; diff --git a/src/nvim/testdir/test_functions.vim b/src/nvim/testdir/test_functions.vim index b1138bfc96..7dc9f31ce7 100644 --- a/src/nvim/testdir/test_functions.vim +++ b/src/nvim/testdir/test_functions.vim @@ -1018,3 +1018,22 @@ func Test_trim() let chars = join(map(range(1, 0x20) + [0xa0], {n -> nr2char(n)}), '') call assert_equal("x", trim(chars . "x" . chars)) endfunc + +func EditAnotherFile() + let word = expand('<cword>') + edit Xfuncrange2 +endfunc + +func Test_func_range_with_edit() + " Define a function that edits another buffer, then call it with a range that + " is invalid in that buffer. + call writefile(['just one line'], 'Xfuncrange2') + new + call setline(1, range(10)) + write Xfuncrange1 + call assert_fails('5,8call EditAnotherFile()', 'E16:') + + call delete('Xfuncrange1') + call delete('Xfuncrange2') + bwipe! +endfunc |