NeogitOrg / neogit

An interactive and powerful Git interface for Neovim, inspired by Magit
MIT License
4.1k stars 241 forks source link

Diffviewer changes focus to first file after save #1448

Open radmen opened 3 months ago

radmen commented 3 months ago

Description

In diffview, after staging chunk of changes, the focus goes back to the first file in the navigator. This becomes a problem when diffing multiple files and auto-save plugin is enabled.

What happens is that I constantly need to find the last staged file, and move to the next one. It is quite an issue when trying to stage many different files.

https://github.com/user-attachments/assets/12657e65-7534-4dd6-8bc3-5e0aae6830d1

Neovim version

NVIM v0.10.1 Build type: Release LuaJIT 2.1.1720049189 Run "nvim -V1 -v" for more info

Operating system and version

Fedora Bluefin

Steps to reproduce

  1. Prepare repo:
    mkdir /tmp/repro
    cd /tmp/repro
    echo "README\n" > README.md
    echo "UPDATING\n" > UPDATING.md
    echo "TEST\n" > TEST.md
    git add .
    git commit -m "Add files"
  2. Make some changes:
    echo "Hello There" >> README.md
    echo "Hello There" >> UPDATING.md
    echo "Hello There" >> TEST.md
  3. nvim -u minimal.lua
  4. :Neogit<CR>
  5. d u (open diff for unstaged files)
  6. Stage changes for the first file
  7. Stage changes for the second file

Expected behavior

Focus should remain on the just-staged file.

Actual behavior

Focus moves to the first file in tree.

Minimal config

vim.env.LAZY_STDPATH = "/tmp/.repro"
load(vim.fn.system("curl -s https://raw.githubusercontent.com/folke/lazy.nvim/main/bootstrap.lua"))()

require("lazy.minit").repro({
  spec = {
    -- add any other plugins here
    {
      "NeogitOrg/neogit",
      dependencies = {
        "nvim-lua/plenary.nvim",         -- required
        "sindrets/diffview.nvim",        -- optional - Diff integration

        -- Only one of these is needed, not both.
        "nvim-telescope/telescope.nvim", -- optional
        "ibhagwan/fzf-lua",              -- optional
      },
      config = true
    },
  },
})
CKolkey commented 3 months ago

I'd recommend just staging from Neogit, not diffview. Upon returning to the neogit buffer, it refreshes, and tries to save/restore the cursor position, but it'll fail to restore in this case and default to the first item.

You can stage individual hunks, or lines, from neogit itself, so diffview isn't really needed for that at all.

radmen commented 3 months ago

The default staging method is good only if you stage smaller blocks. For larger ones, the side-by-side diff offered by diffview is more convenient.

Since diffview is part of Neogit (although optional, I get it), I assume it should just work. Now, the overall UX is clunky.