Skip to content

Commit

Permalink
feat(LspconfigServerLifeCycle): start/stop servers when gaining or lo…
Browse files Browse the repository at this point in the history
…sing focus

Start/stop servers when nvim session looses focus and restart them on demand.
This features is motivated by the fact that some servers may gain serious
memory footprint and may incur performance issues.
  • Loading branch information
hinell committed May 12, 2023
1 parent df58d91 commit 162e479
Showing 1 changed file with 51 additions and 0 deletions.
51 changes: 51 additions & 0 deletions plugin/lspconfig.lua
Original file line number Diff line number Diff line change
Expand Up @@ -150,3 +150,54 @@ api.nvim_create_user_command('LspLog', function()
end, {
desc = 'Opens the Nvim LSP client log.',
})

--- Start/stop servers when nvim session looses focus and restart them on demand.
-- This features is motivated by the fact that some servers may gain serious
-- memory footprint and may incur performance issues. Added on May 12, 2023
vim.api.nvim_create_augroup('LspconfigServerLifeCycle', { clear = true })
vim.api.nvim_create_autocmd({
'FocusGained',
}, {
pattern = '*',
group = 'LspconfigServerLifeCycle',
desc = 'Lspconfig: restart halted lsp servers for given',
callback = function()
if _G.nvimLspconfigTimer then
_G.nvimLspconfigTimer:stop()
_G.nvimLspconfigTimer:close()
_G.nvimLspconfigTimer = nil
end
if #vim.lsp.get_active_clients() <= 1 then
vim.cmd 'LspStart'
end
end,
})

vim.api.nvim_create_autocmd({
'FocusLost',
}, {
pattern = '*',
group = 'LspconfigServerLifeCycle',
desc = 'Lspconfig: halt lsp servers when focus is lost',
callback = function()
if not _G.nvimLspconfigTimer and #vim.lsp.get_active_clients() > 0 then
local timeout = 1000 * 60 * 5 -- 5 minutes
_G.nvimLspconfigTimer = vim.loop.new_timer()
_G.nvimLspconfigTimer:start(
timeout,
0,
vim.schedule_wrap(function()
local activeServers = #vim.lsp.get_active_clients()
vim.cmd 'LspStop'
vim.notify(
('[lspconfig]: nvim has lost focus, stop current language servers. Number of servers left: %s'):format(
activeServers
),
vim.log.levels.INFO
)
_G.nvimLspconfigTimer = nil
end)
)
end
end,
})

0 comments on commit 162e479

Please sign in to comment.