Skip to content
Extended Vim syntax highlighting for C and C++ (C++11/14/17/20)
Branch: master
Clone or download
Latest commit ea6bd8b May 10, 2019
Type Name Latest commit message Commit time
Failed to load latest commit information.
after/syntax Always link cppModifier group to Statement May 10, 2019 Update README May 10, 2019

vim-cpp-modern: Enhanced C and C++ syntax highlighting

This plugin provides additional syntax highlighting for C and C++11/14/17/20 development in Vim. It provides highlighting of functions, as well as all types, helper types and helper template variables in the C++ standard library. It also adds syntax highlighting of C++20 library concepts.

The syntax file is based on vim-cpp-enhanced-highlight.

Difference to vim-cpp-enhanced-highlight

  • The C++ keywords virtual, override, final, inline, explicit and export are standard C++ statements and not types and are therefore put under the highlighting group Statement.
  • Almost all C++ standard library functions have been commented out because words followed by an opening parenthesis are highlighted as functions anyway. So we don't have to explicitly list each library function in here. The only exceptions are function templates, which sometimes must be called with template parameters, like std::make_unique<Foo>(bar).
  • Another reason why almost all library functions have been commented out is because if someone had defined his/her own type and the name collided with a library's function name, the type would have been highlighted as a function. This can happen quite often when too many keywords are added to the syntax file. I have noticed this when implementing metafunctions like apply or find_if.
  • User-defined function templates or class members won't be highlighted. Both features were removed because they made scrolling very slow and never worked 100%.

Optional features

" Disable function highlighting (affects both C and C++ files)
let g:cpp_no_function_highlight = 1

" Put all standard C and C++ keywords under Vim's highlight group `Statement`
" (affects both C and C++ files)
let g:cpp_simple_highlight = 1

" Enable highlighting of named requirements (C++20 library concepts)
let g:cpp_named_requirements_highlight = 1

The last option will highlight all C++ named requirements (concepts that haven't made it into the C++ standard yet) as standard library types.


Copy both c.vim and cpp.vim into your ~/.vim/after/syntax directory, or use your preferred plugin manager.


Vim tends to a have issues with flagging braces inside brackets as invalid syntax such as in the following example:

std::map<std::pair<int, int>, int> m;
m[{1, 2}] = 3;

As a workaround set

let c_no_curly_error = 1

See also :help ft-c-syntax for further options.



Distributed under the same terms as Vim itself. See :help license.

You can’t perform that action at this time.