minimal extui fuzzy finder for neovim
at main 179 lines 4.6 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("ArtioMark", { link = "DiagnosticWarn" }) 30 hi("ArtioMarkLine", { link = "Visual" }) 31 end, 32}) 33 34-- == cmd == 35 36vim.api.nvim_create_user_command("Artio", function(opts) 37 local builtins = require("artio.builtins") 38 if #opts.fargs == 0 then 39 builtins.builtins() 40 return 41 end 42 local builtin = builtins[opts.fargs[1]] 43 if not builtin then 44 vim.notify("unknown builtin: " .. opts.fargs[1], vim.log.levels.ERROR) 45 return 46 end 47 builtin() 48end, { 49 nargs = "?", 50 complete = function(arglead, _, _) 51 local builtins = vim.tbl_keys(require("artio.builtins")) 52 if #arglead == 0 then 53 return builtins 54 end 55 return vim.fn.matchfuzzy(builtins, arglead) 56 end, 57}) 58 59-- == pickers == 60 61vim.keymap.set("n", "<Plug>(artio-resume)", function() 62 return require("artio").resume() 63end) 64 65vim.keymap.set("", "<Plug>(artio-builtins)", function() 66 return require("artio.builtins").builtins() 67end) 68vim.keymap.set("n", "<Plug>(artio-files)", function() 69 return require("artio.builtins").files() 70end) 71vim.keymap.set("n", "<Plug>(artio-oldfiles)", function() 72 return require("artio.builtins").oldfiles() 73end) 74vim.keymap.set("n", "<Plug>(artio-grep)", function() 75 return require("artio.builtins").grep() 76end) 77vim.keymap.set("n", "<Plug>(artio-helptags)", function() 78 return require("artio.builtins").helptags() 79end) 80vim.keymap.set("n", "<Plug>(artio-buffergrep)", function() 81 return require("artio.builtins").buffergrep() 82end) 83vim.keymap.set("n", "<Plug>(artio-buffers)", function() 84 return require("artio.builtins").buffers() 85end) 86vim.keymap.set("n", "<Plug>(artio-smart)", function() 87 return require("artio.builtins").smart() 88end) 89vim.keymap.set("n", "<Plug>(artio-highlights)", function() 90 return require("artio.builtins").highlights() 91end) 92vim.keymap.set("n", "<Plug>(artio-colorschemes)", function() 93 return require("artio.builtins").colorschemes() 94end) 95vim.keymap.set("n", "<Plug>(artio-diagnostics)", function() 96 return require("artio.builtins").diagnostics() 97end) 98vim.keymap.set("n", "<Plug>(artio-diagnostics-buffer)", function() 99 return require("artio.builtins").diagnostics_buffer() 100end) 101vim.keymap.set("n", "<Plug>(artio-keymaps)", function() 102 return require("artio.builtins").keymaps() 103end) 104vim.keymap.set("n", "<Plug>(artio-commands)", function() 105 return require("artio.builtins").commands() 106end) 107vim.keymap.set("n", "<Plug>(artio-quickfix)", function() 108 return require("artio.builtins").quickfix() 109end) 110 111-- == actions == 112 113local function wrap(fn) 114 return function() 115 (require("artio").wrap(fn))() 116 end 117end 118 119vim.keymap.set( 120 "i", 121 "<Plug>(artio-action-down)", 122 wrap(function(self) 123 self.idx = self.idx + 1 124 self.view:showmatches() -- adjust for scrolling 125 self.view:hlselect() 126 end) 127) 128vim.keymap.set( 129 "i", 130 "<Plug>(artio-action-up)", 131 wrap(function(self) 132 self.idx = self.idx - 1 133 self.view:showmatches() -- adjust for scrolling 134 self.view:hlselect() 135 end) 136) 137vim.keymap.set( 138 "i", 139 "<Plug>(artio-action-accept)", 140 wrap(function(self) 141 self:accept() 142 end) 143) 144vim.keymap.set( 145 "i", 146 "<Plug>(artio-action-cancel)", 147 wrap(function(self) 148 self:cancel() 149 end) 150) 151vim.keymap.set( 152 "i", 153 "<Plug>(artio-action-mark)", 154 wrap(function(self) 155 local match = self.matches[self.idx] 156 if not match then 157 return 158 end 159 local idx = match[1] 160 self:mark(idx, not self.marked[idx]) 161 self.view:showmatches() -- redraw marker 162 self.view:hlselect() 163 end) 164) 165vim.keymap.set( 166 "i", 167 "<Plug>(artio-action-togglepreview)", 168 wrap(function(self) 169 self.view:togglepreview() 170 end) 171) 172vim.keymap.set( 173 "i", 174 "<Plug>(artio-action-togglelive)", 175 wrap(function(self) 176 self:togglelive() 177 self.view:trigger_show() -- update input 178 end) 179)