Skip to content

Commit d8511e7

Browse files
SDGLBL李杰
andauthored
fix(finder): defer BufEnter cleanup (#1564)
Co-authored-by: 李杰 <lijie.20@bytedance.com>
1 parent e6c04f8 commit d8511e7

2 files changed

Lines changed: 69 additions & 4 deletions

File tree

lua/lspsaga/finder/init.lua

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -196,15 +196,23 @@ function fd:handler(method, results, spin_close, done)
196196
box.indent(ns, self.lbufnr, self.lwinid)
197197
api.nvim_create_autocmd('BufEnter', {
198198
callback = function(args)
199-
if args.buf ~= self.lbufnr or args.buf ~= self.rbufnr then
200-
self:clean()
201-
api.nvim_del_autocmd(args.id)
202-
end
199+
self:close_on_bufenter(args)
203200
end,
204201
})
205202
end
206203
end
207204

205+
function fd:close_on_bufenter(args)
206+
if args.buf == self.lbufnr or args.buf == self.rbufnr then
207+
return
208+
end
209+
210+
api.nvim_del_autocmd(args.id)
211+
vim.schedule(function()
212+
self:clean()
213+
end)
214+
end
215+
208216
function fd:event()
209217
api.nvim_create_autocmd('CursorMoved', {
210218
buffer = self.lbufnr,

test/finder_spec.lua

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
require('lspsaga').setup({})
2+
3+
local finder = require('lspsaga.finder')
4+
5+
describe('finder module', function()
6+
local lbufnr
7+
local rbufnr
8+
local autocmd
9+
10+
before_each(function()
11+
lbufnr = vim.api.nvim_create_buf(false, true)
12+
rbufnr = vim.api.nvim_create_buf(false, true)
13+
finder.lbufnr = lbufnr
14+
finder.rbufnr = rbufnr
15+
finder.cleaned = false
16+
finder.clean = function(self)
17+
self.cleaned = true
18+
end
19+
autocmd = vim.api.nvim_create_autocmd('BufEnter', {
20+
callback = function() end,
21+
})
22+
end)
23+
24+
after_each(function()
25+
pcall(vim.api.nvim_del_autocmd, autocmd)
26+
for _, bufnr in ipairs({ lbufnr, rbufnr }) do
27+
if vim.api.nvim_buf_is_valid(bufnr) then
28+
vim.api.nvim_buf_delete(bufnr, { force = true })
29+
end
30+
end
31+
finder.lbufnr = nil
32+
finder.rbufnr = nil
33+
finder.cleaned = nil
34+
finder.clean = nil
35+
end)
36+
37+
it('keeps the finder open when entering finder buffers', function()
38+
finder:close_on_bufenter({ buf = lbufnr, id = autocmd })
39+
40+
assert.is_false(finder.cleaned)
41+
assert.is_equal(1, #vim.api.nvim_get_autocmds({ id = autocmd }))
42+
end)
43+
44+
it('schedules cleanup after entering another buffer', function()
45+
local other = vim.api.nvim_create_buf(false, true)
46+
47+
finder:close_on_bufenter({ buf = other, id = autocmd })
48+
49+
assert.is_equal(0, #vim.api.nvim_get_autocmds({ id = autocmd }))
50+
vim.wait(100, function()
51+
return finder.cleaned
52+
end)
53+
assert.is_true(finder.cleaned)
54+
55+
vim.api.nvim_buf_delete(other, { force = true })
56+
end)
57+
end)

0 commit comments

Comments
 (0)