fix(lsp): cancel session when leaving snippet region (#25762)

This commit is contained in:
Maria José Solano 2023-10-25 22:29:05 -07:00 committed by GitHub
parent 9de157bce4
commit 15983cf2c6
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 21 additions and 1 deletions

View File

@ -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()

View File

@ -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)