emacs-lisp source:(provide 'cce/lsp-base)
Language Server Protocol is a semi-standard protocol for IDEs and tools to be able to reason about code without having to implement direct support for that language. The complexity of language integration is handled in a server (usually written in the same language) which exposes smart information and functionality to work with the code.
What this means for me is that there is always a basic amount of support that can be implied -- there are packages which integrate Emacs better with a language than LSP, perhaps, but that is also perhaps not necessary. I work through programming philosophy of arbitrary languages in their own pages, and focus here instead on configuring lsp-mode and company-mode
emacs-lisp source:(use-package lsp-mode :config (setq lsp-file-watch-threshold nil) (add-to-list 'company-backends 'company-capf)) (use-package lsp-ui :config (setq lsp-ui-doc-enable nil))
With lsp-mode installed, language support pages can just add lsp-mode to their programming language's mode-hook to enable it. It'll try to connect to the language server or start one, and then present functionality. I present that functionality to myself with hydra-lsp:
emacs-lisp source:(defhydra hydra-lsp (:exit t :hint nil) " Buffer^^ Server^^ Symbol ------------------------------------------------------------------------------------- [_f_] format [_M-r_] restart [_d_] declaration [_i_] implementation [_o_] documentation [_m_] imenu [_S_] shutdown [_D_] definition [_t_] type [_r_] rename [_x_] execute action [_M-s_] describe session [_R_] references [_s_] signature [_e_] flycheck" ("d" lsp-find-declaration) ("D" lsp-ui-peek-find-definitions) ("R" lsp-ui-peek-find-references) ("i" lsp-ui-peek-find-implementation) ("t" lsp-find-type-definition) ("s" lsp-signature-help) ("o" lsp-describe-thing-at-point) ("r" lsp-rename) ("e" lsp-ui-flycheck-list) ("f" lsp-format-buffer) ("m" lsp-ui-imenu) ("x" lsp-execute-code-action) ("M-s" lsp-describe-session) ("M-r" lsp-restart-workspace) ("S" lsp-shutdown-workspace)) (add-hook 'lsp-mode-hook (lambda () (evil-local-set-key 'normal (kbd "<SPC>l") #'hydra-lsp/body)))
and so in languages which support lsp-mode, I can hit <SPC>ld to jump to the declaration of a the function my point is underneath. useful stuff.