mirror of
https://github.com/vim/vim.git
synced 2025-12-13 20:36:39 +01:00
patch 9.1.1969: Wrong cursor position after formatting with long 'formatprg'
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>
This commit is contained in:
committed by
Christian Brabandt
parent
44d480e0c3
commit
50325c3d59
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
10
src/testdir/dumps/Test_long_formatprg_no_hit_enter_1.dump
Normal file
10
src/testdir/dumps/Test_long_formatprg_no_hit_enter_1.dump
Normal file
@@ -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|%|
|
||||
10
src/testdir/dumps/Test_long_formatprg_no_hit_enter_2.dump
Normal file
10
src/testdir/dumps/Test_long_formatprg_no_hit_enter_2.dump
Normal file
@@ -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|%|
|
||||
10
src/testdir/dumps/Test_long_formatprg_no_hit_enter_3.dump
Normal file
10
src/testdir/dumps/Test_long_formatprg_no_hit_enter_3.dump
Normal file
@@ -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|%|
|
||||
@@ -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
|
||||
|
||||
@@ -729,6 +729,8 @@ static char *(features[]) =
|
||||
|
||||
static int included_patches[] =
|
||||
{ /* Add new patch number below this line */
|
||||
/**/
|
||||
1969,
|
||||
/**/
|
||||
1968,
|
||||
/**/
|
||||
|
||||
Reference in New Issue
Block a user