diff --git a/nix/flake.lock b/nix/flake.lock index 3036aec..9652dd5 100644 --- a/nix/flake.lock +++ b/nix/flake.lock @@ -1,5 +1,25 @@ { "nodes": { + "emacs-lsp-booster": { + "inputs": { + "nixpkgs": [ + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1716274896, + "narHash": "sha256-WsyEkdt8ReGQ40+yV4Cb99A2MEmV0O/i6rmFQura5ww=", + "owner": "slotThe", + "repo": "emacs-lsp-booster-flake", + "rev": "7d110295988fc9bf7fd43bb0cabfbe58a4a5ecf8", + "type": "github" + }, + "original": { + "owner": "slotThe", + "repo": "emacs-lsp-booster-flake", + "type": "github" + } + }, "home-manager": { "inputs": { "nixpkgs": [ @@ -38,6 +58,7 @@ }, "root": { "inputs": { + "emacs-lsp-booster": "emacs-lsp-booster", "home-manager": "home-manager", "nixpkgs": "nixpkgs", "utils": "utils" diff --git a/nix/flake.nix b/nix/flake.nix index 116e528..9b2246c 100644 --- a/nix/flake.nix +++ b/nix/flake.nix @@ -2,9 +2,11 @@ inputs = { nixpkgs.url = "github:nixos/nixpkgs/nixpkgs-unstable"; utils.url = "github:numtide/flake-utils"; + emacs-lsp-booster.url = "github:slotThe/emacs-lsp-booster-flake"; home-manager.url = "github:nix-community/home-manager"; home-manager.inputs.nixpkgs.follows = "nixpkgs"; + emacs-lsp-booster.inputs.nixpkgs.follows = "nixpkgs"; }; outputs = { @@ -12,10 +14,12 @@ nixpkgs, utils, home-manager, + emacs-lsp-booster, ...}: let pkgsForSystem = (system: import nixpkgs { inherit system; overlays = [ + emacs-lsp-booster.overlays.default ]; config.allowUnfree = true; }); diff --git a/nix/modules/emacs.nix b/nix/modules/emacs.nix index 613f133..38b700a 100644 --- a/nix/modules/emacs.nix +++ b/nix/modules/emacs.nix @@ -9,7 +9,7 @@ in programs.emacs.extraPackages = epkgs: [ epkgs.vterm ]; home.packages = with pkgs; let - basePackages = [ zstd ]; + basePackages = [ zstd emacs-lsp-booster ]; macPackages = basePackages ++ [ coreutils ]; in if isOnMac then macPackages else basePackages; diff --git a/thoom-emacs/init.el b/thoom-emacs/init.el index dbfb064..262ca20 100644 --- a/thoom-emacs/init.el +++ b/thoom-emacs/init.el @@ -719,6 +719,37 @@ (defun my/lsp-mode-setup-completion () (setf (alist-get 'styles (alist-get 'lsp-capf completion-category-defaults)) '(orderless))) + + (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 + (when-let ((command-from-exec-path (executable-find (car orig-result)))) ;; resolve command from exec-path (in case not found in $PATH) + (setcar orig-result command-from-exec-path)) + (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) :hook ((rust-ts-mode . lsp-deferred) (lsp-mode . lsp-enable-which-key-integration) (lsp-completion-mode . my/lsp-mode-setup-completion)))