System Crafters

Build Your Own IDE with lsp-mode

What is lsp-mode?

Initial Configuration

(use-package lsp-mode
  :commands (lsp lsp-deferred)
  (setq lsp-keymap-prefix "C-c l")  ;; Or 'C-l', 's-l'
  (lsp-enable-which-key-integration t))

Basic Completions

  • completion-at-point for completions
  • Signatures when writing methods (C-n, C-p to cycle signatures)


Find Definitions and References

  • lsp-find-definition: C-c l g r
  • lsp-find-references: C-c l g g

Rename Symbol

  • lsp-rename: C-c l r r


  • flymake-show-diagnostics-buffer to show diagnostics

Code Actions

Code Formatting

  • lsp-format-buffer: C-c l = ==

Configure formatting options for some languages with lsp-<language>-format- variables

Header Breadcrumb

(defun efs/lsp-mode-setup ()
  (setq lsp-headerline-breadcrumb-segments '(path-up-to-project file symbols))

  :hook (lsp-mode . efs/lsp-mode-setup)

Better Completions with company-mode

(use-package company
  :after lsp-mode
  :hook (prog-mode . company-mode)
  :bind (:map company-active-map
         ("<tab>" . company-complete-selection))
        (:map lsp-mode-map
         ("<tab>" . company-indent-or-complete-common))
  (company-minimum-prefix-length 1)
  (company-idle-delay 0.0))

(use-package company-box
  :hook (company-mode . company-box-mode))

More UI Enhancements lsp-ui-mode

lsp-ui Documentation

(use-package lsp-ui
  :hook (lsp-mode . lsp-ui-mode))


  • lsp-ui-doc-focus-frame to enter the documentation frame to navigate and search around
  • lsp-ui-doc-unfocus-frame to leave documentation frame

(setq lsp-ui-doc-position 'bottom)


lsp-sideline configuration

(setq lsp-ui-sideline-enable nil)
(setq lsp-ui-sideline-show-hover nil)


  • lsp-ui-peek-find-references to show references inline (M-n, M-p to cycle)


Provides an even nicer UI on top of lsp-mode using Treemacs

  • lsp-treemacs-symbols - Show a tree view of the symbols in the current file
  • lsp-treemacs-references - Show a tree view for the references of the symbol under the cursor
  • lsp-treemacs-error-list - Show a tree view for the diagnostic messages in the project

(use-package lsp-treemacs
  :after lsp)

Quicker symbol searching with lsp-ivy

(use-package lsp-ivy)


(use-package typescript-mode
  :mode "\\.ts\\'"
  :hook (typescript-mode . lsp-deferred)
  (setq typescript-indent-level 2))

Install the typescript-language-server:

npm install -g typescript-language-server


Install the ccls language server.

Bonus: Commenting lines

M-; does comment, but the behavior sometimes isn't exactly what you'd expect.

evil-nerd-commenter on GitHub

(use-package evil-nerd-commenter
  :bind ("M-/" . evilnc-comment-or-uncomment-lines))

There's more to talk about later!

  • dap-mode for debugging
  • yasnippet
  • running compilers and unit test tools
  • language-specific videos