Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: save unused buffers in buffer pool #536

Merged
merged 4 commits into from
Dec 6, 2024
Merged
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
62 changes: 39 additions & 23 deletions lua/treesitter-context/render.lua
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,11 @@ local config = require('treesitter-context.config')

local ns = api.nvim_create_namespace('nvim-treesitter-context')

--- List of buffers that are to be deleted.
--- List of free buffers that can be reused.
---@type integer[]
local retired_buffers = {}
local buffers_pool = {}

local BUFFER_POOL_SIZE = 20

--- @class WindowContext
--- @field context_winid integer? The context window ID.
Expand All @@ -20,15 +22,43 @@ local retired_buffers = {}
local window_contexts = {}

--- @return integer buf
local function create_buf()
local function create_or_get_buf()
for index=#buffers_pool, 1, -1 do
apollo1321 marked this conversation as resolved.
Show resolved Hide resolved
local buf = buffers_pool[index]
if api.nvim_buf_is_valid(buf) then
table.remove(buffers_pool, index)
apollo1321 marked this conversation as resolved.
Show resolved Hide resolved
return buf
end
end

local buf = api.nvim_create_buf(false, true)

vim.bo[buf].undolevels = -1
vim.bo[buf].bufhidden = 'wipe'
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This option deletes the buffer after the window is closed. It appears that the problem existed before multi-window support was introduced.


return buf
end

local function delete_excess_buffers()
if fn.getcmdwintype() ~= '' then
-- Can't delete buffers when the command-line window is open.
return
end

local new_buffers_pool = {} --- @type integer[]

for _, bufnr in ipairs(buffers_pool) do
if api.nvim_buf_is_valid(bufnr) then
if #new_buffers_pool < BUFFER_POOL_SIZE then
table.insert(new_buffers_pool, bufnr)
else
api.nvim_buf_delete(bufnr, { force = true })
lewis6991 marked this conversation as resolved.
Show resolved Hide resolved
end
end
end

buffers_pool = new_buffers_pool
end

--- @param winid integer
--- @param context_winid integer?
--- @param width integer
Expand All @@ -40,7 +70,7 @@ end
local function display_window(winid, context_winid, width, height, col, ty, hl)
if not context_winid then
local sep = config.separator and { config.separator, 'TreesitterContextSeparator' } or nil
context_winid = api.nvim_open_win(create_buf(), false, {
context_winid = api.nvim_open_win(create_or_get_buf(), false, {
win = winid,
relative = 'win',
width = width,
Expand Down Expand Up @@ -305,25 +335,11 @@ local function close(context_winid)
end

local bufnr = api.nvim_win_get_buf(context_winid)
if bufnr ~= nil then
table.insert(retired_buffers, bufnr)
end
if api.nvim_win_is_valid(context_winid) then
api.nvim_win_close(context_winid, true)
end

if fn.getcmdwintype() ~= '' then
-- Can't delete buffers when the command-line window is open.
return
end

-- Delete retired buffers.
for _, retired_bufnr in ipairs(retired_buffers) do
if api.nvim_buf_is_valid(retired_bufnr) then
api.nvim_buf_delete(retired_bufnr, { force = true })
end
api.nvim_win_close(context_winid, true)
if bufnr ~= nil and api.nvim_buf_is_valid(bufnr) then
table.insert(buffers_pool, bufnr)
end
retired_buffers = {}
delete_excess_buffers()
end)
end

Expand Down
Loading