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/x86_64
Add:
- "-D__serenity__"
- "-UNO_TLS"
- "-I/path/to/serenity/Toolchain/Local/x86_64/x86_64-pc-serenity/include/c++/13.1.0"
- "-I/path/to/serenity/Toolchain/Local/x86_64/x86_64-pc-serenity/include/c++/13.1.0/x86_64-pc-serenity"
Diagnostics:
UnusedIncludes: None
MissingIncludes: None
You will need to change /path/to/serenity
and change 13.1.0
to
whatever your GCC toolchain version at the time is.
Run cmake (Meta/serenity.sh run
or similar) at least once for this
to work, as it will generate the Build/x86_64/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-mode
will 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
clangd
binary withlsp-clangd-binary-path
, as shown in the use-package example above. - You can have
lsp-mode
manage yourclangd
installation with emacs'lsp-install-server
. This will install aclangd
binary for you. - You can build the LLVM toolchain, including
clangd
, from Serenity'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)))