diff --git a/lua/lazyvim/config/keymaps.lua b/lua/lazyvim/config/keymaps.lua index 768a41b8..b1db0b44 100644 --- a/lua/lazyvim/config/keymaps.lua +++ b/lua/lazyvim/config/keymaps.lua @@ -134,6 +134,7 @@ map("n", "ub", function() LazyVim.toggle("background", false, {"light", map("n", "gg", function() LazyVim.lazygit( { cwd = LazyVim.root.git() }) end, { desc = "Lazygit (Root Dir)" }) map("n", "gG", function() LazyVim.lazygit() end, { desc = "Lazygit (cwd)" }) map("n", "gb", LazyVim.lazygit.blame_line, { desc = "Git Blame Line" }) +map("n", "gB", LazyVim.lazygit.browse, { desc = "Git Browse" }) map("n", "gf", function() local git_path = vim.api.nvim_buf_get_name(0) diff --git a/lua/lazyvim/util/lazygit.lua b/lua/lazyvim/util/lazygit.lua index e360ad82..1786eefd 100644 --- a/lua/lazyvim/util/lazygit.lua +++ b/lua/lazyvim/util/lazygit.lua @@ -159,4 +159,36 @@ function M.blame_line(opts) return require("lazy.util").float_cmd(cmd, opts) end +function M.browse() + local config = require("lazy.manage.git").get_config(LazyVim.root.detectors.pattern(0, { ".git" })[1]) + local remotes = {} ---@type {name:string, url:string}[] + for name, url in pairs(config) do + name = name:match("^remote%.(.-)%.url$") + if name then + url = url:gsub("git@github.com:", "https://github.com/"):gsub("%.git$", "") --[[@as string]] + table.insert(remotes, { name = name, url = url }) + end + end + + local function open(remote) + if remote then + LazyVim.info(("Opening [%s](%s)"):format(remote.name, remote.url)) + vim.ui.open(remote.url) + end + end + + if #remotes == 0 then + return LazyVim.error("No git remotes found") + elseif #remotes == 1 then + return open(remotes[1]) + end + + vim.ui.select(remotes, { + prompt = "Select remote to browse", + format_item = function(item) + return item.name .. (" "):rep(8 - #item.name) .. " 🔗 " .. item.url + end, + }, open) +end + return M