FStarLang/fstar-mode.el@3bbfe93abd -> FStarLang/fstar-mode.el@537c31983f Fuco1/sphinx-mode@77ca51adf9 -> Fuco1/sphinx-mode@038a9195b0 OCamlPro/ocp-indent@f38578c25d -> OCamlPro/ocp-indent@1213857683 ProofGeneral/PG@af2e7b9a4e -> ProofGeneral/PG@fbb2878e49 ShuguangSun/ess-view-data@dd6a85935b -> ShuguangSun/ess-view-data@5ec1c7206f abicky/nodejs-repl.el@130d49b073 -> abicky/nodejs-repl.el@c232b4964b agda/agda@900bdaa335 -> agda/agda@5e31b2534d ananthakumaran/exunit.el@8de56e3fd5 -> ananthakumaran/exunit.el@9a7cfc3d78 bricka/emacs-kotlin-ts-mode@a25d56ceca -> bricka/emacs-kotlin-ts-mode@051c9ef534 clojure-emacs/cider@12f10a6f4b -> clojure-emacs/cider@389833f85a clojure-emacs/clj-refactor.el@dc1bbc8cda -> clojure-emacs/clj-refactor.el@362cb46bf8 clojure-emacs/clojure-mode@b766094aea -> clojure-emacs/clojure-mode@28dc02114a clojure-emacs/clojure-ts-mode@da56a6938f -> clojure-emacs/clojure-ts-mode@32490c80fa cpitclaudel/company-coq@5affe7a96a -> cpitclaudel/company-coq@78ed04ce39 diml/utop@3322adaa52 -> diml/utop@33201e6076 emacs-ess/ESS@d19efaae12 -> emacs-ess/ESS@8369d574f1 emacs-geiser/chicken@5f2c1bb446 -> emacs-geiser/chicken@8342bad8ce emacs-geiser/geiser@c1c27072a4 -> emacs-geiser/geiser@c8b862f00e emacs-lsp/emacs-ccls@5636ee6c50 -> emacs-lsp/emacs-ccls@34251b799e emacs-lsp/lsp-haskell@081d5115ce -> emacs-lsp/lsp-haskell@aa9b5bce35 emacs-lsp/lsp-java@21c89243ad -> emacs-lsp/lsp-java@9230a0007c emacs-lsp/lsp-pyright@73377169be -> emacs-lsp/lsp-pyright@0e59c00c7f emacs-lsp/lsp-sourcekit@1fb230109e -> emacs-lsp/lsp-sourcekit@30918cd1ae emacs-php/php-mode@462b62248f -> emacs-php/php-mode@40b8abed30 emacs-rustic/rustic@29f912c750 -> emacs-rustic/rustic@2b4ac5de3b emacs-straight/auctex@f58a2b972b -> emacs-straight/auctex@a2809e4d70 emacs-straight/org-mode@4e6d38d1a6 -> emacs-straight/org-mode@8b15a0d0b4 emacsorphanage/dart-mode@f82ff05230 -> emacsorphanage/dart-mode@edb45cb709 emacsorphanage/htmlize@8e3841c837 -> emacsorphanage/htmlize@c9a8196a59 emacsorphanage/restclient@bba663590f -> emacsorphanage/restclient@ad97f666b6 erlang/otp@b9d3ec017d -> erlang/otp@2a970bf725 fosskers/sly-overlay@d629450590 -> fosskers/sly-overlay@345b554ad0 fsharp/emacs-fsharp-mode@8d08f05788 -> fsharp/emacs-fsharp-mode@91abae13e8 fuxialexander/org-pdftools@5613b7ae56 -> fuxialexander/org-pdftools@2b3357828a fxbois/web-mode@be2d59c8fa -> fxbois/web-mode@1eb0abb1a9 godotengine/emacs-gdscript-mode@5136be407a -> godotengine/emacs-gdscript-mode@a0d25b46d8 greghendershott/racket-mode@c4cc7c160b -> greghendershott/racket-mode@172b7d4c5a hakimel/reveal.js@eb95b14531 -> hakimel/reveal.js@4cf184924d haskell/haskell-mode@e9c3567393 -> haskell/haskell-mode@e5d32021ea idris-hackers/idris-mode@ccf32ed0b5 -> idris-hackers/idris-mode@da5c22f436 jart/disaster@8b44591322 -> jart/disaster@0299c129d4 joaotavora/sly@ce17a568ef -> joaotavora/sly@63131ef965 jschaf/powershell.el@9efa1b4d0a -> jschaf/powershell.el@99e0e73082 jwiegley/nix-update-el@77022ccd91 -> jwiegley/nix-update-el@d67f4f7ba8 kaushalmodi/ox-hugo@e3365cb4e6 -> kaushalmodi/ox-hugo@a907ea9514 ledger/ledger-mode@d9b6648201 -> ledger/ledger-mode@e9bb645e8f magit/orgit-forge@050590fbc7 -> magit/orgit-forge@5a0dbe2601 magit/orgit@224350397d -> magit/orgit@8493c24808 minad/org-modern@1723689710 -> minad/org-modern@d5e1f5af65 necaris/conda.el@05de0c8f0c -> necaris/conda.el@8a1a934a2d nex3/haml-mode@a64d58df8f -> nex3/haml-mode@3bb4a96535 nix-community/nix-ts-mode@62ce3a2dc3 -> nix-community/nix-ts-mode@e68ef36312 ocaml/dune@422986440e -> ocaml/dune@28b7e8f3b2 ocaml/merlin@e4c66857ad -> ocaml/merlin@8b88b89ee7 oer/org-re-reveal@da7e1feba9 -> oer/org-re-reveal@4eb0f71474 org-noter/org-noter@a28f61238a -> org-noter/org-noter@aafa08a49c org-roam/org-roam@c172951345 -> org-roam/org-roam@89dfaef38b polymode/polymode@74ba75d4bc -> polymode/polymode@25ba9463a4 pope/ob-go@2067ed55f4 -> pope/ob-go@c6c7c811fb ppareit/graphviz-dot-mode@8ff793b137 -> ppareit/graphviz-dot-mode@2c7ba85d19 purescript-emacs/psc-ide-emacs@4e614df553 -> purescript-emacs/psc-ide-emacs@c64b05d901 purescript-emacs/purescript-mode@8c4736759a -> purescript-emacs/purescript-mode@61732e23bd pythonic-emacs/pyenv-mode@ba1a8c7bd7 -> pythonic-emacs/pyenv-mode@364bddb8f0 rust-lang/rust-mode@25d91cff28 -> rust-lang/rust-mode@9915b3a585 salmanebah/opencl-mode@204d5d9e0f -> salmanebah/opencl-mode@6464abf969 shoshin/minitest-emacs@5999c45c04 -> shoshin/minitest-emacs@d278e94fb1 skuro/plantuml-mode@ea45a13707 -> skuro/plantuml-mode@348e83ff19 slim-template/emacs-slim@8c92169817 -> slim-template/emacs-slim@0b1b380329 sogaiu/janet-ts-mode@ac684edf57 -> sogaiu/janet-ts-mode@0e4d04d648 swift-emacs/swift-mode@e30b9d46e0 -> swift-emacs/swift-mode@fc7df7bd90 szermatt/emacs-bash-completion@d0637428fd -> szermatt/emacs-bash-completion@762f28fefb technomancy/fennel-mode@df8e83d6e2 -> technomancy/fennel-mode@0d638f6133 tpapp/julia-repl@317d560218 -> tpapp/julia-repl@681efc14a7 wbolster/emacs-python-pytest@25d9801562 -> wbolster/emacs-python-pytest@ed2ecee09d ziglang/zig-mode@c46d024733 -> ziglang/zig-mode@dab3c37c2d zweifisch/ob-elixir@8990a8178b -> zweifisch/ob-elixir@8e5d2f3c7a
:lang cc
Description unfold
This module adds support for the C-family of languages: C, C++, and Objective-C.
Through LSP, this module offers:
- Code completion
- eldoc support
- Syntax-checking
- Code navigation
- File Templates (c-mode, c++-mode)
- Snippets (cc-mode, c-mode, c++-mode)
- Several improvements to C++11 indentation and syntax highlighting.
Maintainers
Module flags
- lsp
-
Enable LSP support for
c-mode
,c++-mode
, andobjc-mode
. Requires doom-module::tools lsp and a langserver (supports clangd, ccls, and cquery). - +tree-sitter
- Leverages tree-sitter for better syntax highlighting and structural text editing. Requires doom-module::tools tree-sitter.
Packages
Hacks
No hacks documented for this module.
TODO Changelog
This module does not have a changelog yet.
Installation
Enable this module in your doom!
block.
This module's requirements change depending on how you use it.
- If doom-module:+lsp is enabled, you need one of clangd v9+ or ccls.
-
Other features in this module depend on:
- (optional) glslangValidator, for GLSL completion in
glsl-mode
- (optional) cmake, for code completion in
cmake-mode
- (optional) glslangValidator, for GLSL completion in
- You will need a C/C++ compiler, like
gcc
orclang
.
LSP servers
lsp-mode
and eglot
support a few LSP servers, but clangd
is recommend:
- clangd (must be v9 or newer)
-
clangd is included with
llvm
which should be available through your OS' package manager.-
Linux:
- Debian & Ubuntu:
$ apt-get install clangd
- Fedora & CentOS/RHEL 8+:
$ dnf install clang-tools-extra
- openSUSE:
$ zypper install clang
- Arch:
$ pacman -S clang
- Debian & Ubuntu:
-
BSDs:
- NetBSD & OpenBSD:
$ pkg_add clang-tools-extra
- NetBSD & OpenBSD:
- macOS:
$ brew install llvm
// 1GB+ installation! May take a while! - Windows: use the win64 installer from LLVM's GitHub release page.
-
- ccls
- Available in many OS' package managers as
ccls
. Otherwise, there are alternative install methods listed in the project's wiki. - cmake-language-server
- available through
pip
on most distributions
:editor format
The formatter used is doom-executable:clang-format which should be installed alongside
clang
.
For more info, see doom-module::editor format.
TODO Usage
This module's usage documentation is incomplete. Complete it?
- Enable this module.
- Enable the
+lsp
flag for the appropriate modules you want LSP support for (e.g.:lang (python +lsp)
or:lang (rust +lsp)
), - Install the prerequisite LSP servers through your package manager or other means. You can find a list of supported servers on the lsp-mode project page.
- Run
$ doom sync
on the command line and restart Emacs.
Eglot-specific bindings
When using doom-module:+lsp and doom-module::tools lsp +eglot, doom-package:lsp-mode is replaced with doom-package:eglot, and an additional function to get inheritance type hierarchy is added:
Binding | Description |
---|---|
<localleader> c t | Display inheritance type hierarchy (upwards) |
<prefix> <localleader> c t | Display inheritance type hierarchy (downwards) |
TODO Configure
This module's configuration documentation is incomplete. Complete it?
Project compile settings
LSP servers and Flycheck will recognize a compilation database (a
compile_commands.json
file). There are many ways to generate one. Here is an
example using CMake and bear:
# For CMake projects
$ cmake -DCMAKE_EXPORT_COMPILE_COMMANDS=ON .
# For non-CMake projects
$ make clean
$ bear -- make
Known issues with bear on macOS
MacOS' System Integrity Protection (SIP) might interfere with bear if make
is
under /usr/bin/
which results in an empty compilation database.
From the bear readme:
Security extension/modes on different operating systems might disable library preloads. This case Bear behaves normally, but the result compilation database will be empty. (Please make sure it's not the case when reporting bugs.) Notable examples for enabled security modes are: OS X 10.11 (check with csrutil status | grep 'System Integrity Protection'), and Fedora, CentOS, RHEL (check with sestatus | grep 'SELinux status').
Workaround could be to disable the security feature while running Bear. (This might involve reboot of your computer, so might be heavy workaround.) Another option if the build tool is not installed under certain directories. Or use tools which are using compiler wrappers. (It injects a fake compiler which does record the compiler invocation and calls the real compiler too.) An example for such tool might be scan-build. The build system shall respect CC and CXX environment variables.
A workaround might be to install make
via Homebrew which puts gmake
under
/usr/local/
:
brew install make
make clean
bear -- gmake
Additional info:
Configure LSP servers
Search for your combination of (LSP client package, LSP server)
. You are using
doom-package:lsp-mode by default, doom-package:eglot if you have doom-module::tools lsp +eglot active in
$DOOMDIR/init.el
file.
LSP-mode with clangd
;;; add to $DOOMDIR/config.el
(after! lsp-clangd
(setq lsp-clients-clangd-args
'("-j=3"
"--background-index"
"--clang-tidy"
"--completion-style=detailed"
"--header-insertion=never"
"--header-insertion-decorators=0"))
(set-lsp-priority! 'clangd 2))
This will both set your clangd flags and choose clangd
as the default LSP
server everywhere clangd can be used.
LSP-mode with ccls
;;; add to $DOOMDIR/config.el
(after! ccls
(setq ccls-initialization-options '(:index (:comments 2) :completion (:detailedLabel t)))
(set-lsp-priority! 'ccls 1))
This will prioritize ccls
over clangd
, if both are present on your system. Also
feel free to tweak var:ccls-initialization-options to reconfigure it (CCLS
documentation lists available options; use t
for true
, :json-false
for false
,
and :json-null
for null
).
Eglot with clangd
clangd
will work with Eglot out of the box, but to customize its startup
command, use fn:set-eglot-client!:
;;; add to $DOOMDIR/config.el
(after! cc-mode
(set-eglot-client! 'cc-mode '("clangd" "-j=3" "--clang-tidy")))
Eglot with ccls
ccls
will work with Eglot out of the box, but to customize its startup command,
use fn:set-eglot-client!:
;;; add to $DOOMDIR/config.el
(after! cc-mode
(set-eglot-client! 'cc-mode '("ccls" "--init={\"index\": {\"threads\": 3}}")))
CCLS documentation lists available options
Troubleshooting
There are no known problems with this module. Report one?
Frequently asked questions
This module has no FAQs yet. Ask one?
TODO Appendix
This module has no appendix yet. Write one?