local HIGHLIGHTS = { GitDeleted = "Removed", GitIgnored = "Comment", GitUnstaged = "Changed", GitRenamed = "GitStaged", GitSha = "Identifier", GitStaged = "Constant", GitUnmerged = "Todo", GitUnpulled = "Removed", GitUnpushed = "Added", GitUntracked = "Added", } local M = {} function M.status() return vim.b.git_status or "" end ---@param path string ---@return string? function M.head(path) return require("git.repo").head(path) end function M.setup() local cmd = require("git.cmd") local commit = require("git.commit") local diff = require("git.diff") local log = require("git.log") local repo = require("git.repo") for name, link in pairs(HIGHLIGHTS) do vim.api.nvim_set_hl(0, name, { link = link, default = true }) end local group = vim.api.nvim_create_augroup("ow.git", { clear = true }) vim.api.nvim_create_autocmd("BufReadCmd", { pattern = "git://*", group = group, callback = function(args) require("git.object").read_uri(args.buf) end, }) vim.api.nvim_create_autocmd("BufReadCmd", { pattern = "gitlog://*", group = group, callback = function(args) log.read_uri(args.buf) end, }) vim.api.nvim_create_autocmd( { "BufReadPost", "BufNewFile", "BufWritePost", "FileChangedShellPost" }, { group = group, callback = function(args) repo.refresh_buf(args.buf) end, } ) vim.api.nvim_create_autocmd({ "BufDelete", "BufWipeout" }, { group = group, callback = function(args) repo.unregister(args.buf) end, }) vim.api.nvim_create_autocmd("FocusGained", { group = group, callback = function() repo.refresh_buf(vim.api.nvim_get_current_buf()) end, }) vim.api.nvim_create_autocmd("VimLeavePre", { group = group, callback = function() repo.stop_all() end, }) vim.keymap.set( "n", "gg", require("git.sidebar").toggle, { desc = "Toggle git status sidebar" } ) vim.keymap.set("n", "gl", function() log.open({ max_count = 1000 }) end, { desc = "Show git log" }) vim.keymap.set("n", "gd", function() diff.split({ vertical = true }) end, { desc = "Diff index vs worktree (vsplit)" }) vim.keymap.set("n", "gD", function() diff.split({ rev = "HEAD", vertical = true }) end, { desc = "Diff HEAD vs worktree (vsplit)" }) vim.keymap.set("n", "gh", function() diff.split({ vertical = false }) end, { desc = "Diff index vs worktree (split)" }) vim.keymap.set("n", "gH", function() diff.split({ rev = "HEAD", vertical = false }) end, { desc = "Diff HEAD vs worktree (split)" }) vim.keymap.set("n", "gc", function() commit.commit() end, { desc = "Git commit" }) vim.keymap.set("n", "ga", function() commit.commit({ amend = true }) end, { desc = "Git commit --amend" }) vim.keymap.set("n", "gp", function() cmd.run({ "push" }) end, { desc = "Git push" }) local function diff_split_cmd(vertical) return function(opts) diff.split({ rev = opts.args ~= "" and opts.args or nil, vertical = vertical, }) end end vim.api.nvim_create_user_command( "Gdiffsplit", diff_split_cmd(true), { nargs = "?", desc = "Diff against (vsplit)" } ) vim.api.nvim_create_user_command( "Ghdiffsplit", diff_split_cmd(false), { nargs = "?", desc = "Diff against (split)" } ) cmd.setup() end return M