Bump :tools lsp debugger

emacs-lsp/dap-mode@8c59b0a -> emacs-lsp/dap-mode@85a6163
emacs-lsp/lsp-mode@0131f1f -> emacs-lsp/lsp-mode@edb8119
realgud/realgud@de31e77 -> realgud/realgud@5b0ed08
tumashu/posframe@b3028b0 -> tumashu/posframe@6d604a7

Also refactors the :tools lsp module. Recent changes upstream have made
a few of our hacks unnecessary (or easier to pull off without advice).

Upstream has also introduced optimizations!
This commit is contained in:
Henrik Lissner 2020-08-06 17:40:06 -04:00
parent 1bc770e89b
commit 3f5cc4c630
No known key found for this signature in database
GPG key ID: 5F6C0EA160557395
3 changed files with 71 additions and 107 deletions

View file

@ -1,10 +1,10 @@
;; -*- no-byte-compile: t; -*- ;; -*- no-byte-compile: t; -*-
;;; tools/debugger/packages.el ;;; tools/debugger/packages.el
(when (package! realgud :pin "de31e772092bf40cdc7de4ab3c63efe04f8e6736") (when (package! realgud :pin "5b0ed08364b1f5e2df2f3f7d5a6e7a2fedb5189a")
(when (featurep! :lang javascript) (when (featurep! :lang javascript)
(package! realgud-trepan-ni :pin "6e38cf838c7b47b5f1353d00901b939ffa36d707"))) (package! realgud-trepan-ni :pin "6e38cf838c7b47b5f1353d00901b939ffa36d707")))
(when (featurep! +lsp) (when (featurep! +lsp)
(package! dap-mode :pin "8c59b0a4dd0372c0b4efc74d021443894a9bd470") (package! dap-mode :pin "85a61630499bb836bdb378fb62ea4ddd4f61a2dd")
(package! posframe :pin "b3028b01a96699b1dfc9b2b5f4e3ba2bc1aa8317")) (package! posframe :pin "6d604a71deb45295f7b6ff3f98e06aeece9888be"))

View file

