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