diff options
author | Luuk van Baal <luukvbaal@gmail.com> | 2025-02-16 00:07:08 +0100 |
---|---|---|
committer | Christian Clason <ch.clason+github@icloud.com> | 2025-02-19 19:11:55 +0100 |
commit | bc1018a8d3eeeade9b3fad147a9d9a819985d69d (patch) | |
tree | f6914bad1ab76bfeacfdc7f2b597658cfd3b2d84 /runtime/lua/vim/treesitter/_fold.lua | |
parent | a0b52e7cb3d211e30c21464c4a4f4acecd6418c9 (diff) | |
download | rneovim-bc1018a8d3eeeade9b3fad147a9d9a819985d69d.tar.gz rneovim-bc1018a8d3eeeade9b3fad147a9d9a819985d69d.tar.bz2 rneovim-bc1018a8d3eeeade9b3fad147a9d9a819985d69d.zip |
fix(treesitter): avoid computing fold levels for empty buffer
Problem: Computing fold levels for an empty buffer (somehow) breaks the
parser state, resulting in a broken highlighter and foldexpr.
Cached foldexpr parser is invalid after filetype has changed.
Solution: Avoid computing fold levels for empty buffer.
Clear cached foldinfos upon `FileType`.
Diffstat (limited to 'runtime/lua/vim/treesitter/_fold.lua')
-rw-r--r-- | runtime/lua/vim/treesitter/_fold.lua | 12 |
1 files changed, 10 insertions, 2 deletions
diff --git a/runtime/lua/vim/treesitter/_fold.lua b/runtime/lua/vim/treesitter/_fold.lua index 38318347a7..1064004320 100644 --- a/runtime/lua/vim/treesitter/_fold.lua +++ b/runtime/lua/vim/treesitter/_fold.lua @@ -75,7 +75,15 @@ local function compute_folds_levels(bufnr, info, srow, erow, callback) erow = erow or api.nvim_buf_line_count(bufnr) local parser = info.parser - if not parser then + if + not parser + -- Parsing an empty buffer results in problems with the parsing state, + -- resulting in both a broken highlighter and foldexpr. + or api.nvim_buf_line_count(bufnr) == 1 + and api.nvim_buf_call(bufnr, function() + return vim.fn.line2byte(1) <= 0 + end) + then return end @@ -380,7 +388,7 @@ function M.foldexpr(lnum) if not foldinfos[bufnr] then foldinfos[bufnr] = FoldInfo.new(bufnr) - api.nvim_create_autocmd({ 'BufUnload', 'VimEnter' }, { + api.nvim_create_autocmd({ 'BufUnload', 'VimEnter', 'FileType' }, { buffer = bufnr, once = true, callback = function() |