The end result

Code folding recently landed in Elixir's LSP implementation 🎉 and if you want to give it a try in Doom Emacs, here are the steps needed:

Ensure you have the latest Elixir LSP

Support just hit master and has not been pushed in a tagged release. Make sure you have updated your install.

If you have not installed Elixir LSP before – that is outside the scope of this article – but the gist is something like:

git clone https://github.com/elixir-lsp/elixir-ls.git
cd elixir-ls
mix deps.get
mix compile
mix elixir_ls.release

Disable existing fold layer

Doom Emacs has a custom folding layer that marries hideshow, vimish-fold, and outline-minor-mode. Since we need to use origami to get LSP-backed folding support, it is best to comment out the existing folding layer and avoid any potential conflicts.

This is a safety measure, I am not sure if these things can co-exist. Feel free to try and report back in #emacs in the Elixir community Slack.

;; ~/.doom.d/init.el

(doom! 
  ;; ... more config ...
  
  :editor
  ;;fold              ; (nigh) universal code folding
  
  ;; ... more config ...

Enable code folding for the LSP layer with Origami

Add the lsp-origami to the doom packages:

;; ~/.doom.d/packages.el

(package! lsp-origami)

Enable code folding with lsp and set up package hooks:

;; ~/.doom.d/config.el

;; Enable folding
(setq lsp-enable-folding t)

;; Add origami and LSP integration
(use-package! lsp-origami)
(add-hook! 'lsp-after-open-hook #'lsp-origami-try-enable)

Then run doom sync to install the new packages and remove the old one.

Testing it out

Open up an elixir file and use all the usual keybindings z c to collapse, z o to open, z r to open recursively. You can discover all the commands running SPC : and fuzzy searching for commands starting with fold or origami

Bugs

If you run into any bugs with the new folding feature, report it upstream to the Elixir Language Server project.