diff options
-rw-r--r-- | runtime/doc/news.txt | 1 | ||||
-rw-r--r-- | runtime/lua/vim/treesitter.lua | 13 |
2 files changed, 12 insertions, 2 deletions
diff --git a/runtime/doc/news.txt b/runtime/doc/news.txt index 226c927d87..da672f449c 100644 --- a/runtime/doc/news.txt +++ b/runtime/doc/news.txt @@ -175,6 +175,7 @@ TREESITTER the tree before returning. Scripts must call |LanguageTree:parse()| explicitly. >lua local p = vim.treesitter.get_parser(0, 'c') p:parse() +• |vim.treesitter.get_parser()| expects its buffer to be loaded. < TUI diff --git a/runtime/lua/vim/treesitter.lua b/runtime/lua/vim/treesitter.lua index 10638e10d8..44372415fd 100644 --- a/runtime/lua/vim/treesitter.lua +++ b/runtime/lua/vim/treesitter.lua @@ -34,8 +34,6 @@ M.minimum_language_version = vim._ts_get_minimum_language_version() function M._create_parser(bufnr, lang, opts) bufnr = vim._resolve_bufnr(bufnr) - vim.fn.bufload(bufnr) - local self = LanguageTree.new(bufnr, lang, opts) local function bytes_cb(_, ...) @@ -102,6 +100,9 @@ function M.get_parser(bufnr, lang, opts) return nil, err_msg end elseif parsers[bufnr] == nil or parsers[bufnr]:lang() ~= lang then + if not api.nvim_buf_is_loaded(bufnr) then + error(('Buffer %s must be loaded to create parser'):format(bufnr)) + end local parser = vim.F.npcall(M._create_parser, bufnr, lang, opts) if not parser then local err_msg = @@ -415,6 +416,14 @@ end ---@param lang string? Language of the parser (default: from buffer filetype) function M.start(bufnr, lang) bufnr = vim._resolve_bufnr(bufnr) + -- Ensure buffer is loaded. `:edit` over `bufload()` to show swapfile prompt. + if not api.nvim_buf_is_loaded(bufnr) then + if api.nvim_buf_get_name(bufnr) ~= '' then + pcall(api.nvim_buf_call, bufnr, vim.cmd.edit) + else + vim.fn.bufload(bufnr) + end + end local parser = assert(M.get_parser(bufnr, lang, { error = false })) M.highlighter.new(parser) end |