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(_, _, _)
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)