From ecce3497fa9e1a7452ccfa8ba9cbdadb92bfb7fb Mon Sep 17 00:00:00 2001 From: Bjoern Foersterling Date: Tue, 9 Dec 2025 13:27:00 +0100 Subject: [PATCH] patch 9.1.1965: q can accidentally start recording at more prompt MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Problem: When exiting at the end of the more prompt (at the hit enter prompt) by hitting q the recording mode will be started. (Jakub Łuczyński) Solution: Don't add the q key to the typeahead buffer in the function wait_return (Bjoern Foersterling) fixes: #2589 closes: #18889 Signed-off-by: Bjoern Foersterling Signed-off-by: Christian Brabandt --- runtime/doc/message.txt | 4 +++- src/message.c | 3 ++- src/testdir/test_messages.vim | 19 +++++++++++++++++++ src/version.c | 2 ++ 4 files changed, 26 insertions(+), 2 deletions(-) diff --git a/runtime/doc/message.txt b/runtime/doc/message.txt index 2411440f49..cbbd3f4c34 100644 --- a/runtime/doc/message.txt +++ b/runtime/doc/message.txt @@ -1,4 +1,4 @@ -*message.txt* For Vim version 9.1. Last change: 2025 Nov 09 +*message.txt* For Vim version 9.1. Last change: 2025 Dec 09 VIM REFERENCE MANUAL by Bram Moolenaar @@ -848,6 +848,8 @@ and the screen is about to be redrawn: like pressing . This makes it impossible to select text though. -> For the GUI clicking the left mouse button in the last line works like pressing . +-> |q| won't start recording into a register (rationale: it is often used as + "quit" prompt key by users) If you accidentally hit or and you want to see the displayed text then use |g<|. This only works when 'more' is set. diff --git a/src/message.c b/src/message.c index b667625539..4b93b248a8 100644 --- a/src/message.c +++ b/src/message.c @@ -1414,7 +1414,8 @@ wait_return(int redraw) if (c == K_LEFTMOUSE || c == K_MIDDLEMOUSE || c == K_RIGHTMOUSE || c == K_X1MOUSE || c == K_X2MOUSE) (void)jump_to_mouse(MOUSE_SETPOS, NULL, 0); - else if (vim_strchr((char_u *)"\r\n ", c) == NULL && c != Ctrl_C) + else if (vim_strchr((char_u *)"\r\n ", c) == NULL && c != Ctrl_C + && c != 'q') { // Put the character back in the typeahead buffer. Don't use // the stuff buffer, because lmaps wouldn't work. diff --git a/src/testdir/test_messages.vim b/src/testdir/test_messages.vim index 2dca0e36dc..8fddcbc43f 100644 --- a/src/testdir/test_messages.vim +++ b/src/testdir/test_messages.vim @@ -340,6 +340,25 @@ func Test_message_more() call StopVimInTerminal(buf) endfunc +func Test_message_more_recording() + CheckRunVimInTerminal + let buf = RunVimInTerminal('', {'rows': 6}) + call term_sendkeys(buf, ":call setline(1, range(1, 100))\n") + call term_sendkeys(buf, ":%p\n") + call WaitForAssert({-> assert_equal('-- More --', term_getline(buf, 6))}) + call term_sendkeys(buf, 'G') + call WaitForAssert({-> assert_equal('Press ENTER or type command to continue', term_getline(buf, 6))}) + + " Hitting 'q' at the end of the more prompt should not start recording + call term_sendkeys(buf, 'q') + call WaitForAssert({-> assert_equal(5, term_getcursor(buf)[0])}) + " Hitting 'k' now should move the cursor up instead of recording keys + call term_sendkeys(buf, 'k') + call WaitForAssert({-> assert_equal(4, term_getcursor(buf)[0])}) + + call StopVimInTerminal(buf) +endfunc + " Test more-prompt scrollback func Test_message_more_scrollback() CheckScreendump diff --git a/src/version.c b/src/version.c index fef7febbb9..beda34d856 100644 --- a/src/version.c +++ b/src/version.c @@ -729,6 +729,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 1965, /**/ 1964, /**/