minimal extui fuzzy finder for neovim

feat!: add grep builtin using `grepprg`

+79 -5
+2 -1
README.md
··· 54 54 vim.ui.select = require("artio").select 55 55 56 56 vim.keymap.set("n", "<leader><leader>", "<Plug>(artio-files)") 57 - vim.keymap.set("n", "<leader>fg", "<Plug>(artio-livegrep)") 57 + vim.keymap.set("n", "<leader>fg", "<Plug>(artio-grep)") 58 58 59 59 -- smart file picker 60 60 vim.keymap.set("n", "<leader>ff", "<Plug>(artio-smart)") ··· 62 62 -- general built-in pickers 63 63 vim.keymap.set("n", "<leader>fh", "<Plug>(artio-helptags)") 64 64 vim.keymap.set("n", "<leader>fb", "<Plug>(artio-buffers)") 65 + vim.keymap.set("n", "<leader>f/", "<Plug>(artio-buffergrep)") 65 66 vim.keymap.set("n", "<leader>fo", "<Plug>(artio-oldfiles)") 66 67 ```
+72 -2
lua/artio/builtins.lua
··· 57 57 }) 58 58 end 59 59 60 + local function grep(input) 61 + input = input or "" 62 + local grepcmd, n = vim.o.grepprg:gsub("%$%*", input) 63 + if n == 0 then 64 + grepcmd = grepcmd .. " " .. input 65 + end 66 + 67 + local fn = function(o) 68 + local src = o.stderr 69 + if o.code == 0 then 70 + src = o.stdout 71 + end 72 + src = src 73 + local lines = vim.split(src, "\n", { trimempty = true }) 74 + return lines 75 + end 76 + return fn(vim 77 + .system({ vim.o.shell, "-c", grepcmd }, { 78 + text = true, 79 + }) 80 + :wait()) 81 + end 82 + 83 + builtins.grep = function() 84 + local ext = require("vim._extui.shared") 85 + 86 + return artio.pick({ 87 + items = {}, 88 + prompt = "grep", 89 + get_items = function(input) 90 + if input == "" then 91 + return {} 92 + end 93 + 94 + local lines = grep(input) 95 + 96 + vim.fn.setloclist(ext.wins.cmd, {}, " ", { 97 + title = "grep[" .. input .. "]", 98 + lines = lines, 99 + efm = vim.o.grepformat, 100 + nr = "$", 101 + }) 102 + 103 + return vim 104 + .iter(ipairs(vim.fn.getloclist(ext.wins.cmd))) 105 + :map(function(i, locitem) 106 + return { 107 + id = i, 108 + v = { vim.fn.bufname(locitem.bufnr), locitem.lnum, locitem.col }, 109 + text = locitem.text, 110 + } 111 + end) 112 + :totable() 113 + end, 114 + fn = artio.sorter, 115 + on_close = function(item, _) 116 + vim.schedule(function() 117 + vim.cmd.edit(item[1]) 118 + vim.api.nvim_win_set_cursor(0, { item[2], item[3] }) 119 + end) 120 + end, 121 + preview_item = function(item) 122 + return vim.fn.bufadd(item[1]) 123 + end, 124 + get_icon = config.get().opts.use_icons and function(item) 125 + return require("mini.icons").get("file", item.v[1]) 126 + end or nil, 127 + }) 128 + end 129 + 60 130 local function find_oldfiles() 61 131 return vim 62 132 .iter(vim.v.oldfiles) ··· 85 155 }) 86 156 end 87 157 88 - builtins.livegrep = function() 158 + builtins.buffergrep = function() 89 159 local win = vim.api.nvim_get_current_win() 90 160 local buf = vim.api.nvim_win_get_buf(win) 91 161 local n = vim.api.nvim_buf_line_count(buf) ··· 97 167 local pad = #tostring(lst[#lst]) 98 168 99 169 return artio.generic(lst, { 100 - prompt = "livegrep", 170 + prompt = "buffergrep", 101 171 on_close = function(row, _) 102 172 vim.schedule(function() 103 173 vim.api.nvim_win_set_cursor(win, { row, 0 })
+5 -2
plugin/artio.lua
··· 35 35 vim.keymap.set("n", "<Plug>(artio-oldfiles)", function() 36 36 return require("artio.builtins").oldfiles() 37 37 end) 38 - vim.keymap.set("n", "<Plug>(artio-livegrep)", function() 39 - return require("artio.builtins").livegrep() 38 + vim.keymap.set("n", "<Plug>(artio-grep)", function() 39 + return require("artio.builtins").grep() 40 40 end) 41 41 vim.keymap.set("n", "<Plug>(artio-helptags)", function() 42 42 return require("artio.builtins").helptags() 43 + end) 44 + vim.keymap.set("n", "<Plug>(artio-buffergrep)", function() 45 + return require("artio.builtins").buffergrep() 43 46 end) 44 47 vim.keymap.set("n", "<Plug>(artio-buffers)", function() 45 48 return require("artio.builtins").buffers()