diff --git a/lua/neo-tree/sources/common/preview.lua b/lua/neo-tree/sources/common/preview.lua index 51c067a06..5c9b7e8f4 100644 --- a/lua/neo-tree/sources/common/preview.lua +++ b/lua/neo-tree/sources/common/preview.lua @@ -119,7 +119,6 @@ function Preview:preview(bufnr, start_pos, end_pos) return end - bufnr = bufnr or self.bufnr if not self.active then self:activate() end @@ -148,6 +147,7 @@ function Preview:revert() end if self.config.use_float then + vim.bo[self.bufnr].bufhidden = "wipe" vim.api.nvim_win_close(self.winid, true) self.winid = nil return @@ -248,6 +248,7 @@ function Preview:activate() end if self.config.use_float then self.bufnr = vim.api.nvim_create_buf(false, true) + vim.api.nvim_buf_set_name(self.bufnr, "neo-tree floating preview buffer") self.truth = {} else self.truth = { @@ -297,22 +298,60 @@ local function try_load_image_nvim_buf(winid, bufnr) return true end ----@param bufnr number The buffer number of the buffer to set. ----@return number bytecount The number of bytes in the buffer -local get_bufsize = function(bufnr) - return vim.api.nvim_buf_call(bufnr, function() - return vim.fn.line2byte(vim.fn.line("$") + 1) - end) +-- ---@param bufnr number The buffer number of the buffer to set. +-- ---@return number bytecount The number of bytes in the buffer +-- local get_bufsize = function(bufnr) +-- return vim.api.nvim_buf_call(bufnr, function() +-- return vim.fn.line2byte(vim.fn.line("$") + 1) +-- end) +-- end +---@return boolean ok +local function load_buftext_into_floating_preview(bufnr, preview) + local path = vim.api.nvim_buf_get_name(bufnr) + local ok, lines + if vim.api.nvim_buf_is_loaded(bufnr) and not vim.bo[bufnr].modified then + lines = vim.api.nvim_buf_get_lines(bufnr, 0, -1, false) + ok = true + else + ok, lines = pcall(vim.fn.readfile, path, "") + end + if not ok then + return false + end + vim.api.nvim_buf_set_lines(preview.bufnr, 0, -1, false, lines) + vim.api.nvim_win_set_buf(preview.winid, preview.bufnr) + -- I'm not sure why float windows won't show numbers without this + vim.wo[preview.winid].number = true + + -- code below is from mini.pick + -- only starts treesitter parser if the filetype is matching + local ft = vim.filetype.match({ buf = bufnr }) + local has_lang, lang = pcall(vim.treesitter.language.get_lang, ft) + lang = has_lang and lang or ft + local has_parser, parser = + pcall(vim.treesitter.get_parser, preview.bufnr, lang, { error = false }) + has_parser = has_parser and parser ~= nil + if has_parser then + has_parser = pcall(vim.treesitter.start, preview.bufnr, lang) + end + if not has_parser then + vim.treesitter.stop(preview.bufnr) + vim.bo[preview.bufnr].syntax = ft or "OFF" + end + return true end ---Set the buffer in the preview window without executing BufEnter or BufWinEnter autocommands. ----@param bufnr number The buffer number of the buffer to set. +---@param bufnr number? The buffer number of the buffer to set. function Preview:setBuffer(bufnr) self:clearHighlight() - if bufnr == self.bufnr then + if not bufnr or bufnr == self.bufnr then return end local eventignore = vim.opt.eventignore + local cleanup = function() + vim.opt.eventignore = eventignore + end vim.opt.eventignore:append("BufEnter,BufWinEnter") if self.config.use_image_nvim and try_load_image_nvim_buf(self.winid, bufnr) then @@ -320,42 +359,20 @@ function Preview:setBuffer(bufnr) -- really long anyways vim.api.nvim_win_set_buf(self.winid, bufnr) try_load_image_nvim_buf(self.winid, bufnr) - goto finally + cleanup() + return end if self.config.use_float then -- Workaround until https://github.com/neovim/neovim/issues/24973 is resolved or maybe 'previewpopup' comes in? - vim.fn.bufload(bufnr) - local lines = vim.api.nvim_buf_get_lines(bufnr, 0, -1, false) - vim.api.nvim_buf_set_lines(self.bufnr, 0, -1, false, lines) - vim.api.nvim_win_set_buf(self.winid, self.bufnr) - -- I'm not sure why float windows won't show numbers without this - vim.wo[self.winid].number = true - - -- code below is from mini.pick - -- only starts treesitter parser if the filetype is matching - local ft = vim.bo[bufnr].filetype - local bufsize = get_bufsize(bufnr) - if bufsize > 1024 * 1024 or bufsize > 1000 * #lines then - goto finally - end - local has_lang, lang = pcall(vim.treesitter.language.get_lang, ft) - lang = has_lang and lang or ft - local has_parser, parser = pcall(vim.treesitter.get_parser, self.bufnr, lang, { error = false }) - has_parser = has_parser and parser ~= nil - if has_parser then - has_parser = pcall(vim.treesitter.start, self.bufnr, lang) - end - if not has_parser then - vim.bo[self.bufnr].syntax = ft - end + -- vim.fn.bufload(bufnr) + load_buftext_into_floating_preview(bufnr, self) else vim.api.nvim_win_set_buf(self.winid, bufnr) self.bufnr = bufnr end - ::finally:: - vim.opt.eventignore = eventignore + cleanup() end ---Move the cursor to the previewed position and center the screen.