diff --git a/src/nvim/getchar.c b/src/nvim/getchar.c index 6f4514c33d..ef96d0727e 100644 --- a/src/nvim/getchar.c +++ b/src/nvim/getchar.c @@ -425,7 +425,7 @@ bool stuff_empty(void) } /// @return true if readbuf1 is empty. There may still be redo characters in -/// redbuf2. +/// readbuf2. bool readbuf1_empty(void) FUNC_ATTR_PURE { diff --git a/src/nvim/message.c b/src/nvim/message.c index 2232784c07..65460f5a1e 100644 --- a/src/nvim/message.c +++ b/src/nvim/message.c @@ -1394,6 +1394,11 @@ void wait_return(int redraw) msg_puts(" "); // make sure the cursor is on the right line 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 { State = MODE_HITRETURN; setmouse(); diff --git a/test/functional/legacy/messages_spec.lua b/test/functional/legacy/messages_spec.lua index 6eb184040b..e2597965c3 100644 --- a/test/functional/legacy/messages_spec.lua +++ b/test/functional/legacy/messages_spec.lua @@ -1,3 +1,4 @@ +local t = require('test.testutil') local n = require('test.functional.testnvim')() local Screen = require('test.functional.ui.screen') @@ -6,6 +7,7 @@ local command = n.command local exec = n.exec local feed = n.feed local api = n.api +local fn = n.fn local nvim_dir = n.nvim_dir local assert_alive = n.assert_alive @@ -836,4 +838,52 @@ describe('messages', function() | ]]) end) + + -- oldtest: Test_long_formatprg_no_hit_enter() + it("long 'formatprg' doesn't cause hit-enter prompt or wrong cursor pos", function() + t.skip(fn.executable('sed') == 0, 'missing "sed" command') + + screen = Screen.new(75, 10) + exec([[ + setlocal scrolloff=0 + call setline(1, range(1, 40)) + let &l:formatprg = $'sed{repeat(' ', &columns)}p' + normal 20Gmz + normal 10Gzt + ]]) + screen:expect([[ + ^10 | + 11 | + 12 | + 13 | + 14 | + 15 | + 16 | + 17 | + 18 | + | + ]]) + feed('gq2j') + screen:expect([[ + 10 |*2 + 11 |*2 + 12 | + ^12 | + 13 | + 14 | + 15 | + | + ]]) + feed(':messages') + screen:expect([[ + 10 |*2 + 11 |*2 + 12 | + ^12 | + 13 | + 14 | + 15 | + 3 lines filtered | + ]]) + end) end) diff --git a/test/old/testdir/test_messages.vim b/test/old/testdir/test_messages.vim index e6e59e5dfe..a9374ef741 100644 --- a/test/old/testdir/test_messages.vim +++ b/test/old/testdir/test_messages.vim @@ -728,4 +728,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\") + call VerifyScreenDump(buf, 'Test_long_formatprg_no_hit_enter_3', {}) + + " clean up + call StopVimInTerminal(buf) +endfunc + " vim: shiftwidth=2 sts=2 expandtab