Repository navigation
Expand file tree
/
Copy pathcompletion.lua
More file actions
94 lines (78 loc) · 2.44 KB
/
Copy pathcompletion.lua
File metadata and controls
94 lines (78 loc) · 2.44 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
local M = {}
local completion_sources = {}
function M.setup()
local files_source = require('opencode.ui.completion.files')
local subagents_source = require('opencode.ui.completion.subagents')
local commands_source = require('opencode.ui.completion.commands')
M.register_source(files_source.get_source())
M.register_source(subagents_source.get_source())
M.register_source(commands_source.get_source())
table.sort(completion_sources, function(a, b)
return (a.priority or 0) > (b.priority or 0)
end)
local setup_success = false
local engine = M.get_completion_engine()
if engine == 'nvim-cmp' then
require('opencode.ui.completion.engines.nvim_cmp').setup(completion_sources)
setup_success = true
elseif engine == 'blink' then
require('opencode.ui.completion.engines.blink_cmp').setup(completion_sources)
setup_success = true
elseif engine == 'vim_complete' then
require('opencode.ui.completion.engines.vim_complete').setup(completion_sources)
setup_success = true
end
if not setup_success then
vim.notify('Opencode: No completion engine available', vim.log.levels.WARN)
end
end
---Register a completion source
---@param source CompletionSource
function M.register_source(source)
table.insert(completion_sources, source)
end
---@return CompletionSource[]
function M.get_sources()
return completion_sources
end
---Call the on_complete method for a completion item
---@param item CompletionItem
function M.on_complete(item)
if not item.source_name then
return
end
-- Find the source that provided this item
for _, source in ipairs(completion_sources) do
if source.name == item.source_name and source.on_complete then
source.on_complete(item)
break
end
end
end
function M.get_completion_engine()
local config = require('opencode.config').get()
local engine = config.preferred_completion
if not engine then
local ok_cmp = pcall(require, 'cmp')
local ok_blink = pcall(require, 'blink.cmp')
if ok_blink then
engine = 'blink'
elseif ok_cmp then
engine = 'nvim-cmp'
else
engine = 'vim_complete'
end
end
return engine
end
function M.trigger_completion(trigger_char)
return function()
local engine = M.get_completion_engine()
if engine == 'vim_complete' then
require('opencode.ui.completion.engines.vim_complete').trigger(trigger_char)
else
vim.api.nvim_feedkeys(trigger_char, 'in', true)
end
end
end
return M