combine diffs

This commit is contained in:
iofq 2025-10-24 21:58:25 -05:00
parent a004f24728
commit c8d9279372
9 changed files with 93 additions and 76 deletions

View file

@ -12,7 +12,7 @@ jobs:
runs-on: ubuntu-latest runs-on: ubuntu-latest
strategy: strategy:
matrix: matrix:
package_name: ["nvim-min"] package_name: ["nvim"]
steps: steps:
- uses: actions/checkout@v3 - uses: actions/checkout@v3
- uses: DeterminateSystems/nix-installer-action@main - uses: DeterminateSystems/nix-installer-action@main

View file

@ -5,7 +5,7 @@
## Usage ## Usage
Try it out! Try it out!
```bash ```bash
nix run "github:iofq/nvim.nix" #nvim-min nix run "github:iofq/nvim.nix" #nvim
``` ```
Or use in a flake: Or use in a flake:

60
flake.lock generated
View file

@ -6,11 +6,11 @@
"nixpkgs": "nixpkgs" "nixpkgs": "nixpkgs"
}, },
"locked": { "locked": {
"lastModified": 1760745932, "lastModified": 1761202123,
"narHash": "sha256-Z9idyP9kiKxC10VL0vHnxcBwrkpNtBrC+Zxl9mQbCj8=", "narHash": "sha256-ULrZW4b8SKRvPpJPt8/jkqqc/blQiIWUriNWVXA33so=",
"owner": "iofq", "owner": "iofq",
"repo": "dart.nvim", "repo": "dart.nvim",
"rev": "26b476f2113143329637a27d4e52ce9772bcae5b", "rev": "71421e7ef5aee8267e24dc562fdd07a83bda192e",
"type": "github" "type": "github"
}, },
"original": { "original": {
@ -93,11 +93,11 @@
] ]
}, },
"locked": { "locked": {
"lastModified": 1760813311, "lastModified": 1760948891,
"narHash": "sha256-lbHQ7FXGzt6/IygWvJ1lCq+Txcut3xYYd6VIpF1ojkg=", "narHash": "sha256-TmWcdiUUaWk8J4lpjzu4gCGxWY6/Ok7mOK4fIFfBuU4=",
"owner": "hercules-ci", "owner": "hercules-ci",
"repo": "flake-parts", "repo": "flake-parts",
"rev": "4e627ac2e1b8f1de7f5090064242de9a259dbbc8", "rev": "864599284fc7c0ba6357ed89ed5e2cd5040f0c04",
"type": "github" "type": "github"
}, },
"original": { "original": {
@ -267,11 +267,11 @@
] ]
}, },
"locked": { "locked": {
"lastModified": 1758022363, "lastModified": 1761230615,
"narHash": "sha256-ENUhCRWgSX4ni751HieNuQoq06dJvApV/Nm89kh+/A0=", "narHash": "sha256-pLE7U5gOtlA/2wbKCsVRYf5DqMQ5TWBCrCfZGytDDeo=",
"owner": "hercules-ci", "owner": "hercules-ci",
"repo": "hercules-ci-effects", "repo": "hercules-ci-effects",
"rev": "1a3667d33e247ad35ca250698d63f49a5453d824", "rev": "7db2b867219a26781437d840ce457b75b7645154",
"type": "github" "type": "github"
}, },
"original": { "original": {
@ -309,11 +309,11 @@
"treefmt-nix": "treefmt-nix" "treefmt-nix": "treefmt-nix"
}, },
"locked": { "locked": {
"lastModified": 1760832323, "lastModified": 1761437965,
"narHash": "sha256-THAk4qzBOsp03bDBYK9Ek3mQEvl2g8Fea0QhpCoEzfs=", "narHash": "sha256-X4SNeOXdFkE7Gt+waO5ck3TqfqWskqJHxt1WIu3nnUQ=",
"owner": "nix-community", "owner": "nix-community",
"repo": "neovim-nightly-overlay", "repo": "neovim-nightly-overlay",
"rev": "3c9432813e5528a13075f5493da6ff9ef249ad1d", "rev": "21595d9f79b5da0eef177dcfdd84ca981ac253a9",
"type": "github" "type": "github"
}, },
"original": { "original": {
@ -325,11 +325,11 @@
"neovim-src": { "neovim-src": {
"flake": false, "flake": false,
"locked": { "locked": {
"lastModified": 1760810839, "lastModified": 1761434579,
"narHash": "sha256-VYkZdjjMOYsugoSydDDWE/1l79swm4zc4NJl1Z0brjA=", "narHash": "sha256-S+YmbP/bPETjKk6B/tlh+jwIH7K7iPoXyHLLwTqVOhk=",
"owner": "neovim", "owner": "neovim",
"repo": "neovim", "repo": "neovim",
"rev": "be73c35943f85e7835c3a0fc89bddaeba944db29", "rev": "a121ede1bfee2704c26159124f8f61f96c6aa136",
"type": "github" "type": "github"
}, },
"original": { "original": {
@ -383,11 +383,11 @@
}, },
"nixpkgs_2": { "nixpkgs_2": {
"locked": { "locked": {
"lastModified": 1760913523, "lastModified": 1761497392,
"narHash": "sha256-Il5+67iRA3xp0cIErILj4VwEJ2ICrDrvTAHEmBsZJKQ=", "narHash": "sha256-aK+BZgnXKktKD1DFAJoB+8KD9L8sf/dmiOa2bShlhlk=",
"owner": "NixOS", "owner": "NixOS",
"repo": "nixpkgs", "repo": "nixpkgs",
"rev": "6a3b08503e9cab108f9f0ec27065c5854655662a", "rev": "887b4accbb94043a752c086c2aae6c6b365f7b3f",
"type": "github" "type": "github"
}, },
"original": { "original": {
@ -399,11 +399,11 @@
}, },
"nixpkgs_3": { "nixpkgs_3": {
"locked": { "locked": {
"lastModified": 1760524057, "lastModified": 1761114652,
"narHash": "sha256-EVAqOteLBFmd7pKkb0+FIUyzTF61VKi7YmvP1tw4nEw=", "narHash": "sha256-f/QCJM/YhrV/lavyCVz8iU3rlZun6d+dAiC3H+CDle4=",
"owner": "nixos", "owner": "nixos",
"repo": "nixpkgs", "repo": "nixpkgs",
"rev": "544961dfcce86422ba200ed9a0b00dd4b1486ec5", "rev": "01f116e4df6a15f4ccdffb1bcd41096869fb385c",
"type": "github" "type": "github"
}, },
"original": { "original": {
@ -416,11 +416,11 @@
"nvim-treesitter": { "nvim-treesitter": {
"flake": false, "flake": false,
"locked": { "locked": {
"lastModified": 1760866486, "lastModified": 1761385693,
"narHash": "sha256-ZeNCXy6+I18N+Nu2sKnEk2otVEb8V3tKhL8Jq95wS5k=", "narHash": "sha256-/SGikTPEMxI7rcfGvuJlNZs73/wZiQx14QX9xlfsTv0=",
"owner": "nvim-treesitter", "owner": "nvim-treesitter",
"repo": "nvim-treesitter", "repo": "nvim-treesitter",
"rev": "71bf1665f804d46f7e4b24ad7ffc11f6ea5b271a", "rev": "98fe644cb3b5ba390d1bc3f89299f93c70020803",
"type": "github" "type": "github"
}, },
"original": { "original": {
@ -437,11 +437,11 @@
"nvim-treesitter-textobjects": "nvim-treesitter-textobjects" "nvim-treesitter-textobjects": "nvim-treesitter-textobjects"
}, },
"locked": { "locked": {
"lastModified": 1760906917, "lastModified": 1761496664,
"narHash": "sha256-WJScDX0q/+PCRpvBSlJfV01kwvu9WCk5YDpzW2Zswj8=", "narHash": "sha256-xTQUiJu0jJNSEHEv4La1HbaFokup0eWr67Kqf/wDENA=",
"owner": "iofq", "owner": "iofq",
"repo": "nvim-treesitter-main", "repo": "nvim-treesitter-main",
"rev": "420c14c0523d65c6c7ce943e8f2fb896eff950e3", "rev": "834d66648bb7a96a2ad11d53a33f2d9b13766447",
"type": "github" "type": "github"
}, },
"original": { "original": {
@ -515,11 +515,11 @@
] ]
}, },
"locked": { "locked": {
"lastModified": 1760802554, "lastModified": 1761311587,
"narHash": "sha256-5YkOYOCF8/XNw89/ABKFB0c/P78U2EVuKRDGTql6+kA=", "narHash": "sha256-Msq86cR5SjozQGCnC6H8C+0cD4rnx91BPltZ9KK613Y=",
"owner": "numtide", "owner": "numtide",
"repo": "treefmt-nix", "repo": "treefmt-nix",
"rev": "296ebf0c3668ebceb3b0bfee55298f112b4b5754", "rev": "2eddae033e4e74bf581c2d1dfa101f9033dbd2dc",
"type": "github" "type": "github"
}, },
"original": { "original": {

View file

@ -73,7 +73,6 @@
packages = rec { packages = rec {
default = nvim; default = nvim;
nvim = pkgs.nvim-pkg; nvim = pkgs.nvim-pkg;
nvim-min = pkgs.nvim-min-pkg;
}; };
devShells = { devShells = {
default = shell; default = shell;

View file

@ -17,41 +17,18 @@ let
nvim-treesitter nvim-treesitter
nvim-treesitter-textobjects nvim-treesitter-textobjects
quicker-nvim quicker-nvim
refactoring-nvim
render-markdown-nvim render-markdown-nvim
snacks-nvim snacks-nvim
]; ];
basePackages = with prev; [ packages = with prev; [
ripgrep ripgrep
fd fd
]; ];
# Extra packages that should be included on nixos but don't need to be bundled
extraPackages = with prev; [
# linters
yamllint
jq
hadolint
nixfmt
shellcheck
golangci-lint
# LSPs
gopls
lua-language-server
nixd
basedpyright
];
in in
{ {
nvim-pkg = mkNeovim { nvim-pkg = mkNeovim {
inherit plugins; inherit plugins packages;
packages = basePackages ++ extraPackages;
};
nvim-min-pkg = mkNeovim {
inherit plugins;
packages = basePackages;
}; };
nvim-luarc-json = final.mk-luarc-json { nvim-luarc-json = final.mk-luarc-json {

View file

@ -62,6 +62,21 @@ function M.file_history(filename)
end end
end end
local function confirm(picker, item)
picker:close()
local cmd = string.format('jj show --git -r %s', item.rev)
local out = vim.fn.systemlist(cmd)
local bufnr = vim.api.nvim_create_buf(false, true)
vim.api.nvim_buf_set_lines(bufnr, 0, -1, false, out)
vim.bo[bufnr].bufhidden = 'wipe'
vim.bo[bufnr].buftype = 'nofile'
vim.bo[bufnr].filetype = 'diff'
vim.keymap.set('n', 'q', vim.cmd.bdelete, { buffer = bufnr, noremap = true })
vim.api.nvim_set_current_buf(bufnr)
end
local function get_history(f) local function get_history(f)
local status_raw = vim.fn.system( local status_raw = vim.fn.system(
'jj log --ignore-working-copy --no-graph' 'jj log --ignore-working-copy --no-graph'
@ -85,6 +100,7 @@ function M.file_history(filename)
title = 'jj file history for ' .. filename, title = 'jj file history for ' .. filename,
items = get_history(filename), items = get_history(filename),
preview = preview, preview = preview,
confirm = confirm,
} }
end end
return M return M

View file

@ -48,7 +48,7 @@ cmd('FileType', {
local ns = vim.api.nvim_create_namespace('nvim.difftool.hl') local ns = vim.api.nvim_create_namespace('nvim.difftool.hl')
vim.api.nvim_buf_clear_namespace(event.buf, ns, 0, -1) vim.api.nvim_buf_clear_namespace(event.buf, ns, 0, -1)
for i, item in ipairs(qf) do for i, item in ipairs(qf) do
local path = vim.fn.fnamemodify(item.user_data.right, ':t') local path = vim.fn.fnamemodify(item.user_data.right, ':.')
local hl = 'Added' local hl = 'Added'
if if
exec('git diff --quiet -- %s', path) ~= 0 exec('git diff --quiet -- %s', path) ~= 0
@ -98,6 +98,45 @@ cmd('BufWinEnter', {
vim.cmd(string.format('%dcopen', math.min(10, #items))) vim.cmd(string.format('%dcopen', math.min(10, #items)))
end) end)
end end
local function get_hunks(bufnr)
local conf_start = vim.fn.search('^<<<<<<<', 'bc')
local base_start = vim.fn.search('^|||||||', 'W')
local base_end = vim.fn.search('^=======', 'W')
local conf_end = vim.fn.search('^>>>>>>>', 'W')
local left = vim.api.nvim_buf_get_lines(bufnr, conf_start, base_start - 1, false)
local right = vim.api.nvim_buf_get_lines(bufnr, base_end, conf_end - 1, false)
return {
start = conf_start,
stop = conf_end,
left = left,
right = right,
}
end
local function apply_hunk(hunks, first)
local result = {}
if first == -1 then -- left first
vim.list_extend(result, hunks.left)
vim.list_extend(result, hunks.right)
else
vim.list_extend(result, hunks.right)
vim.list_extend(result, hunks.left)
end
-- apply hunk in place
vim.api.nvim_buf_set_lines(0, hunks.start - 1, hunks.stop, false, result)
end
-- "combine" mappings ala vscode's merge editor
vim.keymap.set('n', '<leader>dl', function()
apply_hunk(get_hunks(event.buf), -1)
end, { buffer = event.buf })
vim.keymap.set('n', '<leader>dr', function()
apply_hunk(get_hunks(event.buf), 1)
end, { buffer = event.buf })
end, end,
}) })

View file

@ -18,9 +18,7 @@ vim.schedule(function()
require('mini.git').setup() require('mini.git').setup()
map('n', '<leader>gb', '<Cmd>Git blame -- %<CR>') map('n', '<leader>gb', '<Cmd>Git blame -- %<CR>')
map('n', '<leader>go', function() map('n', '<leader>go', MiniGit.show_at_cursor)
return MiniGit.show_at_cursor()
end)
local jump = require('mini.jump2d') local jump = require('mini.jump2d')
jump.setup { jump.setup {

View file

@ -3,12 +3,7 @@ local map = vim.keymap.set
require('mini.basics').setup { mappings = { windows = true } } require('mini.basics').setup { mappings = { windows = true } }
require('mini.icons').setup() require('mini.icons').setup()
require('dart').setup { require('dart').setup {}
tabline = {
icons = false,
label_marked_fg = 'cyan',
},
}
require('snacks').setup { require('snacks').setup {
bigfile = { enabled = true }, bigfile = { enabled = true },
@ -65,12 +60,6 @@ vim.schedule(function()
require('nvim-treesitter-textobjects').setup() require('nvim-treesitter-textobjects').setup()
require('nvim-autopairs').setup() require('nvim-autopairs').setup()
require('refactoring').setup()
map('n', '<leader>rr', require('refactoring').select_refactor)
map('n', '<leader>rv', function()
require('refactoring').refactor('Inline Variable')
end)
require('quicker').setup() require('quicker').setup()
map('n', '<leader>qf', function() map('n', '<leader>qf', function()
require('quicker').toggle { max_height = 20 } require('quicker').toggle { max_height = 20 }
@ -82,7 +71,6 @@ vim.schedule(function()
json = { 'jq' }, json = { 'jq' },
lua = { 'stylua' }, lua = { 'stylua' },
python = { 'ruff' }, python = { 'ruff' },
nix = { 'nixfmt' },
fish = { 'fish_indent' }, fish = { 'fish_indent' },
['*'] = { 'trim_whitespace' }, ['*'] = { 'trim_whitespace' },
}, },
@ -128,7 +116,7 @@ vim.schedule(function()
sources = { sources = {
default = { 'lsp', 'path', 'snippets', 'ripgrep', 'buffer' }, default = { 'lsp', 'path', 'snippets', 'ripgrep', 'buffer' },
providers = { providers = {
lsp = { fallbacks = {} }, -- include buffer even when LSP is active lsp = { fallbacks = {}, async = true }, -- include buffer even when LSP is active
path = { opts = { get_cwd = vim.fn.getcwd } }, -- use nvim pwd instead of current file pwd path = { opts = { get_cwd = vim.fn.getcwd } }, -- use nvim pwd instead of current file pwd
ripgrep = { ripgrep = {
module = 'blink-ripgrep', module = 'blink-ripgrep',