Emacs can be configured with lsp-mode and clangd to work well.
The official clangd extension can be used for C++ comprehension. You
can use the following .clangd file placed in the project root:
CompileFlags:
CompilationDatabase: Build/ladybird
Diagnostics:
UnusedIncludes: None
MissingIncludes: NoneRun cmake (Meta/ladybird.sh run ladybird or similar) at least once for this
to work, as it will generate the Build/ladybird/compile_commands.json
that is needed by clangd.
(use-package lsp-mode
:hook ((c++-mode) . lsp-deferred)
:commands lsp
:config
(setq lsp-clients-clangd-args '("-j=4" "-background-index" "--log=error" "--clang-tidy" "--enable-config"))
;; Optionally, set the location of clangd -- See notes below for options.
(setq lsp-clangd-binary-path "/usr/bin/clangd"))
There are a few different ways to specify which clangd to use:
- By default, without configuration
lsp-modewill try to find and use your systemclangd. This is the easiest solution, but your system clangd might be out of date. - You can manually specify any
clangdbinary withlsp-clangd-binary-path, as shown in the use-package example above. - You can have
lsp-modemanage yourclangdinstallation with emacs'lsp-install-server. This will install aclangdbinary for you. - You can build the LLVM toolchain, including
clangd, from Ladybird's repository. This is an advanced option that is not currently documented.
There are multiple packages to handle auto formatting with
clang-format, within emacs. Choose what works best for your setup:
Alternatively, this can be done without additional packages, using lsp-mode.
You can use the following .dir-locals.el file placed in the project root:
((c++-mode
(eval add-hook 'before-save-hook #'lsp-format-buffer nil t)))