minimal extui fuzzy finder for neovim
at e3e767406af28dc5342d0e8600e7e69f3daedda1 157 lines 4.0 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(_, _, _) 50 return vim.tbl_keys(require("artio.builtins")) 51 end, 52}) 53 54-- == pickers == 55 56vim.keymap.set("n", "<Plug>(artio-resume)", function() 57 return require("artio").resume() 58end) 59 60vim.keymap.set("", "<Plug>(artio-builtins)", function() 61 return require("artio.builtins").builtins() 62end) 63vim.keymap.set("n", "<Plug>(artio-files)", function() 64 return require("artio.builtins").files() 65end) 66vim.keymap.set("n", "<Plug>(artio-oldfiles)", function() 67 return require("artio.builtins").oldfiles() 68end) 69vim.keymap.set("n", "<Plug>(artio-grep)", function() 70 return require("artio.builtins").grep() 71end) 72vim.keymap.set("n", "<Plug>(artio-helptags)", function() 73 return require("artio.builtins").helptags() 74end) 75vim.keymap.set("n", "<Plug>(artio-buffergrep)", function() 76 return require("artio.builtins").buffergrep() 77end) 78vim.keymap.set("n", "<Plug>(artio-buffers)", function() 79 return require("artio.builtins").buffers() 80end) 81vim.keymap.set("n", "<Plug>(artio-smart)", function() 82 return require("artio.builtins").smart() 83end) 84vim.keymap.set("n", "<Plug>(artio-highlights)", function() 85 return require("artio.builtins").highlights() 86end) 87vim.keymap.set("n", "<Plug>(artio-colorschemes)", function() 88 return require("artio.builtins").colorschemes() 89end) 90vim.keymap.set("n", "<Plug>(artio-diagnostics)", function() 91 return require("artio.builtins").diagnostics() 92end) 93vim.keymap.set("n", "<Plug>(artio-diagnostics-buffer)", function() 94 return require("artio.builtins").diagnostics_buffer() 95end) 96 97-- == actions == 98 99local function wrap(fn) 100 return function() 101 (require("artio").wrap(fn))() 102 end 103end 104 105vim.keymap.set( 106 "i", 107 "<Plug>(artio-action-down)", 108 wrap(function(self) 109 self.idx = self.idx + 1 110 self.view:showmatches() -- adjust for scrolling 111 self.view:hlselect() 112 end) 113) 114vim.keymap.set( 115 "i", 116 "<Plug>(artio-action-up)", 117 wrap(function(self) 118 self.idx = self.idx - 1 119 self.view:showmatches() -- adjust for scrolling 120 self.view:hlselect() 121 end) 122) 123vim.keymap.set( 124 "i", 125 "<Plug>(artio-action-accept)", 126 wrap(function(self) 127 self:accept() 128 end) 129) 130vim.keymap.set( 131 "i", 132 "<Plug>(artio-action-cancel)", 133 wrap(function(self) 134 self:cancel() 135 end) 136) 137vim.keymap.set( 138 "i", 139 "<Plug>(artio-action-mark)", 140 wrap(function(self) 141 local match = self.matches[self.idx] 142 if not match then 143 return 144 end 145 local idx = match[1] 146 self:mark(idx, not self.marked[idx]) 147 self.view:showmatches() -- redraw marker 148 self.view:hlselect() 149 end) 150) 151vim.keymap.set( 152 "i", 153 "<Plug>(artio-action-togglepreview)", 154 wrap(function(self) 155 self.view:togglepreview() 156 end) 157)