Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 19 additions & 0 deletions nvim/.config/nvim/after/plugin/gitsigns.lua
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
if vim.g.vscode then
return
end

if require("greg.gitsigns").setup() then
return
end

-- First launch may install gitsigns asynchronously; PackChanged retriggers setup.
vim.api.nvim_create_autocmd("PackChanged", {
callback = function(ev)
if ev.data.spec.name ~= "gitsigns.nvim" then
return
end
vim.schedule(function()
require("greg.gitsigns").setup()
end)
end,
})
5 changes: 5 additions & 0 deletions nvim/.config/nvim/after/plugin/starter.lua
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,11 @@ require("mini.starter").setup({
},
-- Oil
{ name = "Oil", action = ":Oil", section = "Explorer" },
{
name = "Git Changed Tabs",
action = ":lua require('greg.git').open_changed_tabs()",
section = "Explorer",
},
-- Configuration
{ name = "Theme", action = ":Themery", section = "Config" },
{ name = "Pack Update", action = ":lua vim.pack.update()", section = "Config" },
Expand Down
12 changes: 11 additions & 1 deletion nvim/.config/nvim/after/plugin/transparent.lua
Original file line number Diff line number Diff line change
Expand Up @@ -35,5 +35,15 @@ transparent.setup({
extra_groups = {
"NormalFloat", -- float panels (Mason, LspInfo, etc.)
},
exclude_groups = {},
exclude_groups = {
"GitSignsAdd",
"GitSignsChange",
"GitSignsDelete",
"GitSignsAddNr",
"GitSignsChangeNr",
"GitSignsDeleteNr",
"GitSignsAddLn",
"GitSignsChangeLn",
"GitSignsDeleteLn",
},
})
95 changes: 95 additions & 0 deletions nvim/.config/nvim/lua/greg/git.lua
Original file line number Diff line number Diff line change
@@ -0,0 +1,95 @@
local M = {}

---@return string?
local function git_root()
local result = vim.system({ "git", "rev-parse", "--show-toplevel" }):wait()
if result.code ~= 0 then
return nil
end
return vim.trim(result.stdout or "")
end

---@param stdout string?
local function append_nul_paths(stdout, seen, files)
if not stdout or stdout == "" then
return
end
for path in stdout:gmatch("[^%z]+") do
if not seen[path] then
seen[path] = true
files[#files + 1] = path
end
end
end

--- Unstaged modifications and untracked new files (paths relative to repo root).
---@return string[] files
---@return string? root
function M.changed_files()
local root = git_root()
if not root then
return {}, nil
end

local seen = {}
local files = {}

local diff = vim
.system({
"git",
"-C",
root,
"diff",
"--name-only",
"-z",
"--diff-filter=d",
}, { text = false })
:wait()
if diff.code == 0 then
append_nul_paths(diff.stdout, seen, files)
end

local untracked = vim
.system({
"git",
"-C",
root,
"ls-files",
"-z",
"--others",
"--exclude-standard",
}, { text = false })
:wait()
if untracked.code == 0 then
append_nul_paths(untracked.stdout, seen, files)
end

table.sort(files)
return files, root
end

function M.open_changed_tabs()
local files, root = M.changed_files()
if not root then
vim.notify("GitChangedTabs: not a git repository", vim.log.levels.ERROR)
return
end
if #files == 0 then
vim.notify("GitChangedTabs: no unstaged or new files", vim.log.levels.INFO)
return
end

local home_tab = vim.fn.tabpagenr()
local opened = 0
for _, rel in ipairs(files) do
local path = vim.fs.joinpath(root, rel)
vim.cmd.tabnew({ args = { vim.fn.fnameescape(path) } })
opened = opened + 1
end

vim.cmd.tabclose(home_tab)
vim.cmd.tabfirst()
Comment thread
coderabbitai[bot] marked this conversation as resolved.
Outdated
vim.notify(("GitChangedTabs: opened %d file(s)"):format(opened), vim.log.levels.INFO)
end

return M
60 changes: 60 additions & 0 deletions nvim/.config/nvim/lua/greg/gitsigns.lua
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
local M = {}

local setup_done = false

function M.setup()
if setup_done or vim.g.vscode then
return setup_done
end

local ok, gitsigns = pcall(require, "gitsigns")
if not ok then
return false
end

gitsigns.setup({
word_diff = true,
numhl = true,
signs = {
add = { text = "+" },
change = { text = "│" },
delete = { text = "_" },
topdelete = { text = "‾" },
changedelete = { text = "~" },
untracked = { text = "?" },
},
on_attach = function(bufnr)
local function map(mode, lhs, rhs, desc)
vim.keymap.set(mode, lhs, rhs, { buffer = bufnr, desc = desc, silent = true })
end

map("n", "]c", function()
if vim.wo.diff then
vim.cmd.normal({ "]c", bang = true })
else
gitsigns.nav_hunk("next")
end
end, "Git: next hunk")

map("n", "[c", function()
if vim.wo.diff then
vim.cmd.normal({ "[c", bang = true })
else
gitsigns.nav_hunk("prev")
end
end, "Git: previous hunk")

map("n", "<leader>gi", gitsigns.preview_hunk_inline, "Git: preview hunk inline")
end,
})

vim.keymap.set("n", "<leader>gt", function()
require("greg.git").open_changed_tabs()
end, { desc = "Git: open changed files in tabs" })
vim.keymap.set("n", "<leader>gw", gitsigns.toggle_word_diff, { desc = "Git: toggle inline word diff" })

setup_done = true
return true
end

return M
6 changes: 6 additions & 0 deletions nvim/.config/nvim/lua/greg/pack.lua
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,11 @@ vim.api.nvim_create_autocmd("PackChanged", {
pcall(vim.cmd, "TSUpdate")
end)
end
if name == "gitsigns.nvim" and (kind == "install" or kind == "update") then
vim.schedule(function()
pcall(require, "greg.gitsigns")
end)
end
end,
})

Expand Down Expand Up @@ -45,6 +50,7 @@ vim.pack.add({
{ src = gh("mbbill/undotree"), version = "6fa6b57cda8459e1e4b2ca34df702f55242f4e4d" },
{ src = gh("numToStr/Comment.nvim"), version = "e30b7f2008e52442154b66f7c519bfd2f1e32acb" },
{ src = gh("tpope/vim-fugitive"), version = "3b753cf8c6a4dcde6edee8827d464ba9b8c4a6f0" },
{ src = gh("lewis6991/gitsigns.nvim"), version = "2038c666bd9d8a0b7349a0b6ee00dc83104b9ecf" },

{ src = gh("nvim-lualine/lualine.nvim"), version = "131a558e13f9f28b15cd235557150ccb23f89286" },
{ src = gh("echasnovski/mini.starter"), version = "7bdc9decc8b623f245c1e42a64bc41e61d574c5e" },
Expand Down
2 changes: 1 addition & 1 deletion nvim/.config/nvim/lua/greg/set.lua
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ vim.opt.incsearch = true
vim.opt.termguicolors = true

vim.opt.scrolloff = 8
vim.opt.signcolumn = "yes"
vim.opt.signcolumn = "auto"
vim.opt.isfname:append("@-@")

vim.opt.updatetime = 50
Expand Down
5 changes: 5 additions & 0 deletions nvim/.config/nvim/nvim-pack-lock.json
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,11 @@
"src": "https://github.com/stevearc/conform.nvim",
"version": "'dca1a190aa85f9065979ef35802fb77131911106'"
},
"gitsigns.nvim": {
"rev": "2038c666bd9d8a0b7349a0b6ee00dc83104b9ecf",
"src": "https://github.com/lewis6991/gitsigns.nvim",
"version": "'2038c666bd9d8a0b7349a0b6ee00dc83104b9ecf'"
},
"harpoon": {
"rev": "1bc17e3e42ea3c46b33c0bbad6a880792692a1b3",
"src": "https://github.com/ThePrimeagen/harpoon",
Expand Down