diff --git a/lua/neominimap/window/util.lua b/lua/neominimap/window/util.lua index e8a51dd..7f39618 100644 --- a/lua/neominimap/window/util.lua +++ b/lua/neominimap/window/util.lua @@ -60,7 +60,7 @@ local default_winopt = { signcolumn = "auto", number = false, relativenumber = false, - scrolloff = 99999, -- To center minimap + scrolloff = 0, sidescrolloff = 0, winblend = 0, cursorline = true, @@ -79,6 +79,23 @@ M.set_winopt = function(opt, winid) config.winopt(opt, winid) end +---@param winid integer +---@param row integer +local function set_line(winid, row) + local win_h = M.win_get_true_height(winid) + local bufnr = api.nvim_win_get_buf(winid) + local line_cnt = api.nvim_buf_line_count(bufnr) + local topline = math.floor(row - (row * win_h) / line_cnt) + row = math.max(1, math.min(row, line_cnt)) + topline = math.max(1, math.min(topline, line_cnt)) + return function() + local view = vim.fn.winsaveview() + view.topline = topline + view.lnum = row - 1 + vim.fn.winrestview(view) + end +end + ---@param swinid integer ---@param mwinid integer M.sync_to_minimap = function(swinid, mwinid) @@ -139,7 +156,7 @@ M.sync_to_source = function(swinid, mwinid) if row <= line_cnt then local util = require("neominimap.util") vim.schedule(function() - local ok = util.noautocmd(pcall)(vim.api.nvim_win_set_cursor, mwinid, { row, 0 }) + local ok = util.noautocmd(pcall)(api.nvim_win_call, mwinid, set_line(mwinid, row)) if not ok then logger.log.error("Failed to set cursor") end