aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMaria José Solano <majosolano99@gmail.com>2023-10-25 22:29:05 -0700
committerGitHub <noreply@github.com>2023-10-26 07:29:05 +0200
commit15983cf2c64c527fc13681925d0d00c070c30640 (patch)
tree83430e425fc9bbac5e36dd396909cde85822330d
parent9de157bce4b6eb055a0d7a39d1ed6b7a6e6c6545 (diff)
downloadrneovim-15983cf2c64c527fc13681925d0d00c070c30640.tar.gz
rneovim-15983cf2c64c527fc13681925d0d00c070c30640.tar.bz2
rneovim-15983cf2c64c527fc13681925d0d00c070c30640.zip
fix(lsp): cancel session when leaving snippet region (#25762)
-rw-r--r--runtime/lua/vim/snippet.lua15
-rw-r--r--test/functional/lua/snippet_spec.lua7
2 files changed, 21 insertions, 1 deletions
diff --git a/runtime/lua/vim/snippet.lua b/runtime/lua/vim/snippet.lua
index 7680d2e216..14f73bff5c 100644
--- a/runtime/lua/vim/snippet.lua
+++ b/runtime/lua/vim/snippet.lua
@@ -278,13 +278,26 @@ local function setup_autocmds(bufnr)
desc = 'Update snippet state when the cursor moves',
buffer = bufnr,
callback = function()
+ local cursor_row, cursor_col = cursor_pos()
+
+ -- The cursor left the snippet region.
+ local snippet_range = get_extmark_range(bufnr, M._session.extmark_id)
+ if
+ cursor_row < snippet_range[1]
+ or (cursor_row == snippet_range[1] and cursor_col < snippet_range[2])
+ or cursor_row > snippet_range[3]
+ or (cursor_row == snippet_range[3] and cursor_col > snippet_range[4])
+ then
+ M.exit()
+ return true
+ end
+
-- Just update the tabstop in insert and select modes.
if not vim.fn.mode():match('^[isS]') then
return
end
-- Update the current tabstop to be the one containing the cursor.
- local cursor_row, cursor_col = cursor_pos()
for tabstop_index, tabstops in pairs(M._session.tabstops) do
for _, tabstop in ipairs(tabstops) do
local range = tabstop:get_range()
diff --git a/test/functional/lua/snippet_spec.lua b/test/functional/lua/snippet_spec.lua
index 738420d87d..390f268925 100644
--- a/test/functional/lua/snippet_spec.lua
+++ b/test/functional/lua/snippet_spec.lua
@@ -164,4 +164,11 @@ describe('vim.snippet', function()
feed('<esc>Vjjd')
eq(false, exec_lua('return vim.snippet.active()'))
end)
+
+ it('cancels session when leaving snippet region', function()
+ feed('i<cr>')
+ test_success({ 'local function $1()', ' $0', 'end' }, { '', 'local function ()', ' ', 'end' })
+ feed('<esc>k')
+ eq(false, exec_lua('return vim.snippet.active()'))
+ end)
end)