neovim

Neovim text editor
git clone https://git.dasho.dev/neovim.git
Log | Files | Refs | README

commit 1abdb3224b177078b046873dadb81381960ad52b
parent d079995fb81bf3d61f7698373442f61476b99fce
Author: zeertzjq <zeertzjq@outlook.com>
Date:   Tue, 12 Jul 2022 12:37:23 +0800

vim-patch:8.2.2732: prompt for s///c in Ex mode can be wrong

Problem:    Prompt for s///c in Ex mode can be wrong.
Solution:   Position the cursor before showing the prompt. (closes vim/vim#8073)
https://github.com/vim/vim/commit/e5b0b98a90acf420bb611fc99534982c98d0645b

Diffstat:
Msrc/nvim/ex_cmds.c | 1+
Msrc/nvim/testdir/test_ex_mode.vim | 3+++
Mtest/functional/legacy/ex_mode_spec.lua | 56+++++++++++++++++++++++++++++++++++---------------------
3 files changed, 39 insertions(+), 21 deletions(-)

diff --git a/src/nvim/ex_cmds.c b/src/nvim/ex_cmds.c @@ -3874,6 +3874,7 @@ static int do_sub(exarg_T *eap, proftime_T timeout, long cmdpreview_ns, handle_T curwin->w_cursor.col = 0; } getvcol(curwin, &curwin->w_cursor, NULL, NULL, &ec); + curwin->w_cursor.col = regmatch.startpos[0].col; if (subflags.do_number || curwin->w_p_nu) { int numw = number_width(curwin) + 1; sc += numw; diff --git a/src/nvim/testdir/test_ex_mode.vim b/src/nvim/testdir/test_ex_mode.vim @@ -78,6 +78,9 @@ func Test_Ex_substitute() call WaitForAssert({-> assert_match(' 1 foo foo', term_getline(buf, 5))}, \ 1000) call WaitForAssert({-> assert_match(' ^^^', term_getline(buf, 6))}, 1000) + call term_sendkeys(buf, "N\<CR>") + call term_wait(buf) + call WaitForAssert({-> assert_match(' ^^^', term_getline(buf, 6))}, 1000) call term_sendkeys(buf, "n\<CR>") call WaitForAssert({-> assert_match(' ^^^', term_getline(buf, 6))}, \ 1000) diff --git a/test/functional/legacy/ex_mode_spec.lua b/test/functional/legacy/ex_mode_spec.lua @@ -44,67 +44,81 @@ describe('Ex mode', function() it('substitute confirmation prompt', function() command('set noincsearch nohlsearch inccommand=') local screen = Screen.new(60, 6) + screen:set_default_attr_ids({ + [0] = {bold = true, reverse = true}, -- MsgSeparator + [1] = {foreground = Screen.colors.Brown}, -- LineNr + [2] = {bold = true, foreground = Screen.colors.Blue}, -- NonText + }) screen:attach() command([[call setline(1, ['foo foo', 'foo foo', 'foo foo'])]]) command([[set number]]) feed('gQ') screen:expect([[ - 1 foo foo | - 2 foo foo | - 3 foo foo | - | + {1: 1 }foo foo | + {1: 2 }foo foo | + {1: 3 }foo foo | + {0: }| Entering Ex mode. Type "visual" to go to Normal mode. | :^ | ]]) feed('%s/foo/bar/gc<CR>') screen:expect([[ - 1 foo foo | - | + {1: 1 }foo foo | + {0: }| Entering Ex mode. Type "visual" to go to Normal mode. | :%s/foo/bar/gc | - 1 foo foo | + {1: 1 }foo foo | ^^^^ | ]]) - feed('n<CR>') + feed('N<CR>') screen:expect([[ Entering Ex mode. Type "visual" to go to Normal mode. | :%s/foo/bar/gc | - 1 foo foo | + {1: 1 }foo foo | + ^^^N | + {1: 1 }foo foo | + ^^^^ | + ]]) + feed('n<CR>') + screen:expect([[ + {1: 1 }foo foo | + ^^^N | + {1: 1 }foo foo | ^^^n | - 1 foo foo | + {1: 1 }foo foo | ^^^^ | ]]) feed('y<CR>') feed('q<CR>') screen:expect([[ - 1 foo foo | + {1: 1 }foo foo | ^^^y | - 2 foo foo | + {1: 2 }foo foo | ^^^q | - 2 foo foo | + {1: 2 }foo foo | :^ | ]]) -- Pressing enter in ex mode should print the current line feed('<CR>') screen:expect([[ - 1 foo foo | + {1: 1 }foo foo | ^^^y | - 2 foo foo | + {1: 2 }foo foo | ^^^q | - 3 foo foo | + {1: 3 }foo foo | :^ | ]]) feed(':vi<CR>') screen:expect([[ - 1 foo bar | - 2 foo foo | - 3 ^foo foo | - ~ | - ~ | + {1: 1 }foo bar | + {1: 2 }foo foo | + {1: 3 }^foo foo | + {2:~ }| + {2:~ }| | ]]) end)