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("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)