minimal extui fuzzy finder for neovim
1local utils = {}
2
3local function cmd_callback(o)
4 local src = o.stderr
5 if o.code == 0 then
6 src = o.stdout
7 end
8 src = src
9 local lines = vim.split(src, "\n", { trimempty = true })
10 return lines
11end
12
13---@param prg? string
14---@return fun(arg?: string): string[]
15function utils.make_cmd(prg)
16 return function(arg)
17 if not prg then
18 return {}
19 end
20 arg = string.format("'%s'", arg or "")
21 local cmd, n = prg:gsub("%$%*", arg)
22 if n == 0 then
23 cmd = ("%s %s"):format(prg, arg)
24 end
25 return cmd_callback(vim
26 .system({ vim.o.shell, "-c", cmd }, {
27 text = true,
28 })
29 :wait())
30 end
31end
32
33---@param fn fun(item: artio.Picker.item): vim.quickfix.entry
34---@return artio.Picker.action
35function utils.make_setqflist(fn)
36 return require("artio").wrap(function(self)
37 vim.fn.setqflist(vim
38 .iter(ipairs(self.matches))
39 :map(function(_, match)
40 local item = self.items[match[1]]
41 local qfitem = fn(item)
42 return qfitem
43 end)
44 :totable())
45 coroutine.resume(self.co, 1)
46 end, function(_)
47 vim.cmd.copen()
48 end)
49end
50
51---@param fn fun(item: artio.Picker.item): vim.quickfix.entry
52---@return artio.Picker.action
53function utils.make_setqflistmark(fn)
54 return require("artio").wrap(function(self)
55 vim.fn.setqflist(vim
56 .iter(ipairs(self:getmarked()))
57 :map(function(_, id)
58 local item = self.items[id]
59 local qfitem = fn(item)
60 return qfitem
61 end)
62 :totable())
63 coroutine.resume(self.co, 1)
64 end, function(_)
65 vim.cmd.copen()
66 end)
67end
68
69---@param fn fun(item: artio.Picker.item): vim.quickfix.entry
70---@return table<string, artio.Picker.action>
71function utils.make_setqflistactions(fn)
72 return {
73 setqflist = utils.make_setqflist(fn),
74 setqflistmark = utils.make_setqflistmark(fn),
75 }
76end
77
78return utils