diff --git a/modules/home/nvim/lua/plugins/telescope.lua b/modules/home/nvim/lua/plugins/telescope.lua index 2d7161f..4d409cb 100644 --- a/modules/home/nvim/lua/plugins/telescope.lua +++ b/modules/home/nvim/lua/plugins/telescope.lua @@ -77,6 +77,8 @@ return { end, config = function(_, opts) local telescope = require("telescope") + -- Load my override of git_status + require("telescope._extensions.git_status") telescope.setup(opts) telescope.load_extension("fzf") telescope.load_extension("git_show") diff --git a/modules/home/nvim/lua/telescope/_extensions/git_status.lua b/modules/home/nvim/lua/telescope/_extensions/git_status.lua new file mode 100644 index 0000000..17762a5 --- /dev/null +++ b/modules/home/nvim/lua/telescope/_extensions/git_status.lua @@ -0,0 +1,61 @@ +local previewers = require("telescope.previewers") +local putils = require "telescope.previewers.utils" +local from_entry = require "telescope.from_entry" +local conf = require("telescope.config").values + +local function defaulter(f, default_opts) + default_opts = default_opts or {} + return { + new = function(opts) + if conf.preview == false and not opts.preview then + return false + end + opts.preview = type(opts.preview) ~= "table" and {} or opts.preview + if type(conf.preview) == "table" then + for k, v in pairs(conf.preview) do + opts.preview[k] = vim.F.if_nil(opts.preview[k], v) + end + end + return f(opts) + end, + __call = function() + local ok, err = pcall(f(default_opts)) + if not ok then + error(debug.traceback(err)) + end + end, + } +end + +previewers.git_file_diff = defaulter(function(opts) + return previewers.new_buffer_previewer { + title = "Git File Diff Preview", + get_buffer_by_name = function(_, entry) + return entry.value + end, + + define_preview = function(self, entry, status) + if entry.status and (entry.status == "??" or entry.status == "A ") then + local p = from_entry.path(entry, true) + if p == nil or p == "" then + return + end + conf.buffer_previewer_maker(p, self.state.bufnr, { + bufname = self.state.bufname, + winid = self.state.winid, + }) + else + putils.job_maker({ "git", "--no-pager", "diff", "HEAD", "--", entry.value }, self.state.bufnr, { + value = entry.value, + bufname = self.state.bufname, + cwd = opts.cwd, + callback = function(bufnr) + if vim.api.nvim_buf_is_valid(bufnr) then + putils.regex_highlighter(bufnr, "diff") + end + end, + }) + end + end, + } +end, {})