neovim

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

commit 807a65b2da5390aa930ea11c12df2e60174420f1
parent 1256daeead27722263614c1e57899dff6d802b98
Author: Shadman <shadmansaleh3@gmail.com>
Date:   Wed, 30 Jul 2025 07:36:01 +0600

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
Diffstat:
Msrc/nvim/edit.c | 5++++-
Msrc/nvim/ex_docmd.c | 6++++++
Mtest/functional/legacy/prompt_buffer_spec.lua | 45+++++++++++++++++++++++++++++++++++++++++++++
Mtest/old/testdir/test_autocmd.vim | 4++--
4 files changed, 57 insertions(+), 3 deletions(-)

diff --git a/src/nvim/edit.c b/src/nvim/edit.c @@ -1532,7 +1532,10 @@ static void init_prompt(int cmdchar_todo) { 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; coladvance(curwin, MAXCOL); } diff --git a/src/nvim/ex_docmd.c b/src/nvim/ex_docmd.c @@ -5718,6 +5718,12 @@ static void ex_edit(exarg_T *eap) 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); } diff --git a/test/functional/legacy/prompt_buffer_spec.lua b/test/functional/legacy/prompt_buffer_spec.lua @@ -130,6 +130,10 @@ describe('prompt buffer', function() {1:~ }|*3 {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') screen:expect([[ ^other buffer | @@ -297,6 +301,47 @@ describe('prompt buffer', function() {1:~ }|*6 {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) it('can put (p) multiline text', function() diff --git a/test/old/testdir/test_autocmd.vim b/test/old/testdir/test_autocmd.vim @@ -859,7 +859,7 @@ func Test_BufReadCmdNofile() \ 'quickfix', \ 'help', "\ 'terminal', - \ 'prompt', + "\ 'prompt', "\ 'popup', \ ] new somefile @@ -977,7 +977,7 @@ func Test_BufEnter() \ 'quickfix', \ 'help', "\ 'terminal', - \ 'prompt', + "\ 'prompt', "\ 'popup', \ ] new somefile