minimal extui fuzzy finder for neovim
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)