This post summarizes how to set up various plugins needed for C++/C code editing, linting and formatting.

Pre-requisite

This post assumes that deoplete has been installed and set up properly on your system. If that is not the case, you may refer to this post on how to do it.

Install clang and llvm

To enable C++/C code auto-completion, we need to install clang first.

Linux

On Linux, we can build the latest clang from source using the following command:

git clone https://github.com/llvm/llvm-project.git
cd llvm-project
mkdir build && cd build
cmake -DLLVM_ENABLE_PROJECTS=clang -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=Release  ../llvm
make -j$(nproc)

The flag -DCMAKE_BUILD_TYPE=Release will build a release version of clang, which is much smaller than the default one (Debug type).

The build process will take about half of an hour on our 12-core server, and the time may vary depending on your hardware.

After that, we need to add the clang binary path to the PATH variable, and add the directory containing libclang.so to env variable LD_LIBRARY_PATH. Edit ~/.bash_profile and add following settings:

export PATH="$HOME/tools/llvm-project/build/bin:$PATH"
export LD_LIBRARY_PATH="$HOME/tools/llvm-project/build/lib:$LD_LIBRARY_PATH"

Under directory $HOME/tools/llvm-project/build/bin, there are a lot of executables, including clang, clang++, and clang-format (which we will use to format C++/C code later).

Do not forget to source the file to refresh the env variables.

MacOS

For MacOS, clang is shipped with it so we do not need to install clang. We need to install clang-format though since clang-format is not shipped with clang by default (source here).

The easiest way to install clang-format is via Homebrew:

brew install clang-format

On Mac, the name of the clang share library is libclang.dylib, and we should add its parent directory to env variable LD_LIBRARY_PATH1:

export LD_LIBRARY_PATH="/Library/Developer/CommandLineTools/usr/lib/:$LD_LIBRARY_PATH"

Auto-completion

To provide C++/C code autocompletion, we can use deoplete-clang:

" Install using vim-plug
Plug 'deoplete-plugins/deoplete-clang'

If you have set up the libclang path properly, then auto-completion should work when you start editing C++/C source files.

Linting

For code linting, we can use ale. Add the following setting to Neovim config:

let g:ale_linters = {
    \ 'python': ['pylint'],
    \ 'vim': ['vint'],
    \ 'cpp': ['clang'],
    \ 'c': ['clang']
\}

Code formatting

We can use the command line tool clang-format shipped with clang for code formatting, with the help of pluign Neoformat to format our code. Make sure that clang-format is on your PATH. Add the following settings to Neovim config:

" custom setting for clangformat
let g:neoformat_cpp_clangformat = {
    \ 'exe': 'clang-format',
    \ 'args': ['--style="{IndentWidth: 4}"']
\}
let g:neoformat_enabled_cpp = ['clangformat']
let g:neoformat_enabled_c = ['clangformat']

Notice that the linter name for clang-format is clangformat, not clang-format. I have wasted ten minutes trying to find why clang-format does not with Neoformat until I found here that we should use clangformat as the linter name.

References


  1. you can find its path via command mdfind -name libclang.dylib. ↩︎