]> git.ipfire.org Git - thirdparty/vim.git/commitdiff
patch 9.1.1969: Wrong cursor position after formatting with long 'formatprg' v9.1.1969
authorzeertzjq <zeertzjq@outlook.com>
Thu, 11 Dec 2025 19:28:48 +0000 (20:28 +0100)
committerChristian Brabandt <cb@256bit.org>
Thu, 11 Dec 2025 19:28:48 +0000 (20:28 +0100)
Problem:  Wrong cursor position after formatting with long 'formatprg'.
Solution: Don't show hit-enter prompt when there are stuffed characters.

Previously a stuffed character at the hit-enter prompt will dismiss the
prompt immediately and be put in the typeahead buffer, which leads to
incorrect behavior as the typeahead buffer is processed after the stuff
buffers. Using vungetc() when KeyStuffed is TRUE can fix this problem,
but since the hit-enter prompt isn't visible anyway (and is likely not
desired here), just skip the prompt instead, which also avoids a wait
when using "wait" instead of "hit-enter" in 'messagesopt'.

fixes:  #18905
closes: #18906

Signed-off-by: zeertzjq <zeertzjq@outlook.com>
Signed-off-by: Christian Brabandt <cb@256bit.org>
src/getchar.c
src/message.c
src/testdir/dumps/Test_long_formatprg_no_hit_enter_1.dump [new file with mode: 0644]
src/testdir/dumps/Test_long_formatprg_no_hit_enter_2.dump [new file with mode: 0644]
src/testdir/dumps/Test_long_formatprg_no_hit_enter_3.dump [new file with mode: 0644]
src/testdir/test_messages.vim
src/version.c

index a7b9741bd345182df06708a9b42a53ddd71c221d..bc2bcfdb57d5840353f351add990efb682412d7d 100644 (file)
@@ -439,7 +439,7 @@ stuff_empty(void)
 #if defined(FEAT_EVAL)
 /*
  * Return TRUE if readbuf1 is empty.  There may still be redo characters in
- * redbuf2.
+ * readbuf2.
  */
     int
 readbuf1_empty(void)
index 4b93b248a8248bd2197e9b503ddcb765dcca13f8..97785beb148224883b0729303f5da65671171c87 100644 (file)
@@ -1287,6 +1287,11 @@ wait_return(int redraw)
        c = CAR;                // no need for a return in ex mode
        got_int = FALSE;
     }
+    else if (!stuff_empty())
+       // When there are stuffed characters, the next stuffed character will
+       // dismiss the hit-enter prompt immediately and have to be put back, so
+       // instead just don't show the hit-enter prompt at all.
+       c = CAR;
     else
     {
        // Make sure the hit-return prompt is on screen when 'guioptions' was
diff --git a/src/testdir/dumps/Test_long_formatprg_no_hit_enter_1.dump b/src/testdir/dumps/Test_long_formatprg_no_hit_enter_1.dump
new file mode 100644 (file)
index 0000000..78fd701
--- /dev/null
@@ -0,0 +1,10 @@
+>1+0&#ffffff0|0| @72
+|1@1| @72
+|1|2| @72
+|1|3| @72
+|1|4| @72
+|1|5| @72
+|1|6| @72
+|1|7| @72
+|1|8| @72
+@57|1|0|,|1| @9|2|9|%| 
diff --git a/src/testdir/dumps/Test_long_formatprg_no_hit_enter_2.dump b/src/testdir/dumps/Test_long_formatprg_no_hit_enter_2.dump
new file mode 100644 (file)
index 0000000..32b0548
--- /dev/null
@@ -0,0 +1,10 @@
+|1+0&#ffffff0|0| @72
+|1|0| @72
+|1@1| @72
+|1@1| @72
+|1|2| @72
+>1|2| @72
+|1|3| @72
+|1|4| @72
+|1|5| @72
+@57|1|5|,|1| @9|2|6|%| 
diff --git a/src/testdir/dumps/Test_long_formatprg_no_hit_enter_3.dump b/src/testdir/dumps/Test_long_formatprg_no_hit_enter_3.dump
new file mode 100644 (file)
index 0000000..c58bc4f
--- /dev/null
@@ -0,0 +1,10 @@
+|1+0&#ffffff0|0| @72
+|1|0| @72
+|1@1| @72
+|1@1| @72
+|1|2| @72
+>1|2| @72
+|1|3| @72
+|1|4| @72
+|1|5| @72
+|3| |l|i|n|e|s| |f|i|l|t|e|r|e|d| @40|1|5|,|1| @9|2|6|%| 
index 8fddcbc43f72533612e550a89d29eaded51056ef..0942fe2b80b0255f647bbd0731a4febd870ba007 100644 (file)
@@ -786,4 +786,29 @@ func Test_messagesopt_wait()
   call StopVimInTerminal(buf)
 endfunc
 
+" Check that using a long 'formatprg' doesn't cause a hit-enter prompt or
+" wrong cursor position.
+func Test_long_formatprg_no_hit_enter()
+  CheckScreendump
+  CheckExecutable sed
+
+  let lines =<< trim END
+    setlocal scrolloff=0
+    call setline(1, range(1, 40))
+    let &l:formatprg = $'sed{repeat(' ', &columns)}p'
+    normal 20Gmz
+    normal 10Gzt
+  END
+  call writefile(lines, 'XtestLongFormatprg', 'D')
+  let buf = RunVimInTerminal('-S XtestLongFormatprg', #{rows: 10})
+  call VerifyScreenDump(buf, 'Test_long_formatprg_no_hit_enter_1', {})
+  call term_sendkeys(buf, 'gq2j')
+  call VerifyScreenDump(buf, 'Test_long_formatprg_no_hit_enter_2', {})
+  call term_sendkeys(buf, ":messages\<CR>")
+  call VerifyScreenDump(buf, 'Test_long_formatprg_no_hit_enter_3', {})
+
+  " clean up
+  call StopVimInTerminal(buf)
+endfunc
+
 " vim: shiftwidth=2 sts=2 expandtab
index 137bda494ee9e05361649f7521328169cff9fc83..6b6dde51ebeae65277203edebabe993a9584f904 100644 (file)
@@ -729,6 +729,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    1969,
 /**/
     1968,
 /**/