aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--runtime/lua/vim/snippet.lua10
-rw-r--r--src/nvim/api/window.c2
-rw-r--r--src/nvim/ex_getln.c5
-rw-r--r--test/functional/api/window_spec.lua15
-rw-r--r--test/functional/lua/snippet_spec.lua27
-rw-r--r--test/functional/ui/cmdline_spec.lua23
6 files changed, 73 insertions, 9 deletions
diff --git a/runtime/lua/vim/snippet.lua b/runtime/lua/vim/snippet.lua
index 5e60efa778..2ffd89367f 100644
--- a/runtime/lua/vim/snippet.lua
+++ b/runtime/lua/vim/snippet.lua
@@ -446,14 +446,18 @@ function M.expand(input)
base_indent = base_indent .. (snippet_lines[#snippet_lines]:match('(^%s*)%S') or '') --- @type string
end
+ local shiftwidth = vim.fn.shiftwidth()
+ local curbuf = vim.api.nvim_get_current_buf()
+ local expandtab = vim.bo[curbuf].expandtab
local lines = vim.iter.map(function(i, line)
-- Replace tabs by spaces.
- if vim.o.expandtab then
- line = line:gsub('\t', (' '):rep(vim.fn.shiftwidth())) --- @type string
+ if expandtab then
+ line = line:gsub('\t', (' '):rep(shiftwidth)) --- @type string
end
-- Add the base indentation.
if i > 1 then
- line = base_indent .. line
+ line = #line ~= 0 and base_indent .. line
+ or (expandtab and (' '):rep(shiftwidth) or '\t'):rep(vim.fn.indent('.') / shiftwidth + 1)
end
return line
end, ipairs(text_to_lines(text)))
diff --git a/src/nvim/api/window.c b/src/nvim/api/window.c
index 026d09d9a9..30f77c7248 100644
--- a/src/nvim/api/window.c
+++ b/src/nvim/api/window.c
@@ -148,7 +148,7 @@ void nvim_win_set_cursor(Window window, ArrayOf(Integer, 2) pos, Error *err)
switchwin_T switchwin;
switch_win(&switchwin, win, NULL, true);
update_topline(curwin);
- validate_cursor(curwin);
+ setcursor_mayforce(true);
restore_win(&switchwin, true);
redraw_later(win, UPD_VALID);
diff --git a/src/nvim/ex_getln.c b/src/nvim/ex_getln.c
index 303337ae98..d482f9851e 100644
--- a/src/nvim/ex_getln.c
+++ b/src/nvim/ex_getln.c
@@ -767,7 +767,7 @@ static uint8_t *command_line_enter(int firstc, int count, int indent, bool clear
}
setmouse();
- ui_cursor_shape(); // may show different cursor shape
+ setcursor();
TryState tstate;
Error err = ERROR_INIT;
@@ -927,7 +927,6 @@ static uint8_t *command_line_enter(int firstc, int count, int indent, bool clear
}
may_trigger_modechanged();
setmouse();
- ui_cursor_shape(); // may show different cursor shape
sb_text_end_cmdline();
theend:
@@ -3859,7 +3858,6 @@ void cursorcmd(void)
if (ccline.redraw_state < kCmdRedrawPos) {
ccline.redraw_state = kCmdRedrawPos;
}
- setcursor();
return;
}
@@ -4553,6 +4551,7 @@ static int open_cmdwin(void)
State = save_State;
may_trigger_modechanged();
setmouse();
+ setcursor();
return cmdwin_result;
}
diff --git a/test/functional/api/window_spec.lua b/test/functional/api/window_spec.lua
index a10c8f48ef..721148faaa 100644
--- a/test/functional/api/window_spec.lua
+++ b/test/functional/api/window_spec.lua
@@ -219,6 +219,21 @@ describe('API/win', function()
-- curwin didn't change back
neq(win, curwin())
+
+ -- shows updated position after getchar() #20793
+ feed(':call getchar()<CR>')
+ api.nvim_win_set_cursor(win, { 1, 5 })
+ screen:expect {
+ grid = [[
+ |
+ {1:~ }|*2
+ {2:[No Name] }|
+ prolo^gue |
+ |*2
+ {3:[No Name] [+] }|
+ :call getchar() |
+ ]],
+ }
end)
it('remembers what column it wants to be in', function()
diff --git a/test/functional/lua/snippet_spec.lua b/test/functional/lua/snippet_spec.lua
index e981bc6261..d31b8cc7d5 100644
--- a/test/functional/lua/snippet_spec.lua
+++ b/test/functional/lua/snippet_spec.lua
@@ -5,6 +5,7 @@ local clear = helpers.clear
local eq = helpers.eq
local exec_lua = helpers.exec_lua
local feed = helpers.feed
+local api = helpers.api
local fn = helpers.fn
local matches = helpers.matches
local pcall_err = helpers.pcall_err
@@ -230,7 +231,7 @@ describe('vim.snippet', function()
end)
it('updates snippet state when built-in completion menu is visible', function()
- test_expand_success({ '$1 = function($2)\n$3\nend' }, { ' = function()', '', 'end' })
+ test_expand_success({ '$1 = function($2)\nend' }, { ' = function()', 'end' })
-- Show the completion menu.
feed('<C-n>')
-- Make sure no item is selected.
@@ -238,6 +239,28 @@ describe('vim.snippet', function()
-- Jump forward (the 2nd tabstop).
exec_lua('vim.snippet.jump(1)')
feed('foo')
- eq({ ' = function(foo)', '', 'end' }, buf_lines(0))
+ eq({ ' = function(foo)', 'end' }, buf_lines(0))
+ end)
+
+ it('correctly indents with newlines', function()
+ local curbuf = api.nvim_get_current_buf()
+ test_expand_success(
+ { 'function($2)\n$3\nend' },
+ { 'function()', ' ', 'end' },
+ [[
+ vim.opt.sw = 2
+ vim.opt.expandtab = true
+ ]]
+ )
+ api.nvim_buf_set_lines(curbuf, 0, -1, false, {})
+ test_expand_success(
+ { 'func main() {\n$1\n}' },
+ { 'func main() {', '\t', '}' },
+ [[
+ vim.opt.sw = 4
+ vim.opt.ts = 4
+ vim.opt.expandtab = false
+ ]]
+ )
end)
end)
diff --git a/test/functional/ui/cmdline_spec.lua b/test/functional/ui/cmdline_spec.lua
index 0eb5770819..3b5b488982 100644
--- a/test/functional/ui/cmdline_spec.lua
+++ b/test/functional/ui/cmdline_spec.lua
@@ -824,6 +824,29 @@ local function test_cmdline(linegrid)
|
]])
end)
+
+ it('does not move cursor to curwin #20309', function()
+ local win = api.nvim_get_current_win()
+ command('norm icmdlinewin')
+ command('new')
+ command('norm icurwin')
+ feed(':')
+ api.nvim_win_set_cursor(win, { 1, 7 })
+ screen:expect {
+ grid = [[
+ curwin |
+ {3:[No Name] [+] }|
+ cmdline^win |
+ {2:[No Name] [+] }|
+ |
+ ]],
+ cmdline = { {
+ content = { { '' } },
+ firstc = ':',
+ pos = 0,
+ } },
+ }
+ end)
end
-- the representation of cmdline and cmdline_block contents changed with ext_linegrid