From 6bb6b479332727852052baa6c1ea0801e776895e Mon Sep 17 00:00:00 2001 From: Olivia Kinnear Date: Wed, 18 Feb 2026 02:03:20 -0600 Subject: [PATCH] fix(lsp): wait to display exit message #37925 --- runtime/lua/vim/lsp.lua | 28 +++++++++++++++++++++------- 1 file changed, 21 insertions(+), 7 deletions(-) diff --git a/runtime/lua/vim/lsp.lua b/runtime/lua/vim/lsp.lua index 8b2d3dc0ad..08592aa0f1 100644 --- a/runtime/lua/vim/lsp.lua +++ b/runtime/lua/vim/lsp.lua @@ -1126,6 +1126,9 @@ function lsp.get_active_clients(filter) return lsp.get_clients(filter) end +-- Minimum time before warning about LSP exit_timeout on Nvim exit. +local min_warn_exit_timeout = 100 + api.nvim_create_autocmd('VimLeavePre', { desc = 'vim.lsp: exit handler', callback = function() @@ -1137,13 +1140,20 @@ api.nvim_create_autocmd('VimLeavePre', { max_timeout = math.max(max_timeout, tonumber(client.exit_timeout) or 0) client:stop(client.exit_timeout) end - if max_timeout > 10 then - api.nvim_echo({ - { - string.format('Waiting %ss for lsp exit (Press Ctrl-C to force exit)', max_timeout / 1e3), - 'WarningMsg', - }, - }, true, {}) + + local exit_warning_timer --- @type uv.uv_timer_t? + if max_timeout > min_warn_exit_timeout then + exit_warning_timer = vim.defer_fn(function() + api.nvim_echo({ + { + string.format( + 'Waiting %ss for LSP exit (Press Ctrl-C to force exit)', + max_timeout / 1e3 + ), + 'WarningMsg', + }, + }, true, {}) + end, min_warn_exit_timeout) end vim.wait(max_timeout, function() @@ -1151,6 +1161,10 @@ api.nvim_create_autocmd('VimLeavePre', { return client.rpc.is_closing() end) end) + + if exit_warning_timer and not exit_warning_timer:is_closing() then + exit_warning_timer:close() + end end, })