fix(prompt): cursor on prompt line, disallow ":edit" #34736

* fix: ensure :edit can not be use on prompt buffer
* fix: starting editing on prompt-line doesn't put cursor at the end
This commit is contained in:
Shadman
2025-07-30 07:36:01 +06:00
committed by GitHub
parent 1256daeead
commit 807a65b2da
4 changed files with 57 additions and 3 deletions

View File

@@ -1532,7 +1532,10 @@ static void init_prompt(int cmdchar_todo)
{ {
char *prompt = prompt_text(); char *prompt = prompt_text();
if (curwin->w_cursor.lnum < curbuf->b_prompt_start.mark.lnum) { if (curwin->w_cursor.lnum < curbuf->b_prompt_start.mark.lnum
|| (cmdchar_todo != 'O'
&& curwin->w_cursor.lnum == curbuf->b_prompt_start.mark.lnum
&& (curwin->w_cursor.col < (int)strlen(prompt_text())))) {
curwin->w_cursor.lnum = curbuf->b_ml.ml_line_count; curwin->w_cursor.lnum = curbuf->b_ml.ml_line_count;
coladvance(curwin, MAXCOL); coladvance(curwin, MAXCOL);
} }

View File

@@ -5718,6 +5718,12 @@ static void ex_edit(exarg_T *eap)
return; return;
} }
// prevent use of :edit on prompt-buffers
if (bt_prompt(curbuf) && eap->cmdidx == CMD_edit && *eap->arg == NUL) {
emsg("cannot :edit a prompt buffer");
return;
}
do_exedit(eap, NULL); do_exedit(eap, NULL);
} }

View File

@@ -130,6 +130,10 @@ describe('prompt buffer', function()
{1:~ }|*3 {1:~ }|*3
{5:-- INSERT --} | {5:-- INSERT --} |
]]) ]])
-- :edit doesn't apply on prompt buffer
eq('Vim(edit):cannot :edit a prompt buffer', t.pcall_err(api.nvim_command, 'edit'))
feed('<C-U>exit\n') feed('<C-U>exit\n')
screen:expect([[ screen:expect([[
^other buffer | ^other buffer |
@@ -297,6 +301,47 @@ describe('prompt buffer', function()
{1:~ }|*6 {1:~ }|*6
{5:-- INSERT --} | {5:-- INSERT --} |
]]) ]])
-- ensure cursor gets adjusted to end of user-text to prompt when insert mode
-- is entered from readonly region of prompt buffer
local prompt_pos = api.nvim_buf_get_mark(0, ':')
feed('<esc>')
-- works before prompt
api.nvim_win_set_cursor(0, { prompt_pos[1] - 1, 0 })
screen:expect([[
^other buffer |
% line1 |
line2 |
{1:~ }|*6
|
]])
feed('a')
feed('<esc>')
screen:expect([[
other buffer |
% line1 |
line^2 |
{1:~ }|*6
|
]])
-- works on prompt
api.nvim_win_set_cursor(0, { prompt_pos[1], 0 })
screen:expect([[
other buffer |
^% line1 |
line2 |
{1:~ }|*6
|
]])
feed('a')
feed('<esc>')
screen:expect([[
other buffer |
% line1 |
line^2 |
{1:~ }|*6
|
]])
end) end)
it('can put (p) multiline text', function() it('can put (p) multiline text', function()

View File

@@ -859,7 +859,7 @@ func Test_BufReadCmdNofile()
\ 'quickfix', \ 'quickfix',
\ 'help', \ 'help',
"\ 'terminal', "\ 'terminal',
\ 'prompt', "\ 'prompt',
"\ 'popup', "\ 'popup',
\ ] \ ]
new somefile new somefile
@@ -977,7 +977,7 @@ func Test_BufEnter()
\ 'quickfix', \ 'quickfix',
\ 'help', \ 'help',
"\ 'terminal', "\ 'terminal',
\ 'prompt', "\ 'prompt',
"\ 'popup', "\ 'popup',
\ ] \ ]
new somefile new somefile