Skip to content

nvim-tree does not BufWinEnter when opening on VimEnter #2130

@Iron-E

Description

@Iron-E

Description

I am a maintainer for barbar.nvim, and we have a feature that allows users to adjust the offset of the tabline when a sidebar (such as nvim-tree) is open.

This works well most of the time, however, recently a user reported that this does not work when using the Open At Startup snippets from the wiki. Upon investigation, it appears that this is because nvim-tree does not emit a BufWinEnter event in this case. It is worth noting that when doing :NvimTreeToggle afterward, it does.

Neovim version

NVIM v0.9.0
Build type: Release
LuaJIT 2.1.0-beta3

Operating system and version

6.2.10-arch1-1

nvim-tree version

48d53a5

Minimal config

vim.api.nvim_create_autocmd(
  {'BufWinEnter', 'FileType', 'WinNew', 'WinResized', 'WinScrolled'},
  {callback = function(event) vim.print(event) end}
)

vim.opt.rtp:append(vim.fn.stdpath('data') .. '/lazy/nvim-tree.lua')
require'nvim-tree'.setup {}

-- auto open nvim-tree when open neovim
local function open_nvim_tree(data)
  -- buffer is a real file on the disk
  local real_file = vim.fn.filereadable(data.file) == 1

  -- buffer is a [No Name]
  local no_name = data.file == '' and vim.bo[data.buf].buftype == ''

  -- only files please
  if not real_file and not no_name then
    return
  end

  -- open the tree but dont focus it
  require('nvim-tree.api').tree.toggle({ focus = false })
end

vim.api.nvim_create_autocmd({'VimEnter'}, { callback = open_nvim_tree })

It also happens with tree.open

Steps to reproduce

  1. nvim --clean -u minimal.lua
  2. Observe that a BufWinEnter event is not printed on startup for the NvimTree buffer.

Expected behavior

It follows the event sequence that happens when executing :NvimTreeToggle after startup concludes:

{
  buf = 2,
  event = "FileType",
  file = "NvimTree_1",
  id = 14,
  match = "NvimTree"
}
{
  buf = 1,
  event = "WinNew",
  file = "",
  id = 14,
  match = ""
}
{
  buf = 2,
  event = "BufWinEnter",
  file = "/home/iron-e/NvimTree_1",
  id = 14,
  match = "/home/iron-e/NvimTree_1"
}

You can verify the above by using this snippet:

vim.opt.rtp:append(vim.fn.stdpath('data') .. '/lazy/nvim-tree.lua')
require'nvim-tree'.setup {}

-- start listening to autocmds AFTER vim enter; reduces noise
vim.api.nvim_create_autocmd('VimEnter', {callback = function()
  vim.api.nvim_create_autocmd(
    {'BufWinEnter', 'FileType', 'WinNew', 'WinResized', 'WinScrolled'},
    {callback = function(event) vim.print(event) end}
  )
end})

Then manually typing :NvimTreeToggle.

Actual behavior

{
  buf = 1,
  event = "BufWinEnter",
  file = "",
  id = 3,
  match = ""
}

{
  buf = 2,
  event = "FileType",
  file = "NvimTree_1",
  id = 3,
  match = "NvimTree"
}
-- no ButWinEnter for `buf = 2`

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions