.emacs.d/init.d/programming/lsp.el

75 lines
2.7 KiB
EmacsLisp

;;; lsp.el --- Language Server Protocol. -*- lexical-binding: t; -*-
;; Time-stamp: <2020-05-24T22:49:17+0200>
;;; Commentary:
;;; Code:
(require 'basics/package-management)
(require 'basics/global-variables)
(require 'programming/common)
(unless slow-computer
;; Client for Language Server Protocol servers.
(use-package lsp-mode
:if (executable-find "clangd")
:defines (lsp-clients-clangd-args)
:diminish lsp-mode
:custom ((lsp-prefer-flymake nil) ; Disable flymake.
(lsp-auto-guess-root t) ; Don't ask for project root.
(lsp-eldoc-render-all t) ; Display all eldoc information.
(lsp-restart 'auto-restart)) ; Automatically restart server.
:config (progn
(setq lsp-clients-clangd-args '("--compile-commands-dir=build"))
;; Add “-clang-tidy” to clangd args if the version supports it.
(when (>= (my/clangd-version) 9.0)
(add-to-list 'lsp-clients-clangd-args "--clang-tidy" t))
;; Mark lsp-clients-clangd-args as safe to override.
(put 'lsp-clients-clangd-args 'safe-local-variable #'consp))
:bind ("C-c C-f" . lsp-execute-code-action)
:hook ((c++-mode . lsp)
(c-mode . lsp)))
;; Eye-candy and flycheck support for lsp-mode.
(use-package lsp-ui
:after (lsp-mode flycheck whitespace)
:functions (my/whitespace-mode-on my/whitespace-mode-off)
:custom ((lsp-ui-sideline-enable nil) ; Do not insert doc into buffer.
(lsp-ui-doc-include-signature t) ; Include signature in doc popup.
(lsp-ui-doc-enable nil)) ; Disable doc popup.
:config (defun my/lsp-ws-toggle ()
"Works around the dots-in-wrong-color bug."
(if lsp-ui-peek-mode
(my/whitespace-mode-off)
(my/whitespace-mode-on)))
:bind (:map lsp-ui-mode-map
("M-." . lsp-ui-peek-find-definitions)
("C-M-." . lsp-ui-peek-find-references)
("C-M-," . lsp-ui-peek-find-implementation))
:hook ((lsp-mode . lsp-ui-mode)
(lsp-ui-peek-mode . my/lsp-ws-toggle)))
;; Completions with lsp-mode.
(use-package company-lsp
:demand t
:after (lsp-mode company)
:custom (company-lsp-cache-candidates 'auto)
:config (push 'company-lsp company-backends))
;; ivy interface to lsp-mode.
(use-package lsp-ivy
:demand t
:after (lsp-mode ivy))
;; Integration between lsp-mode and treemacs.
(use-package lsp-treemacs
:after (treemacs lsp-ui)
:bind (:map lsp-ui-mode-map
("<f7>" . lsp-treemacs-errors-list)
("M-i" . lsp-treemacs-symbols)))
) ; unless slow-computer.
(provide 'programming/lsp)
;;; lsp.el ends here