Skip to content

Commit 04ff262

Browse files
committed
fix: deduplicate mode changes, dont hide on select mode
Closes #393
1 parent 49981f2 commit 04ff262

File tree

3 files changed

+15
-14
lines changed

3 files changed

+15
-14
lines changed

lua/blink/cmp/completion/trigger.lua

+6-8
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,8 @@
2727
--- @field activate fun()
2828
--- @field is_trigger_character fun(char: string, is_retrigger?: boolean): boolean
2929
--- @field suppress_events_for_callback fun(cb: fun())
30-
--- @field show_if_on_trigger_character fun(opts?: { is_accept?: boolean }): boolean
31-
--- @field show fun(opts?: { trigger_character?: string })
30+
--- @field show_if_on_trigger_character fun(opts?: { is_accept?: boolean })
31+
--- @field show fun(opts?: { trigger_character?: string, force?: boolean, send_upstream?: boolean })
3232
--- @field hide fun()
3333
--- @field within_query_bounds fun(cursor: number[]): boolean
3434
--- @field get_context_bounds fun(regex: string): blink.cmp.ContextBounds
@@ -131,19 +131,17 @@ function trigger.suppress_events_for_callback(cb)
131131
trigger.buffer_events:suppress_events_for_callback(cb)
132132
end
133133

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

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

142-
if is_on_trigger then trigger.show({ trigger_character = char_under_cursor }) end
143-
return is_on_trigger
140+
if trigger.is_trigger_character(char_under_cursor, true) then
141+
trigger.show({ trigger_character = char_under_cursor })
142+
end
144143
end
145144

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

lua/blink/cmp/lib/buffer_events.lua

+7-2
Original file line numberDiff line numberDiff line change
@@ -76,10 +76,15 @@ function buffer_events:listen(opts)
7676
})
7777

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

lua/blink/cmp/signature/trigger.lua

+2-4
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
---
2222
--- @field activate fun()
2323
--- @field is_trigger_character fun(char: string, is_retrigger?: boolean): boolean
24-
--- @field show_if_on_trigger_character fun(): boolean
24+
--- @field show_if_on_trigger_character fun()
2525
--- @field show fun(opts?: { trigger_character: string })
2626
--- @field hide fun()
2727

@@ -89,9 +89,7 @@ end
8989
function trigger.show_if_on_trigger_character()
9090
local cursor_col = vim.api.nvim_win_get_cursor(0)[2]
9191
local char_under_cursor = vim.api.nvim_get_current_line():sub(cursor_col, cursor_col)
92-
local is_on_trigger = trigger.is_trigger_character(char_under_cursor)
93-
if is_on_trigger then trigger.show({ trigger_character = char_under_cursor }) end
94-
return is_on_trigger
92+
if trigger.is_trigger_character(char_under_cursor) then trigger.show({ trigger_character = char_under_cursor }) end
9593
end
9694

9795
function trigger.show(opts)

0 commit comments

Comments
 (0)