diff --git a/lua/artio/builtins.lua b/lua/artio/builtins.lua index 767c867..0950997 100644 --- a/lua/artio/builtins.lua +++ b/lua/artio/builtins.lua @@ -69,7 +69,7 @@ builtins.files = function(props) return require("mini.icons").get("file", item.v) end or nil, preview_item = function(item) - return vim.fn.bufadd(item) + return { buf = vim.fn.bufadd(item) } end, actions = extend( {}, @@ -135,11 +135,7 @@ builtins.grep = function(props) end) end, preview_item = function(item) - return vim.fn.bufadd(item[1]), - function(w) - vim.api.nvim_set_option_value("cursorline", true, { scope = "local", win = w }) - vim.api.nvim_win_set_cursor(w, { item[2], 0 }) - end + return { buf = vim.fn.bufadd(item[1]), pos = { item[2], 0 } } end, get_icon = config.get().opts.use_icons and function(item) return require("mini.icons").get("file", item.v[1]) @@ -180,7 +176,7 @@ builtins.oldfiles = function(props) return require("mini.icons").get("file", item.v) end or nil, preview_item = function(item) - return vim.fn.bufadd(item) + return { buf = vim.fn.bufadd(item) } end, actions = extend( {}, @@ -217,11 +213,7 @@ builtins.buffergrep = function(props) return vim.api.nvim_buf_get_lines(buf, row - 1, row, true)[1] end, preview_item = function(row) - return buf, - function(w) - vim.api.nvim_set_option_value("cursorline", true, { scope = "local", win = w }) - vim.api.nvim_win_set_cursor(w, { row, 0 }) - end + return { buf = buf, pos = { row, 0 } } end, get_icon = function(row) local v = tostring(row.v) @@ -263,16 +255,16 @@ builtins.helptags = function(props) end) end, preview_item = function(tag) - return vim.api.nvim_create_buf(false, true), - function(w) - local buf = vim.api.nvim_win_get_buf(w) - vim.bo[buf].bufhidden = "wipe" - vim.bo[buf].buftype = "help" - - vim._with({ buf = buf }, function() - vim.cmd.help(tag) - end) - end + local buf = vim.api.nvim_create_buf(false, true) + + vim.bo[buf].bufhidden = "wipe" + vim.bo[buf].buftype = "help" + + vim._with({ buf = buf }, function() + vim.cmd.help(tag) + end) + + return { buf = buf } end, }, props) ) @@ -307,7 +299,7 @@ builtins.buffers = function(props) return require("mini.icons").get("file", vim.api.nvim_buf_get_name(item.v)) end or nil, preview_item = function(item) - return item + return { buf = item } end, }, props) ) @@ -445,7 +437,7 @@ builtins.smart = function(props) return require("mini.icons").get("file", item.v.path) end or nil, preview_item = function(v) - return vim.fn.bufadd(v.path) + return { buf = vim.fn.bufadd(v.path) } end, actions = extend( {}, @@ -484,18 +476,10 @@ builtins.colorschemes = function(props) end) end, preview_item = function(item) - return vim.api.nvim_create_buf(false, true), - function(w) - local buf = vim.api.nvim_win_get_buf(w) - vim.bo[buf].bufhidden = "wipe" - vim.bo[buf].buftype = "nofile" - - vim.api.nvim_buf_set_lines(buf, 0, -1, false, {}) - vim.api.nvim_win_set_config(w, { hide = true }) + vim.cmd.colorscheme(item) + vim.o.background = bg - vim.cmd.colorscheme(item) - vim.o.background = bg - end + return {} end, }, props) ) @@ -714,11 +698,7 @@ builtins.quickfix = function(props) return string.format("%s:%d:%d:%s", item.name, item.lnum, item.col, item.text) end, preview_item = function(item) - return item.bufnr, - function(w) - vim.api.nvim_set_option_value("cursorline", true, { scope = "local", win = w }) - vim.api.nvim_win_set_cursor(w, { item.lnum, item.col }) - end + return { buf = item.bufnr, pos = { item.lnum, item.col }, pos_end = { item.end_lnum, item.end_col } } end, get_icon = config.get().opts.use_icons and function(item) return require("mini.icons").get("file", item.v.name) diff --git a/lua/artio/picker.lua b/lua/artio/picker.lua index 7c726fb..455f4ac 100644 --- a/lua/artio/picker.lua +++ b/lua/artio/picker.lua @@ -13,7 +13,7 @@ local View = require("artio.view") ---@field on_close fun(text: string, idx: integer) ---@field get_items? fun(input: string): artio.Picker.item[] ---@field format_item? fun(item: any): string ----@field preview_item? fun(item: any): integer, fun(win: integer) +---@field preview_item? fun(item: any):{buf?:integer, pos?:[integer,integer], pos_end?:[integer,integer]} ---@field get_icon? fun(item: artio.Picker.item): string, string ---@field hl_item? fun(item: artio.Picker.item): artio.Picker.hl[] ---@field on_quit? fun() diff --git a/lua/artio/view.lua b/lua/artio/view.lua index 38d1ea1..0869f4c 100644 --- a/lua/artio/view.lua +++ b/lua/artio/view.lua @@ -738,18 +738,17 @@ function View:togglepreview() self:updatepreview() end ----@return integer ----@return fun(win: integer)? +---@return {buf?:integer, pos?:[integer,integer], pos_end?:[integer,integer]}? function View:openpreview() if self.picker.idx == 0 then - return -1 + return end local match = self.picker.matches[self.picker.idx] local item = self.picker.items[match[1]] if not item or not (self.picker.preview_item and vim.is_callable(self.picker.preview_item)) then - return -1 + return end return self.picker.preview_item(item.v) @@ -764,6 +763,7 @@ function View:previewconfig() local winborder = previewopts and previewopts.border or vim.o.winborder return vim.tbl_extend("force", { relative = "editor", + focusable = false, width = vim.o.columns, height = self.win.height, col = 0, @@ -775,25 +775,28 @@ function View:previewconfig() end function View:updatepreview() - local buf, on_win = self:openpreview() - if buf < 0 then + local pr = self:openpreview() + if not pr or not pr.buf then return end if not self.preview_win then - self.preview_win = vim.api.nvim_open_win(buf, false, self:previewconfig()) + self.preview_win = vim.api.nvim_open_win(pr.buf, false, self:previewconfig()) else - vim.api.nvim_win_set_buf(self.preview_win, buf) + vim.api.nvim_win_set_buf(self.preview_win, pr.buf) end vim._with({ win = self.preview_win, noautocmd = true }, function() vim.api.nvim_set_option_value("previewwindow", true, { scope = "local" }) vim.api.nvim_set_option_value("eventignorewin", "all,-FileType", { scope = "local" }) - end) - if on_win and vim.is_callable(on_win) then - on_win(self.preview_win) - end + local sameline = pr.pos ~= nil and pr.pos_end == nil or pr.pos_end[1] == pr.pos[1] + vim.api.nvim_set_option_value("cursorline", sameline, { scope = "local" }) + + if pr.pos then + vim.api.nvim_win_set_cursor(self.preview_win, pr.pos) + end + end) end function View:softupdatepreview()