2017-08-21 20:07:07 +02:00
#+TITLE : :lang cc
2017-05-04 10:40:51 +02:00
2017-05-25 20:08:50 +02:00
This module adds support for the C-family of languages: C, C++, and Objective-C.
2017-05-04 10:40:51 +02:00
2017-05-25 20:08:50 +02:00
+ Code completion (~company-irony~ )
+ eldoc support (~irony-eldoc~ )
+ Syntax-checking (~flycheck-irony~ )
2017-12-27 00:32:11 -05:00
+ Code navigation (~rtags~ )
2017-05-25 20:08:50 +02:00
+ File Templates ([[../../feature/file-templates/templates/c-mode ][c-mode ]], [[../../feature/file-templates/templates/c++-mode ][c++-mode ]])
+ Snippets ([[https://github.com/hlissner/emacs-snippets/tree/master/cc-mode ][cc-mode ]], [[https://github.com/hlissner/emacs-snippets/tree/master/c-mode ][c-mode ]], [[https://github.com/hlissner/emacs-snippets/tree/master/c++-mode ][c++-mode ]])
2017-08-21 20:07:07 +02:00
+ Several improvements to C++11 indentation and syntax highlighting.
2017-05-04 10:40:51 +02:00
2017-05-25 20:08:50 +02:00
#+begin_quote
2017-12-27 00:32:11 -05:00
C contends with Haskell and Ruby for my favorite language. That said, it's more
accurate to say I write C, but a C++ feature or three.
2017-05-04 10:40:51 +02:00
2017-12-27 00:32:11 -05:00
The module provides nominal support for Objective-C, which I really only use to
inspect generated glue code for iOS mobile apps. Otherwise, I prefer Swift.
2017-05-25 20:08:50 +02:00
#+end_quote
2017-05-04 10:40:51 +02:00
2017-08-21 20:07:07 +02:00
* Table of Contents :TOC:
- [[#install ][Install ]]
2017-12-27 00:32:11 -05:00
- [[#irony-server ][irony-server ]]
- [[#rtags ][rtags ]]
- [[#configure ][Configure ]]
- [[#compile-settings ][Compile settings ]]
2017-08-21 20:07:07 +02:00
* Install
2017-12-27 00:32:11 -05:00
This module requires:
2017-05-04 10:40:51 +02:00
2017-12-27 00:32:11 -05:00
+ irony-server
+ rtags
** irony-server
Irony powers the code completion, eldoc and syntax checking systems.
*** MacOS
2017-05-25 20:08:50 +02:00
Due to linking issues, MacOS users must compile irony-server manually:
2017-05-04 10:40:51 +02:00
#+BEGIN_SRC sh :tangle (if (doom-system-os 'macos) "yes")
2017-05-04 10:46:12 +02:00
brew install cmake
2017-05-25 20:08:50 +02:00
brew install llvm # 1gb+ installation! May take a while!
git clone https://github.com/Sarcasm/irony-mode irony-mode
mkdir irony-mode/server/build
pushd irony-mode/server/build
DEST="$HOME/.emacs.d/ .local/$(hostname)/etc/irony-server/ "
cmake -DCMAKE_INSTALL_RPATH_USE_LINK_PATH=ON \
-DCMAKE_INSTALL_PREFIX="$DEST" ../
cmake --build . --use-stderr --config Release --target install
install_name_tool -change @rpath/libclang.dylib \
/usr/local/opt/llvm/lib/libclang.dylib \
"$DEST/bin/irony-server"
# cleanup
popd
rm -rf irony-mode
2017-05-04 10:46:12 +02:00
#+END_SRC
2017-12-27 00:32:11 -05:00
*** Arch Linux
2017-05-04 10:46:12 +02:00
#+BEGIN_SRC sh :tangle (if (doom-system-os 'arch) "yes")
sudo pacman --needed --noconfirm -S clang cmake
2017-05-04 10:40:51 +02:00
#+END_SRC
2017-05-25 20:08:50 +02:00
Then run ~M-x irony-install-server~ in Emacs.
2017-08-21 20:07:07 +02:00
2017-12-27 00:32:11 -05:00
** rtags
Code navigation requires an [[https://github.com/Andersbakken/rtags ][rtags ]] server (~rdm~ ) installed and running. This
should be available through your OS's package manager.
This module will auto-start ~rdm~ when you open C/C++ buffers (so long as one
isn't already). If you prefer to run it yourself, outside of Emacs:
#+BEGIN_SRC sh
rdm &
rc -J $PROJECT_ROOT # loads PROJECT_ROOT's compile_commands.json
#+END_SRC
* Configure
** Compile settings
By default, a set of default compile settings are defined in
~+cc-compiler-options~ for C, C++ and Objective C. Irony, rtags and flycheck
will fall back to these.
To make these tools aware of project specific build settings, you need a JSON
[[https://sarcasm.github.io/notes/dev/compilation-database.html#ninja ][compilation database ]] present (i.e. a ~compile_commands.json~ file).
There are [[https://sarcasm.github.io/notes/dev/compilation-database.html ][many ways to generate one ]]. I use [[http://www.cmake.org/ ][CMake ]] and [[https://github.com/rizsotto/Bear ][bear ]]:
#+BEGIN_SRC sh
# For CMake projects
cmake -DCMAKE_EXPORT_COMPILE_COMMANDS=ON .
# For non-CMake projects
make clean
bear make
#+END_SRC
#+begin_quote
Use ~M-x +cc/reload-compile-db~ to reload your compile db in an already-open
C/C++/ObjC buffer.
#+end_quote