JuliaEditorSupport/julia-emacs@d360ad5285 -> JuliaEditorSupport/julia-emacs@2aca8cf585 ProofGeneral/PG@3a99da2755 -> ProofGeneral/PG@b30d65de80 abo-abo/org-download@19e166f0a8 -> abo-abo/org-download@c8be261178 agda/agda@4f82f9b90a -> agda/agda@819993172d ananthakumaran/tide@b38dfc3f8f -> ananthakumaran/tide@6a35fe355f babashka/neil@6728367eff -> babashka/neil@78ffab1868 beancount/beancount-mode@7b437abcf0 -> beancount/beancount-mode@452621fa1f cdominik/cdlatex@33770dec73 -> cdominik/cdlatex@fac070f016 clojure-emacs/cider@8fdb53e8be -> clojure-emacs/cider@c228dec27d davazp/graphql-mode@ef4aecaead -> davazp/graphql-mode@c3baca9280 diml/utop@384b3098c8 -> diml/utop@b490baca21 emacs-geiser/guile@5a856c2982 -> emacs-geiser/guile@a0f111f8de emacs-geiser/mit@4e90e9ae81 -> emacs-geiser/mit@ddd2ba733e emacs-jupyter/jupyter@f97f4b5d8c -> emacs-jupyter/jupyter@e966c5d3d6 emacs-lsp/lsp-dart@9ffbafb7dc -> emacs-lsp/lsp-dart@7e3d342941 emacs-lsp/lsp-haskell@ba49fa9822 -> emacs-lsp/lsp-haskell@6981f8d122 emacs-lsp/lsp-metals@0dc938be11 -> emacs-lsp/lsp-metals@b5139c9593 emacs-lsp/lsp-pyright@0c0d72aedd -> emacs-lsp/lsp-pyright@dd54b3ae7c emacs-php/composer.el@791a7104be -> emacs-php/composer.el@6c7e19256f emacs-php/php-mode@59814bd80c -> emacs-php/php-mode@31f702ee2d emacs-rustic/rustic@d765680373 -> emacs-rustic/rustic@9fdf5c76b2 emacs-straight/auctex@08881d08ce -> emacs-straight/auctex@0de9730957 emacs-typescript/typescript.el@fc3a4f3b27 -> emacs-typescript/typescript.el@dd10f702d4 emacsmirror/org-contrib@ccd4212866 -> emacsmirror/org-contrib@f22bdd6a58 emacsmirror/paredit@037b9b8acb -> emacsmirror/paredit@af075775af emacsorphanage/dart-mode@44beb628e5 -> emacsorphanage/dart-mode@02e919c1cf emacsorphanage/macrostep@4939d88779 -> emacsorphanage/macrostep@419873665f erlang/otp@c66bf53cde -> erlang/otp@094260aba7 flatwhatson/scheme-mode@51e586e5f1 -> flatwhatson/scheme-mode@a713b253d2 godotengine/emacs-gdscript-mode@32086df833 -> godotengine/emacs-gdscript-mode@bee7f99c6f greghendershott/racket-mode@dba66c4536 -> greghendershott/racket-mode@c5bee6895b hakimel/reveal.js@472535065c -> hakimel/reveal.js@0d02d8a303 haskell/haskell-mode@727f72a2a4 -> haskell/haskell-mode@1a285fc4c5 hniksic/emacs-htmlize@ed5e5b05fd -> hniksic/emacs-htmlize@8e3841c837 jimhourihan/glsl-mode@9b2e5f28e4 -> jimhourihan/glsl-mode@c5f2c2e7ed jrblevin/markdown-mode@6102ac5b73 -> jrblevin/markdown-mode@b8637bae07 jwiegley/emacs-async@43f97d7e68 -> jwiegley/emacs-async@af47d6f930 kaushalmodi/ox-hugo@c4156d9d38 -> kaushalmodi/ox-hugo@98421a1298 ledger/ledger-mode@a6be7a2d79 -> ledger/ledger-mode@356d8049ed necaris/conda.el@ce748a53f9 -> necaris/conda.el@05de0c8f0c non-Jedi/eglot-jl@1d9cab6823 -> non-Jedi/eglot-jl@7c968cc61f nonsequitur/inf-ruby@b234625c85 -> nonsequitur/inf-ruby@6399a36682 ocaml/dune@a7924e322e -> ocaml/dune@5ac095c7c0 ocaml/merlin@e016abfac6 -> ocaml/merlin@a36f42a5b1 org-noter/org-noter@6f292d7f1e -> org-noter/org-noter@691efc3ed4 org-roam/org-roam@0b9fcbc97b -> org-roam/org-roam@2a630476b3 purcell/flycheck-ledger@628e25ba66 -> purcell/flycheck-ledger@48bed9193c purcell/flycheck-package@75efa098cf -> purcell/flycheck-package@a52e4e95f3 purcell/less-css-mode@c7fa3d56d8 -> purcell/less-css-mode@c78b88ff9a purescript-emacs/purescript-mode@eacc61aaaf -> purescript-emacs/purescript-mode@d187b3d4bb rust-lang/rust-mode@c87f6f82bd -> rust-lang/rust-mode@542f1755d8 seagle0128/grip-mode@9adac9c989 -> seagle0128/grip-mode@d6c7e33e40 senny/rbenv.el@588b817d51 -> senny/rbenv.el@4afe1dc6bd swift-emacs/swift-mode@b06c97b909 -> swift-emacs/swift-mode@ab189d6e89 technomancy/fennel-mode@f4bd34e1c3 -> technomancy/fennel-mode@259470b297 tpapp/julia-repl@801d0fc3d8 -> tpapp/julia-repl@bb90cc1fce wbolster/emacs-python-pytest@dcdaec6fe2 -> wbolster/emacs-python-pytest@25d9801562 yoshiki/yaml-mode@7b5ce294fb -> yoshiki/yaml-mode@d91f878729 ziglang/zig-mode@f55e42536a -> ziglang/zig-mode@f0b4a48753
: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?