From 35f475d0a51aad03abfc005a0224d315c45ffd67 Mon Sep 17 00:00:00 2001 From: Jaehwang Jung Date: Tue, 17 Oct 2023 10:51:36 +0900 Subject: [PATCH] fix(diagnostics): if buffer not loaded, skip handlers that set extmark (#25628) Problem: When enabling diagnostics, there can be diagnostics for unloaded buffer, but some handlers nevertheless attempt to set extmarks in such buffers. Solution: * Exit underline/virtual_text handler if buffer is not loaded. * Don't require is_loaded as precondition for show(), because handlers don't necessarily depend on it. --- runtime/lua/vim/diagnostic.lua | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/runtime/lua/vim/diagnostic.lua b/runtime/lua/vim/diagnostic.lua index b8d3906b7f..9e9b09ed1d 100644 --- a/runtime/lua/vim/diagnostic.lua +++ b/runtime/lua/vim/diagnostic.lua @@ -652,16 +652,14 @@ function M.config(opts, namespace) if namespace then for bufnr, v in pairs(diagnostic_cache) do - if api.nvim_buf_is_loaded(bufnr) and v[namespace] then + if v[namespace] then M.show(namespace, bufnr) end end else for bufnr, v in pairs(diagnostic_cache) do - if api.nvim_buf_is_loaded(bufnr) then - for ns in pairs(v) do - M.show(ns, bufnr) - end + for ns in pairs(v) do + M.show(ns, bufnr) end end end @@ -693,9 +691,7 @@ function M.set(namespace, bufnr, diagnostics, opts) set_diagnostic_cache(namespace, bufnr, diagnostics) end - if api.nvim_buf_is_loaded(bufnr) then - M.show(namespace, bufnr, nil, opts) - end + M.show(namespace, bufnr, nil, opts) api.nvim_exec_autocmds('DiagnosticChanged', { modeline = false, @@ -928,6 +924,10 @@ M.handlers.underline = { bufnr = get_bufnr(bufnr) opts = opts or {} + if not vim.api.nvim_buf_is_loaded(bufnr) then + return + end + if opts.underline and opts.underline.severity then diagnostics = filter_by_severity(opts.underline.severity, diagnostics) end @@ -994,6 +994,10 @@ M.handlers.virtual_text = { bufnr = get_bufnr(bufnr) opts = opts or {} + if not vim.api.nvim_buf_is_loaded(bufnr) then + return + end + local severity if opts.virtual_text then if opts.virtual_text.format then