🐻 minimal ui2 fuzzy finder for Neovim codeberg.org/comfysage/artio.nvim
3
fork

Configure Feed

Select the types of activity you want to include in your feed.

feat!: support nvim native `preview_item()` select field

robin 0ec6ad1f 721355ee

+35 -52
+19 -39
lua/artio/builtins.lua
··· 69 69 return require("mini.icons").get("file", item.v) 70 70 end or nil, 71 71 preview_item = function(item) 72 - return vim.fn.bufadd(item) 72 + return { buf = vim.fn.bufadd(item) } 73 73 end, 74 74 actions = extend( 75 75 {}, ··· 135 135 end) 136 136 end, 137 137 preview_item = function(item) 138 - return vim.fn.bufadd(item[1]), 139 - function(w) 140 - vim.api.nvim_set_option_value("cursorline", true, { scope = "local", win = w }) 141 - vim.api.nvim_win_set_cursor(w, { item[2], 0 }) 142 - end 138 + return { buf = vim.fn.bufadd(item[1]), pos = { item[2], 0 } } 143 139 end, 144 140 get_icon = config.get().opts.use_icons and function(item) 145 141 return require("mini.icons").get("file", item.v[1]) ··· 180 176 return require("mini.icons").get("file", item.v) 181 177 end or nil, 182 178 preview_item = function(item) 183 - return vim.fn.bufadd(item) 179 + return { buf = vim.fn.bufadd(item) } 184 180 end, 185 181 actions = extend( 186 182 {}, ··· 217 213 return vim.api.nvim_buf_get_lines(buf, row - 1, row, true)[1] 218 214 end, 219 215 preview_item = function(row) 220 - return buf, 221 - function(w) 222 - vim.api.nvim_set_option_value("cursorline", true, { scope = "local", win = w }) 223 - vim.api.nvim_win_set_cursor(w, { row, 0 }) 224 - end 216 + return { buf = buf, pos = { row, 0 } } 225 217 end, 226 218 get_icon = function(row) 227 219 local v = tostring(row.v) ··· 263 255 end) 264 256 end, 265 257 preview_item = function(tag) 266 - return vim.api.nvim_create_buf(false, true), 267 - function(w) 268 - local buf = vim.api.nvim_win_get_buf(w) 269 - vim.bo[buf].bufhidden = "wipe" 270 - vim.bo[buf].buftype = "help" 258 + local buf = vim.api.nvim_create_buf(false, true) 259 + 260 + vim.bo[buf].bufhidden = "wipe" 261 + vim.bo[buf].buftype = "help" 271 262 272 - vim._with({ buf = buf }, function() 273 - vim.cmd.help(tag) 274 - end) 275 - end 263 + vim._with({ buf = buf }, function() 264 + vim.cmd.help(tag) 265 + end) 266 + 267 + return { buf = buf } 276 268 end, 277 269 }, props) 278 270 ) ··· 307 299 return require("mini.icons").get("file", vim.api.nvim_buf_get_name(item.v)) 308 300 end or nil, 309 301 preview_item = function(item) 310 - return item 302 + return { buf = item } 311 303 end, 312 304 }, props) 313 305 ) ··· 445 437 return require("mini.icons").get("file", item.v.path) 446 438 end or nil, 447 439 preview_item = function(v) 448 - return vim.fn.bufadd(v.path) 440 + return { buf = vim.fn.bufadd(v.path) } 449 441 end, 450 442 actions = extend( 451 443 {}, ··· 484 476 end) 485 477 end, 486 478 preview_item = function(item) 487 - return vim.api.nvim_create_buf(false, true), 488 - function(w) 489 - local buf = vim.api.nvim_win_get_buf(w) 490 - vim.bo[buf].bufhidden = "wipe" 491 - vim.bo[buf].buftype = "nofile" 492 - 493 - vim.api.nvim_buf_set_lines(buf, 0, -1, false, {}) 494 - vim.api.nvim_win_set_config(w, { hide = true }) 479 + vim.cmd.colorscheme(item) 480 + vim.o.background = bg 495 481 496 - vim.cmd.colorscheme(item) 497 - vim.o.background = bg 498 - end 482 + return {} 499 483 end, 500 484 }, props) 501 485 ) ··· 714 698 return string.format("%s:%d:%d:%s", item.name, item.lnum, item.col, item.text) 715 699 end, 716 700 preview_item = function(item) 717 - return item.bufnr, 718 - function(w) 719 - vim.api.nvim_set_option_value("cursorline", true, { scope = "local", win = w }) 720 - vim.api.nvim_win_set_cursor(w, { item.lnum, item.col }) 721 - end 701 + return { buf = item.bufnr, pos = { item.lnum, item.col }, pos_end = { item.end_lnum, item.end_col } } 722 702 end, 723 703 get_icon = config.get().opts.use_icons and function(item) 724 704 return require("mini.icons").get("file", item.v.name)
+1 -1
lua/artio/picker.lua
··· 13 13 ---@field on_close fun(text: string, idx: integer) 14 14 ---@field get_items? fun(input: string): artio.Picker.item[] 15 15 ---@field format_item? fun(item: any): string 16 - ---@field preview_item? fun(item: any): integer, fun(win: integer) 16 + ---@field preview_item? fun(item: any):{buf?:integer, pos?:[integer,integer], pos_end?:[integer,integer]} 17 17 ---@field get_icon? fun(item: artio.Picker.item): string, string 18 18 ---@field hl_item? fun(item: artio.Picker.item): artio.Picker.hl[] 19 19 ---@field on_quit? fun()
+15 -12
lua/artio/view.lua
··· 738 738 self:updatepreview() 739 739 end 740 740 741 - ---@return integer 742 - ---@return fun(win: integer)? 741 + ---@return {buf?:integer, pos?:[integer,integer], pos_end?:[integer,integer]}? 743 742 function View:openpreview() 744 743 if self.picker.idx == 0 then 745 - return -1 744 + return 746 745 end 747 746 748 747 local match = self.picker.matches[self.picker.idx] 749 748 local item = self.picker.items[match[1]] 750 749 751 750 if not item or not (self.picker.preview_item and vim.is_callable(self.picker.preview_item)) then 752 - return -1 751 + return 753 752 end 754 753 755 754 return self.picker.preview_item(item.v) ··· 764 763 local winborder = previewopts and previewopts.border or vim.o.winborder 765 764 return vim.tbl_extend("force", { 766 765 relative = "editor", 766 + focusable = false, 767 767 width = vim.o.columns, 768 768 height = self.win.height, 769 769 col = 0, ··· 775 775 end 776 776 777 777 function View:updatepreview() 778 - local buf, on_win = self:openpreview() 779 - if buf < 0 then 778 + local pr = self:openpreview() 779 + if not pr or not pr.buf then 780 780 return 781 781 end 782 782 783 783 if not self.preview_win then 784 - self.preview_win = vim.api.nvim_open_win(buf, false, self:previewconfig()) 784 + self.preview_win = vim.api.nvim_open_win(pr.buf, false, self:previewconfig()) 785 785 else 786 - vim.api.nvim_win_set_buf(self.preview_win, buf) 786 + vim.api.nvim_win_set_buf(self.preview_win, pr.buf) 787 787 end 788 788 789 789 vim._with({ win = self.preview_win, noautocmd = true }, function() 790 790 vim.api.nvim_set_option_value("previewwindow", true, { scope = "local" }) 791 791 vim.api.nvim_set_option_value("eventignorewin", "all,-FileType", { scope = "local" }) 792 + 793 + local sameline = pr.pos ~= nil and pr.pos_end == nil or pr.pos_end[1] == pr.pos[1] 794 + vim.api.nvim_set_option_value("cursorline", sameline, { scope = "local" }) 795 + 796 + if pr.pos then 797 + vim.api.nvim_win_set_cursor(self.preview_win, pr.pos) 798 + end 792 799 end) 793 - 794 - if on_win and vim.is_callable(on_win) then 795 - on_win(self.preview_win) 796 - end 797 800 end 798 801 799 802 function View:softupdatepreview()