Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
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
16 changes: 12 additions & 4 deletions lua/lspsaga/finder/init.lua
Original file line number Diff line number Diff line change
Expand Up @@ -196,15 +196,23 @@ function fd:handler(method, results, spin_close, done)
box.indent(ns, self.lbufnr, self.lwinid)
api.nvim_create_autocmd('BufEnter', {
callback = function(args)
if args.buf ~= self.lbufnr or args.buf ~= self.rbufnr then
self:clean()
api.nvim_del_autocmd(args.id)
end
self:close_on_bufenter(args)
end,
})
end
end

function fd:close_on_bufenter(args)
if args.buf == self.lbufnr or args.buf == self.rbufnr then
return
end

api.nvim_del_autocmd(args.id)
vim.schedule(function()
self:clean()
end)
end

function fd:event()
api.nvim_create_autocmd('CursorMoved', {
buffer = self.lbufnr,
Expand Down
57 changes: 57 additions & 0 deletions test/finder_spec.lua
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
require('lspsaga').setup({})

local finder = require('lspsaga.finder')

describe('finder module', function()
local lbufnr
local rbufnr
local autocmd

before_each(function()
lbufnr = vim.api.nvim_create_buf(false, true)
rbufnr = vim.api.nvim_create_buf(false, true)
finder.lbufnr = lbufnr
finder.rbufnr = rbufnr
finder.cleaned = false
finder.clean = function(self)
self.cleaned = true
end
autocmd = vim.api.nvim_create_autocmd('BufEnter', {
callback = function() end,
})
end)

after_each(function()
pcall(vim.api.nvim_del_autocmd, autocmd)
for _, bufnr in ipairs({ lbufnr, rbufnr }) do
if vim.api.nvim_buf_is_valid(bufnr) then
vim.api.nvim_buf_delete(bufnr, { force = true })
end
end
finder.lbufnr = nil
finder.rbufnr = nil
finder.cleaned = nil
finder.clean = nil
end)

it('keeps the finder open when entering finder buffers', function()
finder:close_on_bufenter({ buf = lbufnr, id = autocmd })

assert.is_false(finder.cleaned)
assert.is_equal(1, #vim.api.nvim_get_autocmds({ id = autocmd }))
end)

it('schedules cleanup after entering another buffer', function()
local other = vim.api.nvim_create_buf(false, true)

finder:close_on_bufenter({ buf = other, id = autocmd })

assert.is_equal(0, #vim.api.nvim_get_autocmds({ id = autocmd }))
vim.wait(100, function()
return finder.cleaned
end)
assert.is_true(finder.cleaned)

vim.api.nvim_buf_delete(other, { force = true })
end)
end)