From ada842259c7adba0cd7d153e03d6072115361dff Mon Sep 17 00:00:00 2001 From: Andrew Scott Date: Sat, 18 May 2024 13:02:27 -0400 Subject: [PATCH] Trying emacs-lsp-booster and eglot with zls --- dot_config/emacs/early-init.el.tmpl | 9 ++-- dot_config/emacs/init.el | 69 ++++++++++++++++++++++++++--- 2 files changed, 68 insertions(+), 10 deletions(-) diff --git a/dot_config/emacs/early-init.el.tmpl b/dot_config/emacs/early-init.el.tmpl index 4a575c5..8f9e730 100644 --- a/dot_config/emacs/early-init.el.tmpl +++ b/dot_config/emacs/early-init.el.tmpl @@ -43,9 +43,9 @@ ;; Move eln-cache to XDG_CACHE_HOME (when (fboundp 'startup-redirect-eln-cache) - (if (< emacs-major-version 29) - (push (expand-file-name "eln-cache/" xdg_cache_home) native-comp-eln-load-path) - (startup-redirect-eln-cache (expand-file-name "eln-cache/" xdg_cache_home)))) + (if (< emacs-major-version 29) + (push (expand-file-name "eln-cache/" xdg_cache_home) native-comp-eln-load-path) + (startup-redirect-eln-cache (expand-file-name "eln-cache/" xdg_cache_home)))) ;; Disable package.el (setq package-enable-at-startup nil) @@ -95,5 +95,8 @@ (push '(tool-bar-lines . 0) default-frame-alist) (push '(vertical-scroll-bars) default-frame-alist) +;; Make lsp-mode use plists +(setenv "LSP_USE_PLISTS" "true") + (provide 'early-init) ;;; early-init.el ends here diff --git a/dot_config/emacs/init.el b/dot_config/emacs/init.el index f7d260b..d622b90 100644 --- a/dot_config/emacs/init.el +++ b/dot_config/emacs/init.el @@ -166,15 +166,25 @@ (use-package display-fill-column-indicator :ensure nil + :init (setq-default fill-column 100) :hook ((conf-mode markdown-mode - prog-mode) . display-fill-column-indicator-mode) - :config (setq-default fill-column 100)) + prog-mode) . display-fill-column-indicator-mode)) (use-package display-line-numbers :ensure nil :hook ((conf-mode prog-mode) . display-line-numbers-mode)) +(use-package eglot + :ensure nil + :hook (zig-mode . eglot-ensure) + :bind (:map + eglot-mode-map + ("C-c c a" . eglot-code-actions) + ("C-c c o" . eglot-code-actions-organize-imports) + ("C-c c r" . eglot-rename) + ("C-c c f" . eglot-format))) + (use-package elec-pair :ensure nil :defer 3 @@ -196,6 +206,15 @@ require-final-newline t version-control t)) +(use-package flymake + :ensure nil + :bind (:map flymake-mode-map + ("C-c ! d" . flymake-show-buffer-diagnostics) + ("C-c ! D" . flymake-show-project-diagnostics) + ("C-c ! n" . flymake-goto-next-error) + ("C-c ! p" . flymake-goto-prev-error)) + :config (flymake-mode)) + (use-package flyspell :ensure nil :defer 3 @@ -203,7 +222,7 @@ (((git-commit-mode markdown-mode text-mode) . flyspell-mode) - (lsp-mode . flyspell-prog-mode))) + (prog-mode . flyspell-prog-mode))) (use-package mwheel :ensure nil @@ -243,7 +262,7 @@ (save-place-mode)) (use-package seq - ; Unload seq before elpaca build + ;; Unload seq before elpaca build :ensure `(seq :build ,(+elpaca-seq-build-steps))) (use-package simple @@ -594,16 +613,22 @@ :after (consult flycheck)) ;; LSP +(use-package eglot-booster + :ensure (eglot-booster :host github :repo "jdtsmith/eglot-booster") + :after eglot + :config (eglot-booster-mode)) + (use-package lsp-mode :hook (((c-ts-mode c++-ts-mode csharp-ts-mode go-ts-mode - python-ts-mode - zig-mode) . lsp) + python-ts-mode) . lsp) + ;; zig-mode) . lsp) (lsp-mode . lsp-enable-which-key-integration)) :custom + (lsp-use-plists t) (lsp-idle-delay 0.6) (lsp-prefer-flymake nil) (lsp-session-file (concat xdg_cache_home "lsp-session"))) @@ -617,7 +642,7 @@ (lsp-ui-peek-enable t) (lsp-ui-sideline-delay 0.6) (lsp-ui-sideline-show-code-actions t) - (lsp-ui-sideline-show-hover t) + (lsp-ui-sideline-show-hover nil) (lsp-ui-sideline-update-mode 'line)) (use-package consult-lsp @@ -630,6 +655,36 @@ :after (lsp-mode treemacs) :config (lsp-treemacs-sync-mode)) +;; Configure emacs-lsp-booster for lsp-mode +(defun lsp-booster--advice-json-parse (old-fn &rest args) + "Try to parse bytecode instead of json." + (or + (when (equal (following-char) ?#) + (let ((bytecode (read (current-buffer)))) + (when (byte-code-function-p bytecode) + (funcall bytecode)))) + (apply old-fn args))) +(advice-add (if (progn (require 'json) + (fboundp 'json-parse-buffer)) + 'json-parse-buffer + 'json-read) + :around + #'lsp-booster--advice-json-parse) + +(defun lsp-booster--advice-final-command (old-fn cmd &optional test?) + "Prepend emacs-lsp-booster command to lsp CMD." + (let ((orig-result (funcall old-fn cmd test?))) + (if (and (not test?) ;; for check lsp-server-present? + (not (file-remote-p default-directory)) ;; see lsp-resolve-final-command, it would add extra shell wrapper + lsp-use-plists + (not (functionp 'json-rpc-connection)) ;; native json-rpc + (executable-find "emacs-lsp-booster")) + (progn + (message "Using emacs-lsp-booster for %s!" orig-result) + (cons "emacs-lsp-booster" orig-result)) + orig-result))) +(advice-add 'lsp-resolve-final-command :around #'lsp-booster--advice-final-command) + ;; Debugging (use-package dap-mode :after (lsp-mode)