@ -12,36 +12,44 @@ Can be a list of backends; accepts any value `company-backends' accepts.")
:commands lsp-install-server :commands lsp-install-server
:init :init
(setq lsp-session-file (concat doom-etc-dir "lsp-session")) (setq lsp-session-file (concat doom-etc-dir "lsp-session"))
;; Auto-kill LSP server after last workspace buffer is killed.
(setq lsp-keep-workspace-alive nil)
;; For `lsp-clients' ;; For `lsp-clients'
(setq lsp-server-install-dir (concat doom-etc-dir "lsp/") (setq lsp-server-install-dir (concat doom-etc-dir "lsp/"))
lsp-intelephense-storage-path (concat doom-cache-dir "lsp-intelephense/")) ;; Don't auto-kill LSP server after last workspace buffer is killed, because I
;; will do it for you, after `+lsp-defer-shutdown' seconds.
(setq lsp-keep-workspace-alive nil)
;; Let doom bind the lsp keymap.
(when (featurep! :config default +bindings) (when (featurep! :config default +bindings)
;; Let doom bind the lsp keymap.
(setq lsp-keymap-prefix nil)) (setq lsp-keymap-prefix nil))
;; Disable LSP's superfluous, expensive and/or debatably unnecessary features. ;; NOTE I tweak LSP's defaults in order to make its more expensive or imposing
;; Some servers implement these poorly. Better to just rely on Emacs' native ;; features opt-in. Some servers implement these poorly and, in most
;; mechanisms and make these opt-in. ;; cases, it's safer to rely on Emacs' native mechanisms (eldoc vs
(setq lsp-enable-folding nil ;; lsp-ui-doc, open in popup vs sideline, etc).
;; Disable features that have great potential to be slow.
(setq lsp-enable-file-watchers nil
lsp-enable-folding nil
;; HACK Fix #2911, until it is resolved upstream. Links come in ;; HACK Fix #2911, until it is resolved upstream. Links come in
;; asynchronously from the server, but lsp makes no effort to ;; asynchronously from the server, but lsp makes no effort to
;; "select" the original buffer before laying them down, so they ;; "select" the original buffer before laying them down, so they
;; could be rendered in the wrong buffer (like the minibuffer). ;; could be rendered in the wrong buffer (like the minibuffer).
lsp-enable-links nil lsp-enable-links t
;; Potentially slow lsp-enable-text-document-color nil)
lsp-enable-file-watchers nil
lsp-enable-text-document-color nil ;; Disable features that modify our code without our permission.
lsp-enable-semantic-highlighting nil (setq lsp-enable-indentation nil
;; Don't modify our code without our permission lsp-enable-on-type-formatting nil)
lsp-enable-indentation nil
lsp-enable-on-type-formatting nil
;; capf is the preferred completion mechanism for lsp-mode now
lsp-prefer-capf t)
:config :config
(setq lsp-intelephense-storage-path (concat doom-cache-dir "lsp-intelephense/")
lsp-vetur-global-snippets-dir (expand-file-name "vetur"
(or (bound-and-true-p +snippets-dir)
(concat doom-private-dir "snippets/")))
lsp-clients-emmy-lua-jar-path (concat lsp-server-install-dir "EmmyLua-LS-all.jar")
lsp-xml-jar-file (concat lsp-server-install-dir "org.eclipse.lsp4xml-0.3.0-uber.jar")
lsp-groovy-server-file (concat lsp-server-install-dir "groovy-language-server-all.jar"))
(set-popup-rule! "^\\*lsp-help" :size 0.35 :quit t :select t) (set-popup-rule! "^\\*lsp-help" :size 0.35 :quit t :select t)
(set-lookup-handlers! 'lsp-mode :async t (set-lookup-handlers! 'lsp-mode :async t
:documentation #'lsp-describe-thing-at-point :documentation #'lsp-describe-thing-at-point
@ -50,97 +58,56 @@ Can be a list of backends; accepts any value `company-backends' accepts.")
:type-definition #'lsp-find-type-definition :type-definition #'lsp-find-type-definition
:references #'lsp-find-references) :references #'lsp-find-references)
;; TODO Lazy load these. They don't need to be loaded all at once unless the ;; REVIEW The '<leader> c l' prefix is hardcoded here, unfortunately.
;; user uses `lsp-install-server'.
(when lsp-auto-configure
(mapc (lambda (package) (require package nil t))
lsp-client-packages))
(defadvice! +lsp-init-a (&optional arg)
"Enable `lsp-mode' in the current buffer.
Meant to gimp `lsp', which is too eager about installing LSP servers, or
prompting to do so, or complaining about no LSP servers, or initializing
lsp-ui-mode, company, yasnippet and flycheck. We want LSP to work only if the
server is present, and for server installation to be a deliberate act by the
end-user. Also, setting up these other packages are handled by their respective
modules.
Also see:
+ `+lsp-init-company-h' (on `lsp-mode-hook')
+ `+lsp-init-flycheck-or-flymake-h' (on `lsp-mode-hook')
This also logs the resolved project root, if found, so we know where we are."
:override #'lsp
(interactive "P")
(and (buffer-file-name (buffer-base-buffer))
(require 'lsp-mode nil t)
(setq-local
lsp--buffer-workspaces
(or (lsp--try-open-in-library-workspace)
(lsp--try-project-root-workspaces
(equal arg '(4))
(and arg (not (equal arg 1))))))
;; read-process-output-max is only available on recent
;; development builds of Emacs 27 and above
(or (not (boundp 'read-process-output-max))
(setq-local read-process-output-max (* 1024 1024)))
;; REVIEW LSP causes a lot of allocations, with or without Emacs 27+'s
;; native JSON library, so we up the GC threshold to stave off
;; GC-induced slowdowns/freezes.
(setq-local gcmh-high-cons-threshold (* 2 gcmh-high-cons-threshold))
(prog1 (lsp-mode 1)
(setq lsp-buffer-uri (lsp--buffer-uri))
;; Announce what project root we're using, for diagnostic purposes
(if-let (root (lsp--calculate-root (lsp-session) (buffer-file-name)))
(lsp--info "Guessed project root is %s" (abbreviate-file-name root))
(lsp--info "Could not guess project root."))
(lsp--info "Connected to %s."
(apply #'concat
(mapcar
(lambda (it) (format "[%s]" (lsp--workspace-print it)))
lsp--buffer-workspaces))))))
(when (featurep! :config default +bindings) (when (featurep! :config default +bindings)
(dolist (leader-key (list doom-leader-key doom-leader-alt-key)) (dolist (leader-key (list doom-leader-key doom-leader-alt-key))
(let ((lsp-keymap-prefix (concat leader-key " c l"))) (let ((lsp-keymap-prefix (concat leader-key " c l")))
(lsp-enable-which-key-integration)))) (lsp-enable-which-key-integration))))
(defadvice! +lsp--dont-auto-install-servers-a (orig-fn &rest args)
"Don't auto-install LSP servers. Only complain if there aren't available."
:around #'lsp
;; `lsp' is normally eager to automatically install LSP servers, or
;; prompting to do so, but (in my opinion) server installation should be a
;; deliberate act by the end-user:
(letf! (defun lsp--client-download-server-fn (&rest _))
(apply orig-fn args)))
(add-hook! 'lsp-mode-hook (add-hook! 'lsp-mode-hook
(defun +lsp-init-company-h () (defun +lsp-init-optimizations-h ()
(if (not (bound-and-true-p company-mode)) "Increase `read-process-output-max' and `gcmh-high-cons-threshold'."
(add-hook 'company-mode-hook #'+lsp-init-company-h t t) ;; `read-process-output-max' is only available on recent development
;; Ensure `company-capf' is at the front of `company-backends' ;; builds of Emacs 27 and above.
(setq-local company-backends (unless (boundp 'read-process-output-max)
(cons +lsp-company-backends (setq-local read-process-output-max (* 1024 1024)))
(remove +lsp-company-backends ;; REVIEW LSP causes a lot of allocations, with or without Emacs 27+'s
(remq 'company-capf company-backends)))) ;; native JSON library, so we up the GC threshold to stave off
(remove-hook 'company-mode-hook #'+lsp-init-company-h t))) ;; GC-induced slowdowns/freezes. Doom uses `gcmh' to enforce its GC
(defun +lsp-init-flycheck-or-flymake-h () ;; strategy, so we modify its variables rather than
"Set up flycheck-mode or flymake-mode, depending on `lsp-diagnostic-package'." ;; `gc-cons-threshold' directly.
(pcase lsp-diagnostic-package (setq-local gcmh-high-cons-threshold (* 2 (default-value 'gcmh-high-cons-threshold))))
((or :auto 'nil) ; try flycheck, fall back to flymake (defun +lsp-display-guessed-project-root-h ()
(let ((lsp-diagnostic-package "Log what LSP things is the root of the current project."
(if (require 'flycheck nil t) :flycheck :flymake))) ;; Makes it easier to detect root resolution issues.
(+lsp-init-flycheck-or-flymake-h))) (when-let (path (buffer-file-name (buffer-base-buffer)))
((or :flymake 't) (if-let (root (lsp--calculate-root (lsp-session) path))
(lsp--flymake-setup)) (lsp--info "Guessed project root is %s" (abbreviate-file-name root))
(:flycheck (lsp--info "Could not guess project root.")))))
;; Ensure file/dir local `flycheck-checker' is respected
(unless flycheck-checker (add-hook! 'lsp-completion-mode-hook
(if (flycheck-checker-supports-major-mode-p 'lsp major-mode) (defun +lsp-init-company-backends-h ()
(lsp-flycheck-enable) (when lsp-completion-mode
(let ((old-checker (flycheck-get-checker-for-buffer))) (set (make-local-variable 'company-backends)
(lsp-flycheck-enable) (cons +lsp-company-backends
(when old-checker (remove +lsp-company-backends
(flycheck-add-next-checker 'lsp old-checker)))) (remq 'company-capf company-backends)))))))
(kill-local-variable 'flycheck-checker))))))
(defvar +lsp--deferred-shutdown-timer nil) (defvar +lsp--deferred-shutdown-timer nil)
(defadvice! +lsp-defer-server-shutdown-a (orig-fn &optional restart) (defadvice! +lsp-defer-server-shutdown-a (orig-fn &optional restart)
"Defer server shutdown for a few seconds. "Defer server shutdown for a few seconds.
This gives the user a chance to open other project files before the server is This gives the user a chance to open other project files before the server is
auto-killed (which is a potentially expensive process)." auto-killed (which is a potentially expensive process). It also prevents the
server getting expensively restarted when reverting buffers."
:around #'lsp--shutdown-workspace :around #'lsp--shutdown-workspace
(if (or lsp-keep-workspace-alive (if (or lsp-keep-workspace-alive
restart restart
@ -156,10 +123,7 @@ auto-killed (which is a potentially expensive process)."
(let ((lsp--cur-workspace workspace)) (let ((lsp--cur-workspace workspace))
(unless (lsp--workspace-buffers lsp--cur-workspace) (unless (lsp--workspace-buffers lsp--cur-workspace)
(funcall orig-fn)))) (funcall orig-fn))))
lsp--cur-workspace)))) lsp--cur-workspace)))))
;; Don't prompt to restart LSP servers while quitting Emacs
(add-hook! 'kill-emacs-hook (setq lsp-restart 'ignore)))
(use-package! lsp-ui (use-package! lsp-ui

View file

@ -5,7 +5,7 @@
(progn (progn
(package! eglot :pin "fb6b17e86eddc22b9ec81f52718fad6bcbb53668") (package! eglot :pin "fb6b17e86eddc22b9ec81f52718fad6bcbb53668")
(package! project :pin "da0333a697b18f0a863c1b1523d2fc7991b31174")) (package! project :pin "da0333a697b18f0a863c1b1523d2fc7991b31174"))
(package! lsp-mode :pin "0131f1f4c9e7823955c3b1f80881fcd7c2eaa551") (package! lsp-mode :pin "edb81194f0974643861a24d1bbc386dd53554748")
(package! lsp-ui :pin "1f3e9700395f4fae024ca45ca64c8d70e99b39d2") (package! lsp-ui :pin "1f3e9700395f4fae024ca45ca64c8d70e99b39d2")
(when (featurep! :completion ivy) (when (featurep! :completion ivy)
(package! lsp-ivy :pin "4cdb739fc2bc47f7d4dcad824f9240c70c4cb37d")) (package! lsp-ivy :pin "4cdb739fc2bc47f7d4dcad824f9240c70c4cb37d"))