patch 9.2.0639: gq with 'formatprg' fails on an empty buffer
Commit:
https://github.com/vim/vim/commit/aefbca2977653a96f11061da80d6b72587497fb7
Author: glepnir <[email protected]>
Date: Sat Jun 13 19:32:44 2026 +0000
patch 9.2.0639: gq with 'formatprg' fails on an empty buffer
Problem: gq (and other filters) on an empty buffer fail with
"E20: Mark not set": when the filter produces no output,
do_filter() still subtracts the line count from '[ and '],
pushing '] to line 0.
Solution: when the filter produces no output, put '[ and '] on a valid
line instead of subtracting past line 1 (glepnir).
related: neovim/neovim#30593
closes: #19061
Signed-off-by: glepnir <[email protected]>
Signed-off-by: Christian Brabandt <[email protected]>
diff --git a/src/ex_cmds.c b/src/ex_cmds.c
index b2fc85c99..803a10a2d 100644
--- a/src/ex_cmds.c
+++ b/src/ex_cmds.c
@@ -1516,8 +1516,18 @@ do_filter(
*/
curwin->w_cursor.lnum = line1;
del_lines(linecount, TRUE);
- curbuf->b_op_start.lnum -= linecount; // adjust '[
- curbuf->b_op_end.lnum -= linecount; // adjust ']
+ if (read_linecount == 0)
+ {
+ // no filter output: clamp '[ and '] to a valid line
+ curbuf->b_op_start.lnum = curbuf->b_op_end.lnum =
+ MIN(line1, curbuf->b_ml.ml_line_count);
+ curbuf->b_op_start.col = curbuf->b_op_end.col = 0;
+ }
+ else
+ {
+ curbuf->b_op_start.lnum -= linecount; // adjust '[
+ curbuf->b_op_end.lnum -= linecount; // adjust ']
+ }
write_lnum_adjust(-linecount); // adjust last line
// for next write
#ifdef FEAT_FOLDING
diff --git a/src/testdir/test_marks.vim b/src/testdir/test_marks.vim
index 61bfade62..d4b01dfda 100644
--- a/src/testdir/test_marks.vim
+++ b/src/testdir/test_marks.vim
@@ -329,5 +329,26 @@ func Test_jump_mark_autocmd()
bwipe!
endfunc
+func Test_mark_formatprg_on_empty()
+ new
+ if has('win32')
+ setl formatprg=more
+ else
+ setl formatprg=cat
+ endif
+ call assert_equal([0, 0], [line("'["), col("'[")])
+ call assert_equal([0, 0], [line("']"), col("']")])
+ let v:errmsg = ''
+ try
+ norm! gqG
+ catch
+ call assert_report('gqG on empty buffer should not fail: ' .. v:exception)
+ endtry
+ call assert_true(empty(v:errmsg))
+ " col() is 1-based, so 1 == first column (:marks shows it as 0)
+ call assert_equal([1, 1], [line("'["), col("'[")])
+ call assert_equal([1, 1], [line("']"), col("']")])
+ bwipe!
+endfunc
" vim: shiftwidth=2 sts=2 expandtab
diff --git a/src/version.c b/src/version.c
index d4d8e477f..1fdf8d1b0 100644
--- a/src/version.c
+++ b/src/version.c
@@ -759,6 +759,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
+/**/
+ 639,
/**/
638,
/**/
--
--
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php
---
You received this message because you are subscribed to the Google Groups
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To view this discussion visit
https://groups.google.com/d/msgid/vim_dev/E1wYUHv-00DUxB-TQ%40256bit.org.