minimal extui fuzzy finder for neovim
at aecd8bb2fc9813c8b0ca332a1bf7315f64b8dba5 161 lines 4.1 kB view raw
1if vim.g.loaded_artio then 2 return 3end 4 5vim.g.loaded_artio = true 6 7local augroup = vim.api.nvim_create_augroup("artio:hl", {}) 8 9vim.api.nvim_create_autocmd({ "UIEnter", "ColorScheme" }, { 10 group = augroup, 11 callback = function() 12 local hi = function(name, opts) 13 opts.default = true 14 vim.api.nvim_set_hl(0, name, opts) 15 end 16 17 local normal_hl = vim.api.nvim_get_hl(0, { name = "Normal" }) 18 local msgarea_hl = vim.api.nvim_get_hl(0, { name = "MsgArea" }) 19 20 hi("ArtioNormal", { fg = normal_hl.fg, bg = msgarea_hl.bg }) 21 hi("ArtioPrompt", { link = "Title" }) 22 23 local cursor_hl = vim.api.nvim_get_hl(0, { name = "Cursor" }) 24 local cursorline_hl = vim.api.nvim_get_hl(0, { name = "CursorLine" }) 25 hi("ArtioSel", { fg = cursor_hl.bg, bg = cursorline_hl.bg }) 26 hi("ArtioPointer", { fg = cursor_hl.bg }) 27 28 hi("ArtioMatch", { link = "PmenuMatch" }) 29 hi("ArtioMarker", { link = "DiagnosticWarn" }) 30 end, 31}) 32 33-- == cmd == 34 35vim.api.nvim_create_user_command("Artio", function(opts) 36 local builtins = require("artio.builtins") 37 if #opts.fargs == 0 then 38 builtins.builtins() 39 return 40 end 41 local builtin = builtins[opts.fargs[1]] 42 if not builtin then 43 vim.notify("unknown builtin: " .. opts.fargs[1], vim.log.levels.ERROR) 44 return 45 end 46 builtin() 47end, { 48 nargs = "?", 49 complete = function(arglead, _, _) 50 local builtins = vim.tbl_keys(require("artio.builtins")) 51 if #arglead == 0 then 52 return builtins 53 end 54 return vim.fn.matchfuzzy(builtins, arglead) 55 end, 56}) 57 58-- == pickers == 59 60vim.keymap.set("n", "<Plug>(artio-resume)", function() 61 return require("artio").resume() 62end) 63 64vim.keymap.set("", "<Plug>(artio-builtins)", function() 65 return require("artio.builtins").builtins() 66end) 67vim.keymap.set("n", "<Plug>(artio-files)", function() 68 return require("artio.builtins").files() 69end) 70vim.keymap.set("n", "<Plug>(artio-oldfiles)", function() 71 return require("artio.builtins").oldfiles() 72end) 73vim.keymap.set("n", "<Plug>(artio-grep)", function() 74 return require("artio.builtins").grep() 75end) 76vim.keymap.set("n", "<Plug>(artio-helptags)", function() 77 return require("artio.builtins").helptags() 78end) 79vim.keymap.set("n", "<Plug>(artio-buffergrep)", function() 80 return require("artio.builtins").buffergrep() 81end) 82vim.keymap.set("n", "<Plug>(artio-buffers)", function() 83 return require("artio.builtins").buffers() 84end) 85vim.keymap.set("n", "<Plug>(artio-smart)", function() 86 return require("artio.builtins").smart() 87end) 88vim.keymap.set("n", "<Plug>(artio-highlights)", function() 89 return require("artio.builtins").highlights() 90end) 91vim.keymap.set("n", "<Plug>(artio-colorschemes)", function() 92 return require("artio.builtins").colorschemes() 93end) 94vim.keymap.set("n", "<Plug>(artio-diagnostics)", function() 95 return require("artio.builtins").diagnostics() 96end) 97vim.keymap.set("n", "<Plug>(artio-diagnostics-buffer)", function() 98 return require("artio.builtins").diagnostics_buffer() 99end) 100 101-- == actions == 102 103local function wrap(fn) 104 return function() 105 (require("artio").wrap(fn))() 106 end 107end 108 109vim.keymap.set( 110 "i", 111 "<Plug>(artio-action-down)", 112 wrap(function(self) 113 self.idx = self.idx + 1 114 self.view:showmatches() -- adjust for scrolling 115 self.view:hlselect() 116 end) 117) 118vim.keymap.set( 119 "i", 120 "<Plug>(artio-action-up)", 121 wrap(function(self) 122 self.idx = self.idx - 1 123 self.view:showmatches() -- adjust for scrolling 124 self.view:hlselect() 125 end) 126) 127vim.keymap.set( 128 "i", 129 "<Plug>(artio-action-accept)", 130 wrap(function(self) 131 self:accept() 132 end) 133) 134vim.keymap.set( 135 "i", 136 "<Plug>(artio-action-cancel)", 137 wrap(function(self) 138 self:cancel() 139 end) 140) 141vim.keymap.set( 142 "i", 143 "<Plug>(artio-action-mark)", 144 wrap(function(self) 145 local match = self.matches[self.idx] 146 if not match then 147 return 148 end 149 local idx = match[1] 150 self:mark(idx, not self.marked[idx]) 151 self.view:showmatches() -- redraw marker 152 self.view:hlselect() 153 end) 154) 155vim.keymap.set( 156 "i", 157 "<Plug>(artio-action-togglepreview)", 158 wrap(function(self) 159 self.view:togglepreview() 160 end) 161)