Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Bug] Diffview flashes current window's open buffer when showing file diff or history #509

Open
charbelnicolas opened this issue Jun 7, 2024 · 3 comments
Labels
bug Something isn't working

Comments

@charbelnicolas
Copy link
Contributor

Description

I don't think I had noticed this in the previous months but now it's really hard to unsee. When opening a Diffview window (either DiffviewOpen or DiffviewFileHistory), unless it's the very first time opening it (it is possible then to fix and not flash a buffer!), it will flash the current focused window buffer on both Diffview editor windows.

Let's assume I have this window open:

ss_2024_06_07_10_47_17

After opening a Diffview window once, If I open Diffview again, every consequent DiffviewOpen will flash the current focused buffer first instead of showing the right contents.

ss_2024_06_07_10_46_35

And it is then that the correct buffer will show:

ss_2024_06_07_10_46_54

Here's a video:

https://drive.google.com/file/d/11-etwvc3RU5f5bLy2_YVllcG0jYz5CY3/view?usp=sharing

Expected behavior

I expect to transition correctly into the desired Diffview output instead of seeing a flash of my current focused window buffer.

Actual behavior

I see a flash of buffer content that is not correct.

Steps to reproduce

  1. nvim --clean -u mini.lua
  2. Open a file in a git repository
  3. Do DiffviewOpen at least twice (first always comes clean)

Health check

diffview: require("diffview.health").check()

Checking plugin dependencies ~
- WARNING Optional dependency 'nvim-web-devicons' not found.

Checking VCS tools ~
- The plugin requires at least one of the supported VCS tools to be valid.
- OK Git found.
- OK Git is up-to-date. (2.45.2)
- WARNING Configured `hg_cmd` is not executable: 'hg'

Log info

Relevant info from :DiffviewLog
############################
### PUT LOG CONTENT HERE ###
############################

Neovim version

NVIM v0.11.0-dev-196+g2ce4a4d91e
Build type: Release
LuaJIT 2.1.1716656478

Operating system and version

Linux 6.9.3-arch1-1 x86_64 GNU/Linux

Minimal config

-- #######################################
-- ### USAGE: nvim --clean -u mini.lua ###
-- #######################################

local root = vim.fn.stdpath("run") .. "/nvim/diffview.nvim"
local plugin_dir = root .. "/plugins"
vim.fn.mkdir(plugin_dir, "p")

for _, name in ipairs({ "config", "data", "state", "cache" }) do
  vim.env[("XDG_%s_HOME"):format(name:upper())] = root .. "/" .. name
end

local plugins = {
  { "nvim-web-devicons", url = "https://github.com/nvim-tree/nvim-web-devicons.git" },
  { "diffview.nvim", url = "https://github.com/sindrets/diffview.nvim.git" },
  -- ##################################################################
  -- ### ADD PLUGINS THAT ARE _NECESSARY_ FOR REPRODUCING THE ISSUE ###
  -- ##################################################################
}

for _, spec in ipairs(plugins) do
  local install_path = plugin_dir .. "/" .. spec[1]
  if vim.fn.isdirectory(install_path) ~= 1 then
    if spec.url then
      print(string.format("Installing '%s'...", spec[1]))
      vim.fn.system({ "git", "clone", "--depth=1", spec.url, install_path })
    end
  end
  vim.opt.runtimepath:append(spec.path or install_path)
end

require("diffview").setup({
  -- ##############################################################################
  -- ### ADD DIFFVIEW.NVIM CONFIG THAT IS _NECESSARY_ FOR REPRODUCING THE ISSUE ###
  -- ##############################################################################
})

vim.opt.termguicolors = true
vim.cmd("colorscheme " .. (vim.fn.has("nvim-0.8") == 1 and "habamax" or "slate"))

-- ############################################################################
-- ### ADD INIT.LUA SETTINGS THAT ARE _NECESSARY_ FOR REPRODUCING THE ISSUE ###
-- ############################################################################

print("Ready!")
@charbelnicolas charbelnicolas added the bug Something isn't working label Jun 7, 2024
@tmillr
Copy link

tmillr commented Jun 24, 2024

I could be wrong, but based on some debugging I did some time ago, I think this is just how neovim operates when you open a new tab (i.e. it more or less functions similarly to :split, except instead of copying the current win to a new win it copies the current tab to a new tab). Only after that (and after a redraw cycle apparently) does it change the windows of the new tab. So idk if there's a workaround or not (you'd probably need a way to open a new tab and configure it without entering it yet) and this is ultimately an issue with neovim (unless this plugin is the one forcing the aforementioned redraw).

@charbelnicolas
Copy link
Contributor Author

I could be wrong, but based on some debugging I did some time ago, I think this is just how neovim operates when you open a new tab (i.e. it more or less functions similarly to :split, except instead of copying the current win to a new win it copies the current tab to a new tab). Only after that (and after a redraw cycle apparently) does it change the windows of the new tab. So idk if there's a workaround or not (you'd probably need a way to open a new tab and configure it without entering it yet) and this is ultimately an issue with neovim (unless this plugin is the one forcing the aforementioned redraw).

It could be... but how come the very first time it opens it does so cleanly without flashing anything?

@tmillr
Copy link

tmillr commented Jun 24, 2024

On my end it does the same thing the first time (or maybe not, maybe I just have bad eyes lol). But you're right, doing A and B with tabnew existingfile, it seems that that doesn't have the flashing issue.

Maybe it's just from setting up the multiple windows after tabnew? Or maybe the plugin is simply forcing a :redraw (or, vim.schedule(), async func) somewhere upon loading a new tab (and then updating the view after), that can create flashes.

There's actually a vim option to slow down redrawing I believe (for debugging). That might help give some answers/insight into what is going on to cause the flashes. Check out 'redrawdebug' or 'lazyredraw'.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something isn't working
Projects
None yet
Development

No branches or pull requests

2 participants