Skip to content

Commit 7c00f6f

Browse files
gpandersdmitmel
authored andcommitted
fix(diagnostic): use nvim_exec_autocmds to trigger DiagnosticChanged (neovim#18188)
Use nvim_exec_autocmds to issue the DiagnosticChanged autocommand, rather than nvim_buf_call, which has some side effects when drawing statuslines.
1 parent 614a2c7 commit 7c00f6f

File tree

2 files changed

+21
-22
lines changed

2 files changed

+21
-22
lines changed

runtime/lua/vim/diagnostic.lua

Lines changed: 8 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -668,14 +668,10 @@ function M.set(namespace, bufnr, diagnostics, opts)
668668
M.show(namespace, bufnr, nil, opts)
669669
end
670670

671-
vim.api.nvim_buf_call(bufnr, function()
672-
vim.api.nvim_command(
673-
string.format(
674-
"doautocmd <nomodeline> DiagnosticChanged %s",
675-
vim.fn.fnameescape(vim.api.nvim_buf_get_name(bufnr))
676-
)
677-
)
678-
end)
671+
vim.api.nvim_exec_autocmds("DiagnosticChanged", {
672+
modeline = false,
673+
buffer = bufnr,
674+
})
679675
end
680676

681677
--- Get namespace metadata.
@@ -1382,14 +1378,10 @@ function M.reset(namespace, bufnr)
13821378
M.hide(iter_namespace, iter_bufnr)
13831379
end
13841380

1385-
vim.api.nvim_buf_call(iter_bufnr, function()
1386-
vim.api.nvim_command(
1387-
string.format(
1388-
"doautocmd <nomodeline> DiagnosticChanged %s",
1389-
vim.fn.fnameescape(vim.api.nvim_buf_get_name(iter_bufnr))
1390-
)
1391-
)
1392-
end)
1381+
vim.api.nvim_exec_autocmds("DiagnosticChanged", {
1382+
modeline = false,
1383+
buffer = iter_bufnr,
1384+
})
13931385
end
13941386
end
13951387

test/functional/lua/diagnostic_spec.lua

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1939,24 +1939,31 @@ describe('vim.diagnostic', function()
19391939
end)
19401940

19411941
it('triggers the autocommand when diagnostics are set', function()
1942-
eq(1, exec_lua [[
1942+
eq(true, exec_lua [[
1943+
-- Set a different buffer as current to test that <abuf> is being set properly in
1944+
-- DiagnosticChanged callbacks
1945+
local tmp = vim.api.nvim_create_buf(false, true)
1946+
vim.api.nvim_set_current_buf(tmp)
1947+
19431948
vim.g.diagnostic_autocmd_triggered = 0
1944-
vim.cmd('autocmd DiagnosticChanged * let g:diagnostic_autocmd_triggered = 1')
1949+
vim.cmd('autocmd DiagnosticChanged * let g:diagnostic_autocmd_triggered = +expand("<abuf>")')
19451950
vim.api.nvim_buf_set_name(diagnostic_bufnr, "test | test")
19461951
vim.diagnostic.set(diagnostic_ns, diagnostic_bufnr, {
19471952
make_error('Diagnostic', 0, 0, 0, 0)
19481953
})
1949-
return vim.g.diagnostic_autocmd_triggered
1954+
return vim.g.diagnostic_autocmd_triggered == diagnostic_bufnr
19501955
]])
19511956
end)
19521957

19531958
it('triggers the autocommand when diagnostics are cleared', function()
1954-
eq(1, exec_lua [[
1959+
eq(true, exec_lua [[
1960+
local tmp = vim.api.nvim_create_buf(false, true)
1961+
vim.api.nvim_set_current_buf(tmp)
19551962
vim.g.diagnostic_autocmd_triggered = 0
1956-
vim.cmd('autocmd DiagnosticChanged * let g:diagnostic_autocmd_triggered = 1')
1963+
vim.cmd('autocmd DiagnosticChanged * let g:diagnostic_autocmd_triggered = +expand("<abuf>")')
19571964
vim.api.nvim_buf_set_name(diagnostic_bufnr, "test | test")
19581965
vim.diagnostic.reset(diagnostic_ns, diagnostic_bufnr)
1959-
return vim.g.diagnostic_autocmd_triggered
1966+
return vim.g.diagnostic_autocmd_triggered == diagnostic_bufnr
19601967
]])
19611968
end)
19621969
end)

0 commit comments

Comments
 (0)