Commit: patch 9.2.0639: gq with 'formatprg' fails on an empty buffer

1 view
Skip to first unread message

Christian Brabandt

unread,
Jun 13, 2026, 3:45:15 PM (11 hours ago) Jun 13
to vim...@googlegroups.com
patch 9.2.0639: gq with 'formatprg' fails on an empty buffer

Commit: https://github.com/vim/vim/commit/aefbca2977653a96f11061da80d6b72587497fb7
Author: glepnir <gleph...@gmail.com>
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 <gleph...@gmail.com>
Signed-off-by: Christian Brabandt <c...@256bit.org>

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,
/**/
Reply all
Reply to author
Forward
0 new messages