diff --git a/flake.lock b/flake.lock index 4c759d8..afa21af 100644 --- a/flake.lock +++ b/flake.lock @@ -44,11 +44,11 @@ ] }, "locked": { - "lastModified": 1781365335, - "narHash": "sha256-zqDBhXMzfbdlO7F2bGHe7MOtB3xngd/+4ieMHDC+ZXo=", + "lastModified": 1782233665, + "narHash": "sha256-h/xOtrByoA/Ak1lWHn0O1lVZz4qWYbwOSLQ8YSwQO0I=", "owner": "nix-community", "repo": "home-manager", - "rev": "5b6f5733726a1b2ccafb5dec6ac4ca7299fad66c", + "rev": "062581938b4a378a82dfbb294b494808157153a1", "type": "github" }, "original": { @@ -106,11 +106,11 @@ ] }, "locked": { - "lastModified": 1781395489, - "narHash": "sha256-ld6NO2vmsMlhIWR0FiErScDwAPU/qoklYIO3RH1Cja8=", + "lastModified": 1782173092, + "narHash": "sha256-w6J7mhMUI5wXzsnHJQUX8BURO2f+e98q0LzfpBVCCdE=", "owner": "nix-community", "repo": "neovim-nightly-overlay", - "rev": "f76ad0e7ec9d947dcdfe3a511ace2f346994b4a0", + "rev": "70cfacc6ea1a24851e6d5c550456a95d4ca35f80", "type": "github" }, "original": { @@ -122,11 +122,11 @@ "neovim-src": { "flake": false, "locked": { - "lastModified": 1781386628, - "narHash": "sha256-4gqN17Kuob9x+mGmbBLLj3Jg1Ean/HPvRiY6M/GWgnk=", + "lastModified": 1782169544, + "narHash": "sha256-unNGqW0tmsqjdO1E6iOtYDIWu6MbesArGYlm8eYOe3s=", "owner": "neovim", "repo": "neovim", - "rev": "37239e724e9362c11fcd6c4e0af73bf74ff1c295", + "rev": "313be457f5d854b3a078f8db599a055060ce11b6", "type": "github" }, "original": { @@ -142,11 +142,11 @@ ] }, "locked": { - "lastModified": 1781242433, - "narHash": "sha256-bchLZZ3sRn740zyvD2icZSnNoTaanN0nw7l6fjVXO+E=", + "lastModified": 1781761792, + "narHash": "sha256-rCPytmKNjctLloB6UgK5CRrHSwV4b0ygxtJLPPp8R14=", "owner": "LnL7", "repo": "nix-darwin", - "rev": "aabb2037edfc0f210723b72cd5f528aab5dd3f0b", + "rev": "a1fa429e945becaf60468600daf649be4ba0350c", "type": "github" }, "original": { @@ -162,11 +162,11 @@ ] }, "locked": { - "lastModified": 1781422160, - "narHash": "sha256-W7S8O86bVrw2gaomEwkHStOzmPpnFIHQ6lS4Q2HffJ0=", + "lastModified": 1782030356, + "narHash": "sha256-h4WpMr455AfRub0FXBaon6Vcpe0waUyJ4GivIW6oyd4=", "owner": "nix-community", "repo": "nix-index-database", - "rev": "854d04e2368fb2e9c328a36b3c0a04cd713bfae1", + "rev": "3017088b49efd404f78e3b104f553b97e4af786b", "type": "github" }, "original": { @@ -198,11 +198,11 @@ "nixpkgs": "nixpkgs_3" }, "locked": { - "lastModified": 1781168557, - "narHash": "sha256-LOnLQ2tpYF9gqIDDr3+j3DbpJJr/QCH6zPRT2GzEUOE=", + "lastModified": 1782166108, + "narHash": "sha256-/EtnQBcKbsaCAGQ5VRcplrHRkR4ryqyLMpBfkVuG9Xw=", "owner": "NixOS", "repo": "nixos-hardware", - "rev": "6358ff76821101c178e3ab4919a62799bfe3652e", + "rev": "875776f0252fcb8618bb948640a0d1f7a5b362be", "type": "github" }, "original": { @@ -280,11 +280,11 @@ }, "nixpkgs_4": { "locked": { - "lastModified": 1781359544, - "narHash": "sha256-iUuzKQcyXvopYDDzFpMK5eQKP3WIJExYny2kJtbgUcE=", + "lastModified": 1782118813, + "narHash": "sha256-BnbXO5s5EhV89lLXMAGCzPdEN5a6vNqvMk71obeTEUw=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "9f11f828c213641c2369a9f1fa31fe31557e3156", + "rev": "b3c092d3c36d91e2f61f3dfb39a159f180a56659", "type": "github" }, "original": { @@ -332,11 +332,11 @@ "tmux": { "flake": false, "locked": { - "lastModified": 1781427606, - "narHash": "sha256-1+JzroT0MgPFN4qUYC95rnnlUcwD6M5dBIQ+MQwsIyE=", + "lastModified": 1782248405, + "narHash": "sha256-/qBzK4J9yKQrKzUrTYDE89LqeKIh7jPTWH1YUVmwQI4=", "owner": "tmux", "repo": "tmux", - "rev": "5eaf5570c41b5d57cb8fb6400f720c2bf12f7b14", + "rev": "ff8de1a106eca44bbf8cfca842aa32953d2593c8", "type": "github" }, "original": { @@ -352,11 +352,11 @@ ] }, "locked": { - "lastModified": 1781415399, - "narHash": "sha256-t7l/1scSsVAlw1r/vjEIX+SquZa/z6ibcOLBuXdJH7E=", + "lastModified": 1781847955, + "narHash": "sha256-1OSYOGuJp/NoODmSHjsz+6TB/kSilJ+BsFihjY7TTnc=", "owner": "youwen5", "repo": "zen-browser-flake", - "rev": "83ab3c3da2ba1a76a20882dbd253711d2cb8dcba", + "rev": "4bca251cd556677f7b765ff324d1638ae215be13", "type": "github" }, "original": { diff --git a/nvim/lua/jj-snacks.lua b/nvim/lua/jj-snacks.lua index 5d863fe..e1fda1d 100644 --- a/nvim/lua/jj-snacks.lua +++ b/nvim/lua/jj-snacks.lua @@ -172,12 +172,37 @@ Snacks.picker.jj_log_file = function() Snacks.picker.jj_log(vim.fn.expand("%:p")) end -Snacks.picker.jj_show = function(ref) - local title = "jj status" - if ref == nil then +Snacks.picker.jj_show = function(spec) + if type(spec) == "string" then + spec = { ref = spec } + end + spec = spec or {} + local ref = spec.ref + local range = spec.from ~= nil or spec.to ~= nil + if not range and ref == nil then ref = "@" end - if ref ~= "@" then + -- Selector args shared by the finder, preview and `jj show` lookups. + local function selector() + if range then + local sel = {} + if spec.from then + vim.list_extend(sel, { "--from", spec.from }) + end + if spec.to then + vim.list_extend(sel, { "--to", spec.to }) + end + return sel + end + return { "-r", ref } + end + + local show_ref = ref or spec.to or "@" + + local title = "jj status" + if range then + title = "jj diff " .. (spec.from or "@") .. ".." .. (spec.to or "@") + elseif ref ~= "@" then title = "jj diff " .. ref end -- Capture the open file before the picker takes over the current buffer, so @@ -191,7 +216,8 @@ Snacks.picker.jj_show = function(ref) supports_live = false, finder = function(opts, ctx) local cwd = jj_cwd(from, opts, ctx) - local args = { "diff", "--summary", "-r", ref } + local args = { "diff", "--summary" } + vim.list_extend(args, selector()) return require("snacks.picker.source.proc").proc( ctx:opts({ sep = "\n", @@ -245,11 +271,10 @@ Snacks.picker.jj_show = function(ref) if ref == "@" and (ctx.item.status == "A" or ctx.item.status == "?") then Snacks.picker.preview.file(ctx) else - Snacks.picker.preview.cmd( - { "jj", "diff", "--git", "--no-pager", "-r", ref, string.format("file:'%s'", ctx.item.file) }, - ctx, - { ft = "diff" } - ) + local cmd = { "jj", "diff", "--git", "--no-pager" } + vim.list_extend(cmd, selector()) + table.insert(cmd, string.format("file:'%s'", ctx.item.file)) + Snacks.picker.preview.cmd(cmd, ctx, { ft = "diff" }) end end, sort = { fields = { 'score:desc', 'idx' } }, @@ -275,12 +300,12 @@ Snacks.picker.jj_show = function(ref) end, jj_gsplit = function(picker, item) picker:close() - local commit = vim.trim(vim.fn.system({ "jj", "show", ref, "--template", "commit_id", "--no-patch" })) + local commit = vim.trim(vim.fn.system({ "jj", "show", show_ref, "--template", "commit_id", "--no-patch" })) vim.cmd('Gsplit ' .. vim.fn.fnameescape(commit .. ':' .. item.file)) end, jj_gvsplit = function(picker, item) picker:close() - local commit = vim.trim(vim.fn.system({ "jj", "show", ref, "--template", "commit_id", "--no-patch" })) + local commit = vim.trim(vim.fn.system({ "jj", "show", show_ref, "--template", "commit_id", "--no-patch" })) vim.cmd('Gvsplit ' .. vim.fn.fnameescape(commit .. ':' .. item.file)) end, }, diff --git a/nvim/lua/plugins/snacks.lua b/nvim/lua/plugins/snacks.lua index 93b10b3..83b451d 100644 --- a/nvim/lua/plugins/snacks.lua +++ b/nvim/lua/plugins/snacks.lua @@ -295,8 +295,11 @@ return { vim.keymap.set("n", "jl", Snacks.picker.jj_log, { desc = "jj log" }) - vim.keymap.set("n", "jh", Snacks.picker.jj_log_file, { desc = "jj log" }) + vim.keymap.set("n", "jh", Snacks.picker.jj_log_file, { desc = "jj file log" }) vim.keymap.set("n", "js", Snacks.picker.jj_show, { desc = "jj status" }) + vim.keymap.set("n", "jr", function() + Snacks.picker.jj_show({ from = "trunk()", to = "@" }) + end, { desc = "review branch" }) vim.keymap.set("n", "ju", function() Snacks.terminal.toggle("jjui")