minimal extui fuzzy finder for neovim
at 8763f8aac5d2aa435f5dccb3c56bac81557df31e 78 lines 1.9 kB view raw
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