Giter Club home page Giter Club logo

Comments (1)

9ary avatar 9ary commented on July 21, 2024 1

Figured it out.

Call chain:



local context, context_lines = get_context(bufnr, winid)

return require('treesitter-context.context').get(bufnr, winid)

if not pcall(vim.treesitter.get_parser, bufnr) then

into neovim code:
https://github.com/neovim/neovim/blob/6c3f7e7e27a0ffcf6d58dc1f5ad2fce7e59a2d88/runtime/lua/vim/treesitter.lua#L108
https://github.com/neovim/neovim/blob/6c3f7e7e27a0ffcf6d58dc1f5ad2fce7e59a2d88/runtime/lua/vim/treesitter.lua#L39

Indeed, minimal repro with no plugins:

bufnr = vim.api.nvim_get_current_buf()
vim.fn.bufload(bufnr)
local group = vim.api.nvim_create_augroup('testgroup', {})
vim.api.nvim_create_autocmd({ 'BufNewFile', 'BufRead', 'BufFilePost' }, {
  group = group,
  callback = function(args)
    print("hello world")
  end,
})

The autocmd never fires, because it was registered after bufload() was called!

The reason why this doesn't happen with syntax off is because vim.treesitter.get_parser() can't figure out the file's language in that case, and errors out.

Solution:

diff --git a/lua/treesitter-context/context.lua b/lua/treesitter-context/context.lua
index 5339c80..aaf5ae6 100644
--- a/lua/treesitter-context/context.lua
+++ b/lua/treesitter-context/context.lua
@@ -253,6 +253,14 @@ end
 --- @param winid integer
 --- @return Range4[]?, string[]?
 function M.get(bufnr, winid)
+  -- vim.treesitter.get_parser() calls bufload(), but we don't actually want to load the buffer:
+  -- this method is called during plugin init, before other plugins or the user's config
+  -- have a chance to initialize.
+  -- They may want to register autocmds, and this would prevent them from firing.
+  if vim.fn.bufloaded(bufnr) == 0 then
+    return
+  end
+
   if not pcall(vim.treesitter.get_parser, bufnr) then
     return
   end

I'll open a PR.

Also, the reason why this regressed. This is what it looked like before:

function M.get(bufnr, winid)
local max_lines = calc_max_lines(winid)
if max_lines == 0 then
return
end
if not pcall(vim.treesitter.get_parser, bufnr) then
return
end

calc_max_lines() always returns 0 at startup since the cursor is at the top of the window. This accidentally guarded get_parser() from being called so early, but it was removed in that commit.

from nvim-treesitter-context.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.