{ config, lib, pkgs, ... }: with lib; mkIf (elem "emacs::lsp" config.machine.pkgs) { programs.emacs.init.usePackage = { lsp-mode = { enable = true; command = [ "lsp-mode" ]; config = '' (setq lsp-keymap-prefix "C-c") (setq lsp-eldoc-render-all nil) (defvar lsp-language-id-configuration '( ${optionalString (elem "emacs::rust" config.machine.pkgs) ''(rust-mode . "rust")''} )) ${optionalString (elem "emacs::rust" config.machine.pkgs) '' (setq lsp-rust-clippy-preference "on") ''} ''; }; lsp-ui = { enable = true; after = [ "lsp" ]; command = [ "lsp-ui-mode" "lsp-ui-sideline-mode" ]; config = '' (setq lsp-ui-sideline-enable t lsp-ui-sideline-show-symbol nil lsp-ui-sideline-show-hover nil lsp-ui-sideline-show-code-actions t lsp-ui-sideline-update-mode 'point) ''; }; lsp-ui-flycheck = { enable = true; package = epkgs: [ epkgs.lsp-ui ]; after = [ "lsp-ui" ] ++ optional (elem "emacs::flycheck" config.machine.pkgs) "flycheck"; }; lsp-java = { enable = (elem "emacs::java" config.machine.pkgs); command = [ "lsp-java-enable" ]; hook = [ '' (java-mode . (lambda () (lsp-java-enable) (lsp-ui-sideline-mode) (lsp-ui-flycheck-enable t) (setq-local company-backends (list 'company-lsp)))) '' ]; }; }; }