Skip to content

Commit b6c8bb2

Browse files
authored
feat(lualine): add spinner component (#62)
1 parent a9f5269 commit b6c8bb2

File tree

5 files changed

+183
-7
lines changed

5 files changed

+183
-7
lines changed

lua/minuet/backends/claude.lua

+30-3
Original file line numberDiff line numberDiff line change
@@ -77,26 +77,43 @@ M.complete = function(context, callback)
7777
table.insert(args, config.proxy)
7878
end
7979

80+
local provider_name = 'Clause'
81+
utils.fire_event('RequestInit', {
82+
provider = provider_name,
83+
name = options.name,
84+
n_requests = 1,
85+
})
86+
8087
local new_job = Job:new {
8188
command = 'curl',
8289
args = args,
8390
on_exit = vim.schedule_wrap(function(job, exit_code)
8491
common.remove_job(job)
8592

93+
utils.fire_event('RequestFinished', {
94+
provider = provider_name,
95+
name = options.name,
96+
n_requests = 1,
97+
request_idx = 1,
98+
job = function()
99+
return job
100+
end,
101+
})
102+
86103
local items_raw
87104

88105
if options.stream then
89-
items_raw = utils.stream_decode(job, exit_code, data_file, 'Claude', M.get_text_fn_stream)
106+
items_raw = utils.stream_decode(job, exit_code, data_file, provider_name, M.get_text_fn_stream)
90107
else
91-
items_raw = utils.no_stream_decode(job, exit_code, data_file, 'Claude', M.get_text_fn_no_steam)
108+
items_raw = utils.no_stream_decode(job, exit_code, data_file, provider_name, M.get_text_fn_no_steam)
92109
end
93110

94111
if not items_raw then
95112
callback()
96113
return
97114
end
98115

99-
local items = common.parse_completion_items(items_raw, 'Claude')
116+
local items = common.parse_completion_items(items_raw, provider_name)
100117

101118
items = common.filter_context_sequences_in_items(items, context.lines_after)
102119

@@ -108,6 +125,16 @@ M.complete = function(context, callback)
108125

109126
common.register_job(new_job)
110127
new_job:start()
128+
129+
utils.fire_event('RequestStarted', {
130+
provider = provider_name,
131+
name = options.name,
132+
n_requests = 1,
133+
request_idx = 1,
134+
job = function()
135+
return new_job
136+
end,
137+
})
111138
end
112139

113140
return M

lua/minuet/backends/common.lua

+54-1
Original file line numberDiff line numberDiff line change
@@ -124,12 +124,29 @@ function M.complete_openai_base(options, context, callback)
124124
table.insert(args, config.proxy)
125125
end
126126

127+
local provider_name = 'openai_compatible'
128+
utils.fire_event('RequestInit', {
129+
provider = provider_name,
130+
name = options.name,
131+
n_requests = 1,
132+
})
133+
127134
local new_job = Job:new {
128135
command = 'curl',
129136
args = args,
130137
on_exit = vim.schedule_wrap(function(job, exit_code)
131138
M.remove_job(job)
132139

140+
utils.fire_event('RequestFinished', {
141+
provider = provider_name,
142+
name = options.name,
143+
n_requests = 1,
144+
request_idx = 1,
145+
job = function()
146+
return job
147+
end,
148+
})
149+
133150
local items_raw
134151

135152
if options.stream then
@@ -156,6 +173,16 @@ function M.complete_openai_base(options, context, callback)
156173

157174
M.register_job(new_job)
158175
new_job:start()
176+
177+
utils.fire_event('RequestStarted', {
178+
provider = provider_name,
179+
name = options.name,
180+
n_requests = 1,
181+
request_idx = 1,
182+
job = function()
183+
return new_job
184+
end,
185+
})
159186
end
160187

161188
function M.complete_openai_fim_base(options, get_text_fn, context, callback)
@@ -185,7 +212,13 @@ function M.complete_openai_fim_base(options, get_text_fn, context, callback)
185212
local items = {}
186213
local n_completions = config.n_completions
187214

188-
for _ = 1, n_completions do
215+
local provider_name = 'openai_fim_compatible'
216+
utils.fire_event('RequestInit', {
217+
provider = provider_name,
218+
name = options.name,
219+
n_requests = n_completions,
220+
})
221+
for request_idx = 1, n_completions do
189222
local args = {
190223
'-L',
191224
options.end_point,
@@ -212,6 +245,16 @@ function M.complete_openai_fim_base(options, get_text_fn, context, callback)
212245
on_exit = vim.schedule_wrap(function(job, exit_code)
213246
M.remove_job(job)
214247

248+
utils.fire_event('RequestFinished', {
249+
provider = provider_name,
250+
name = options.name,
251+
n_requests = n_completions,
252+
request_idx = request_idx,
253+
job = function()
254+
return job
255+
end,
256+
})
257+
215258
local result
216259

217260
if options.stream then
@@ -232,6 +275,16 @@ function M.complete_openai_fim_base(options, get_text_fn, context, callback)
232275

233276
M.register_job(new_job)
234277
new_job:start()
278+
279+
utils.fire_event('RequestStarted', {
280+
provider = provider_name,
281+
name = options.name,
282+
n_requests = n_completions,
283+
request_idx = request_idx,
284+
job = function()
285+
return new_job
286+
end,
287+
})
235288
end
236289
end
237290

lua/minuet/backends/gemini.lua

+30-3
Original file line numberDiff line numberDiff line change
@@ -102,25 +102,42 @@ function M.complete(context, callback)
102102
table.insert(args, config.proxy)
103103
end
104104

105+
local provider_name = 'Gemini'
106+
utils.fire_event('RequestInit', {
107+
provider = provider_name,
108+
name = options.name,
109+
n_requests = 1,
110+
})
111+
105112
local new_job = Job:new {
106113
command = 'curl',
107114
args = args,
108115
on_exit = vim.schedule_wrap(function(job, exit_code)
109116
common.remove_job(job)
110117

118+
utils.fire_event('RequestFinished', {
119+
provider = provider_name,
120+
name = options.name,
121+
n_requests = 1,
122+
request_idx = 1,
123+
job = function()
124+
return job
125+
end,
126+
})
127+
111128
local items_raw
112129
if options.stream then
113-
items_raw = utils.stream_decode(job, exit_code, data_file, 'Gemini', M.get_text_fn)
130+
items_raw = utils.stream_decode(job, exit_code, data_file, provider_name, M.get_text_fn)
114131
else
115-
items_raw = utils.no_stream_decode(job, exit_code, data_file, 'Gemini', M.get_text_fn)
132+
items_raw = utils.no_stream_decode(job, exit_code, data_file, provider_name, M.get_text_fn)
116133
end
117134

118135
if not items_raw then
119136
callback()
120137
return
121138
end
122139

123-
local items = common.parse_completion_items(items_raw, 'Gemini')
140+
local items = common.parse_completion_items(items_raw, provider_name)
124141

125142
items = common.filter_context_sequences_in_items(items, context.lines_after)
126143

@@ -132,6 +149,16 @@ function M.complete(context, callback)
132149

133150
common.register_job(new_job)
134151
new_job:start()
152+
153+
utils.fire_event('RequestStarted', {
154+
provider = provider_name,
155+
name = options.name,
156+
n_requests = 1,
157+
request_idx = 1,
158+
job = function()
159+
return new_job
160+
end,
161+
})
135162
end
136163

137164
return M

lua/minuet/lualine.lua

+63
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
local M = require('lualine.component'):extend()
2+
3+
M.processing = false
4+
M.spinner_index = 1
5+
M.n_requests = 1
6+
M.n_finished_requests = 0
7+
M.name = 'unknown'
8+
9+
local spinner_symbols = {
10+
'',
11+
'',
12+
'',
13+
'',
14+
'',
15+
'',
16+
'',
17+
'',
18+
'',
19+
'',
20+
}
21+
local spinner_symbols_len = 10
22+
23+
-- Initializer
24+
function M:init(options)
25+
M.super.init(self, options)
26+
27+
local group = vim.api.nvim_create_augroup('MinuetHooks', {})
28+
29+
vim.api.nvim_create_autocmd({ 'User' }, {
30+
pattern = 'MinuetRequest*',
31+
group = group,
32+
callback = function(request)
33+
local data = request.data
34+
35+
if request.match == 'MinuetRequestInit' then
36+
self.processing = false
37+
self.n_requests = data.n_requests
38+
self.n_finished_requests = 0
39+
self.name = data.name or data.provider
40+
elseif request.match == 'MinuetRequestStarted' then
41+
self.processing = true
42+
elseif request.match == 'MinuetRequestFinished' then
43+
self.n_finished_requests = self.n_finished_requests + 1
44+
if self.n_finished_requests == self.n_requests then
45+
self.processing = false
46+
end
47+
end
48+
end,
49+
})
50+
end
51+
52+
-- Function that runs every time statusline is updated
53+
function M:update_status()
54+
if self.processing then
55+
self.spinner_index = (self.spinner_index % spinner_symbols_len) + 1
56+
local request = string.format('%s: %s/%s', self.name, self.n_finished_requests + 1, self.n_requests)
57+
return request .. ' ' .. spinner_symbols[self.spinner_index]
58+
else
59+
return nil
60+
end
61+
end
62+
63+
return M

lua/minuet/utils.lua

+6
Original file line numberDiff line numberDiff line change
@@ -520,4 +520,10 @@ M.list_dedup = function(list)
520520
return items_cleaned
521521
end
522522

523+
--- fire an event
524+
function M.fire_event(event, opts)
525+
opts = opts or {}
526+
vim.api.nvim_exec_autocmds('User', { pattern = 'Minuet' .. event, data = opts })
527+
end
528+
523529
return M

0 commit comments

Comments
 (0)