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.init() 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({ "BufReadPost", "BufNewFile" }, { group = group, callback = function(args) require("git.repo").track(args.buf) end, }) vim.api.nvim_create_autocmd({ "BufWritePost", "FileChangedShellPost" }, { group = group, callback = function(args) require("git.repo").refresh(args.buf) end, }) vim.api.nvim_create_autocmd({ "BufDelete", "BufWipeout" }, { group = group, callback = function(args) require("git.repo").unbind(args.buf) end, }) vim.api.nvim_create_autocmd("FocusGained", { group = group, callback = function() require("git.repo").refresh_all() end, }) vim.api.nvim_create_autocmd("VimLeavePre", { group = group, callback = function() require("git.repo").stop_all() end, }) vim.api.nvim_create_autocmd({ "VimEnter", "DirChanged", "TabEnter" }, { group = group, callback = function() require("git.repo").update_cwd_repo() end, }) vim.api.nvim_create_autocmd("TabClosed", { group = group, callback = function(args) local tab = tonumber(args.file) --[[@as integer?]] if tab then require("git.repo").release_tab(tab) end end, }) 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) require("git.log").read_uri(args.buf) end, }) vim.api.nvim_create_user_command("Glog", function(opts) require("git.log").run_glog(opts) end, { nargs = "*", complete = function(...) return require("git.log").complete_glog(...) end, desc = "Show git log", }) local function diff_split_cmd(vertical) return function(opts) require("git.diff").split({ rev = opts.args ~= "" and opts.args or nil, vertical = vertical, }) end end local function complete_rev(...) return require("git.cmd").complete_rev(...) end vim.api.nvim_create_user_command("Gdiffsplit", diff_split_cmd(true), { nargs = "?", complete = complete_rev, desc = "Diff against ", }) vim.api.nvim_create_user_command("Gvdiffsplit", diff_split_cmd(true), { nargs = "?", complete = complete_rev, desc = "Diff against (vertical split)", }) vim.api.nvim_create_user_command("Ghdiffsplit", diff_split_cmd(false), { nargs = "?", complete = complete_rev, desc = "Diff against (horizontal split)", }) vim.api.nvim_create_user_command("Gedit", function(opts) vim.cmd.edit({ args = { require("git.object").URI_PREFIX .. opts.args }, magic = { file = false }, }) end, { nargs = 1, complete = complete_rev, desc = "Edit a git object ()", }) vim.api.nvim_create_user_command("G", function(opts) require("git.cmd").run(opts.fargs) end, { nargs = "*", complete = function(...) return require("git.cmd").complete(...) end, }) vim.api.nvim_create_user_command("Grefresh", function() require("git.repo").refresh_all() end, { desc = "Refresh git status for all repos" }) end return M