minimal extui fuzzy finder for neovim
at e89201a1658d99c6f79428ef143bbc3487d784f0 172 lines 4.4 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) 100vim.keymap.set("n", "<Plug>(artio-keymaps)", function() 101 return require("artio.builtins").keymaps() 102end) 103 104-- == actions == 105 106local function wrap(fn) 107 return function() 108 (require("artio").wrap(fn))() 109 end 110end 111 112vim.keymap.set( 113 "i", 114 "<Plug>(artio-action-down)", 115 wrap(function(self) 116 self.idx = self.idx + 1 117 self.view:showmatches() -- adjust for scrolling 118 self.view:hlselect() 119 end) 120) 121vim.keymap.set( 122 "i", 123 "<Plug>(artio-action-up)", 124 wrap(function(self) 125 self.idx = self.idx - 1 126 self.view:showmatches() -- adjust for scrolling 127 self.view:hlselect() 128 end) 129) 130vim.keymap.set( 131 "i", 132 "<Plug>(artio-action-accept)", 133 wrap(function(self) 134 self:accept() 135 end) 136) 137vim.keymap.set( 138 "i", 139 "<Plug>(artio-action-cancel)", 140 wrap(function(self) 141 self:cancel() 142 end) 143) 144vim.keymap.set( 145 "i", 146 "<Plug>(artio-action-mark)", 147 wrap(function(self) 148 local match = self.matches[self.idx] 149 if not match then 150 return 151 end 152 local idx = match[1] 153 self:mark(idx, not self.marked[idx]) 154 self.view:showmatches() -- redraw marker 155 self.view:hlselect() 156 end) 157) 158vim.keymap.set( 159 "i", 160 "<Plug>(artio-action-togglepreview)", 161 wrap(function(self) 162 self.view:togglepreview() 163 end) 164) 165vim.keymap.set( 166 "i", 167 "<Plug>(artio-action-togglelive)", 168 wrap(function(self) 169 self:togglelive() 170 self.view:trigger_show() -- update input 171 end) 172)