Skip to content

Commit

Permalink
fix: deduplicate mode changes, dont hide on select mode
Browse files Browse the repository at this point in the history
Closes #393
  • Loading branch information
Saghen committed Nov 28, 2024
1 parent 49981f2 commit 04ff262
Show file tree
Hide file tree
Showing 3 changed files with 15 additions and 14 deletions.
14 changes: 6 additions & 8 deletions lua/blink/cmp/completion/trigger.lua
Original file line number Diff line number Diff line change
Expand Up @@ -27,8 +27,8 @@
--- @field activate fun()
--- @field is_trigger_character fun(char: string, is_retrigger?: boolean): boolean
--- @field suppress_events_for_callback fun(cb: fun())
--- @field show_if_on_trigger_character fun(opts?: { is_accept?: boolean }): boolean
--- @field show fun(opts?: { trigger_character?: string })
--- @field show_if_on_trigger_character fun(opts?: { is_accept?: boolean })
--- @field show fun(opts?: { trigger_character?: string, force?: boolean, send_upstream?: boolean })
--- @field hide fun()
--- @field within_query_bounds fun(cursor: number[]): boolean
--- @field get_context_bounds fun(regex: string): blink.cmp.ContextBounds
Expand Down Expand Up @@ -131,19 +131,17 @@ function trigger.suppress_events_for_callback(cb)
trigger.buffer_events:suppress_events_for_callback(cb)
end

--- @param opts { is_accept?: boolean } | nil
function trigger.show_if_on_trigger_character(opts)
if opts and opts.is_accept and not config.show_on_accept_on_trigger_character then return false end
if opts and opts.is_accept and not config.show_on_accept_on_trigger_character then return end

local cursor_col = vim.api.nvim_win_get_cursor(0)[2]
local char_under_cursor = vim.api.nvim_get_current_line():sub(cursor_col, cursor_col)
local is_on_trigger = trigger.is_trigger_character(char_under_cursor, true)

if is_on_trigger then trigger.show({ trigger_character = char_under_cursor }) end
return is_on_trigger
if trigger.is_trigger_character(char_under_cursor, true) then
trigger.show({ trigger_character = char_under_cursor })
end
end

--- @param opts { trigger_character?: string, send_upstream?: boolean, force?: boolean } | nil
function trigger.show(opts)
opts = opts or {}

Expand Down
9 changes: 7 additions & 2 deletions lua/blink/cmp/lib/buffer_events.lua
Original file line number Diff line number Diff line change
Expand Up @@ -76,10 +76,15 @@ function buffer_events:listen(opts)
})

-- definitely leaving the context
vim.api.nvim_create_autocmd({ 'InsertLeave', 'BufLeave' }, {
vim.api.nvim_create_autocmd({ 'ModeChanged', 'BufLeave' }, {
callback = function()
last_char = ''
opts.on_insert_leave()
-- HACK: when using vim.snippet.expand, the mode switches from insert -> normal -> visual -> select
-- so we schedule to ignore the intermediary modes
-- TODO: deduplicate requests
vim.schedule(function()
if not vim.tbl_contains({ 'i', 's' }, vim.api.nvim_get_mode().mode) then opts.on_insert_leave() end

This comment has been minimized.

Copy link
@rainerborene

rainerborene Dec 22, 2024

Contributor

For some reason I had to force the on_insert_leave() execution. I'd guess telescope plugin starts in insert mode on the prompt. I always see the completion menu if I don't do that.

if not require('blink.cmp.config').enabled() then opts.on_insert_leave() end
end)
end,
})

Expand Down
6 changes: 2 additions & 4 deletions lua/blink/cmp/signature/trigger.lua
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@
---
--- @field activate fun()
--- @field is_trigger_character fun(char: string, is_retrigger?: boolean): boolean
--- @field show_if_on_trigger_character fun(): boolean
--- @field show_if_on_trigger_character fun()
--- @field show fun(opts?: { trigger_character: string })
--- @field hide fun()

Expand Down Expand Up @@ -89,9 +89,7 @@ end
function trigger.show_if_on_trigger_character()
local cursor_col = vim.api.nvim_win_get_cursor(0)[2]
local char_under_cursor = vim.api.nvim_get_current_line():sub(cursor_col, cursor_col)
local is_on_trigger = trigger.is_trigger_character(char_under_cursor)
if is_on_trigger then trigger.show({ trigger_character = char_under_cursor }) end
return is_on_trigger
if trigger.is_trigger_character(char_under_cursor) then trigger.show({ trigger_character = char_under_cursor }) end
end

function trigger.show(opts)
Expand Down

0 comments on commit 04ff262

Please sign in to comment.