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 160712d
Showing 1 changed file with 52 additions and 1 deletion.
53 changes: 52 additions & 1 deletion plugin/lspconfig.lua
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@ end
-- Called from plugin/lspconfig.vim because it requires knowing that the last
-- script in scriptnames to be executed is lspconfig.
api.nvim_create_user_command('LspInfo', function()
require 'lspconfig.ui.lspinfo'()
require 'lspconfig.ui.lspinfo' ()
end, {
desc = 'Displays attached, active, and configured language servers',
})
Expand Down 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 160712d

Please sign in to comment.