From 06c69467421fbccd5f904c5ffa232a5af93e8ca6 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Thu, 20 Aug 2020 22:00:53 -0400 Subject: [PATCH] tools/lsp: defer auto-shutdown of eglot server --- modules/tools/lsp/+eglot.el | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/modules/tools/lsp/+eglot.el b/modules/tools/lsp/+eglot.el index 469be56c0..778f96681 100644 --- a/modules/tools/lsp/+eglot.el +++ b/modules/tools/lsp/+eglot.el @@ -1,7 +1,6 @@ ;;; tools/lsp/+eglot.el -*- lexical-binding: t; -*- ;; TODO set eglot-events-buffer-size to nil in doom-debug-mode -;; TODO Implement `+lsp-defer-shutdown' (use-package! eglot :commands eglot eglot-ensure @@ -23,4 +22,22 @@ :documentation #'+eglot-lookup-documentation) (when (featurep! :checkers syntax) (after! flycheck - (load! "autoload/flycheck-eglot")))) + (load! "autoload/flycheck-eglot"))) + + (defadvice! +lsp--defer-server-shutdown-a (orig-fn &optional server) + "Defer server shutdown for a few seconds. +This gives the user a chance to open other project files before the server is +auto-killed (which is a potentially expensive process). It also prevents the +server getting expensively restarted when reverting buffers." + :around #'eglot--managed-mode + (letf! (defun eglot-shutdown (server) + (if (or (null +lsp-defer-shutdown) + (eq +lsp-defer-shutdown 0)) + (funcall eglot-shutdown server) + (run-at-time + (if (numberp +lsp-defer-shutdown) +lsp-defer-shutdown 3) + nil (lambda (server) + (unless (eglot--managed-buffers server) + (funcall eglot-shutdown server))) + server))) + (funcall orig-fn server))))