Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/LucHermitte/lh-cpp
C&C++ ftplugins suite for Vim
https://github.com/LucHermitte/lh-cpp
brackets cpp snippets vim vim-plugins
Last synced: 3 months ago
JSON representation
C&C++ ftplugins suite for Vim
- Host: GitHub
- URL: https://github.com/LucHermitte/lh-cpp
- Owner: LucHermitte
- License: other
- Created: 2015-03-13T12:46:33.000Z (over 9 years ago)
- Default Branch: master
- Last Pushed: 2024-07-26T09:39:06.000Z (4 months ago)
- Last Synced: 2024-07-26T11:00:04.996Z (4 months ago)
- Topics: brackets, cpp, snippets, vim, vim-plugins
- Language: Vim script
- Homepage:
- Size: 2.08 MB
- Stars: 130
- Watchers: 11
- Forks: 10
- Open Issues: 3
-
Metadata Files:
- Readme: README.md
- License: License.md
Awesome Lists containing this project
README
# lh-cpp [![Build Status](https://secure.travis-ci.org/LucHermitte/lh-cpp.png?branch=master)](http://travis-ci.org/LucHermitte/lh-cpp) [![Project Stats](https://www.openhub.net/p/21020/widgets/project_thin_badge.gif)](https://www.openhub.net/p/21020)
## Featureslh-cpp is an heterogeneous suite of helpers for C and C++ programming.
It provides the following things:
* Smart snippets for [brackets pairs](#brackets), [control statements](#code-snippets)
* a few [templates](#templates)
* a few [advanced wizards, and high-level features](#wizards-and-other-high-level-features) to Generate classes and singletons, to Generate ready to fill-in function comments for Doxygen, Jump to a function implementation, Search for un-implemented or undeclared functions, _etc._
* [syntax highlighting](#syntax-highlighting) for identified counter-idioms and bad practices (catch by value, assignments in conditions, throw specifications)
* an [API](doc/API.md) to build even more complex wizards and advanced featuresAn exhaustive [list of all options](doc/options.md) is also available.
For help using this plugin for the first time, please take a look at `:h lh-cpp-first-steps`### Text insertion facilities
#### Brackets
The insertion of pair of brackets-like characters is eased thanks to [lh-brackets](http://github.com/LucHermitte/lh-brackets).
| In mode | INSERT | VISUAL | NORMAL |
|:------------------------|:--------------------------------------------------------------------|:----------------------------------------------|:--------------------------|
| **keys** | Expands into .. | Surrounds the selection with ... 2 | Surrounds the current ... |
| `(` | `()«»` | `()` | word |
| `[` | `[]«»` | 1 | 1 |
| `[` after a `[` | `[[]]«»` | n/a | n/a |
| `]` before `]]` | close all `]]` | n/a | n/a |
| `[` | | `[]` | word |
| `{` | `{}«»`3 | `{}` | word |
| `{` | | `{\n\n}«»` | line |
| < | `<>«»` after `#include`, or `template` on the same line | | |
| `"` (1 double quote) | `""«»` | 1 | 1 |
| `""` | | `""` | word |
| `'` | `''«»` | 1 | 1 |
| `''` (2 single quotes) | | `''` | word |
| `;` | closes all parenthesis after the cursor -- if there is nothing else | | |##### Notes:
* 1 Not defined to avoid hijacking default vim key bindings.
* 2 The visual mode mappings do not surround the current marker/placeholder selected, but trigger the INSERT-mode mappings instead.
* 3 The exact behavior of this mapping has changed with release r719 (on Google Code). Now, no newline is inserted by default. However, hitting `` in the middle of a pair of curly-bracket will expand into `{\n\n}`.
* `«»` represents a marker/placeholder, it may be expanded with other characters like `<++>` depending on your preferences.
* There is no way (yet) to deactivate this feature from the `.vimrc`#### Code snippets
##### INSERT-mode snippets abbreviations
There exist, over the WWW, a lot of configurations and mappings regarding C programming. Once again you will find shortcuts for `if`, `else`, `elif` (I know it is not a C keyword, but `else if` are), `for`, `while`, `do`, `switch`, and `main`. In C++, snippets are also provided for `try`, `catch`, and `namespace`.
What is unique is the fact that when you type `if` in insert mode, it will automatically expand into ...
```C++
if () {
}
```
... in respect of the context. I.e.: within comments or strings (delimited by single or double quotes) `if` is not expanded. If keyword characters precede the typing, `if` is not expanded as well. Thus variables like `tarif` can be used without getting any headache.Most of these same snippets, and a few variations, are
[also provided](doc/snippets.md#control-statements) as template-files for
[mu-template](http://github.com/LucHermitte/mu-template).
This time, you just need to type the first letters of the snippet/template
name, and trigger the expansion (with `` by default). If several
snippets match (like _c/for_, _c/fori_, _cpp/fori_ and _cpp/for-iterator_ when
you try to expand `fo`), mu-template will ask you to choose which (matching)
snippet you want to expand.##### Instruction surrounding mappings
In visual mode, `,if` wraps the selection within the curly brackets and inserts `if ()` just before. In normal mode `,if` does the same thing under the consideration that the selection is considered to be the current line under the cursor. Actually, it is not `,if` but `if,` with `maplocalleader` assigned by default to the coma `,`.##### Expression-condition surrounding mappings
In the same idea, `if` surrounds the selection with `if (` and `) {\n«»\n}«»`.##### Other notes
All the three mode oriented mappings respect and force the indentation regarding the current setting and what was typed.More precisely, regarding the value of the buffer relative option b:usemarks (_cf._ [lh-brackets](http://github.com/LucHermitte/lh-brackets)), `if` could be expanded into:
```C++
if () {
«»
}«»
```The exact style (Alman, Stroustroup, ...) regarding whether brackets are on a
new line, or not, can be tuned thanks to [lh-dev `:AddStyle` feature](http://github.com/LucHermitte/lh-dev#formatting-of-brackets-characters).#### Miscellaneous shortcuts
Note: in all the following mappings, `,` is actually the localleader that
lh-cpp sets to the comma characcter if it isn't set already.* `tpl` expands into `template <>«»` ;
* `` inserts `typedef`, or `typename` depending on what is before the cursor ;
* `` inserts `return`, and tries to correctly place the semicolon, and a placeholder, depending on what follows the cursor ;
* `be`, `rbe` replace `(foo)` with `(foo.begin(),foo.end())` (or `rbegin`/`rend`) ;
* `se`: attempt to fill-in a `switch-case` from an enumerated type ;
* `,sc` | `,dc` | `,rc` | `,cc` | `,lc` surround the selection with ; `static_cast<>()`, `dynamic_cast`, `reinterpret_cast`, `const_cast`, or `boost::lexical_cast` ;
* `,,sc` | `,,dc` | `,,rc` | `,,cc` try to convert the C-cast selected into the C++-cast requested ;
* `#d` expands into `#define`, `#i` into `#ifdef`, `#e` into `endif`, `#n` into `#include` ;
* `,0` surrounds the selected lines with `#if 0 ... #endif` ;
* `,1` surrounds the selected lines with `#if 0 ... #else ... #endif` ;
* `:KeepPoundIfPath 0` (or `1`) will clean a `#if 0/1...#else...#endif`
construct to match either the true or the false path.
* `pub` expands into `public:\n`, `pro` expands into `protected:\n`, `pri` expands into `private:\n` ;
* `vir` expands into `virtual` ;
* `firend` is replaced by `friend` ;
* `` inserts `std::`, `` inserts `boost:` ;
* `?:` expands into `? «» : «»;` ;
* `i` will look for the symbol under the cursor (or selected) in the current ctag database and it will try to automatically include the header file where the symbol is defined.
* `` will look for the symbol under the cursor (or selected) in the current ctag database and it will try to automatically prepend it with its missing complete scope.
* `[[` and `][` and been overridden to jump to the start/end of the current
function -- the default mappings were defined in C in mind, and they are
unable of this. See the related `v_if` and `o_if` mappings from [lh-dev](http://github.com/LucHermitte/lh-dev/#function) -- [see the demo](blob/master/doc/screencast-select-function.gif).#### Templates
* All templates, snippets and wizards respect the naming convention set for
the current project thanks to
[lh-dev styling feature](http://github.com/LucHermitte/lh-dev#naming-conventions)
-- see my [project style template](http://github.com/LucHermitte/mu-template/blob/master/after/template/vim/internals/vim-rc-local-cpp-style.template)
for an idea of what is supported and possible.
* stream inserters, stream extractor, binary operators.
* [bool operator](doc/snippets.md#cppbool-operator): almost portable hack to
provide a boolean operator, strongly inspired by Matthew Wilson's
_Imperfect C++_.
* Generation of [enums](doc/Enums.md), and of switch-case statements from enum
definition.
* constructors: [`copy-constructor`](doc/snippets.md#cppcopy-constructor),
[`default-constructor`](doc/snippets.md#cppdefault-constructor),
[`destructor`](doc/snippets.md#cppdestructor),
[`assignment-operator`](doc/snippets.md#cppassignment-operator)
(see `:h :Constructor`).
* Various [standard types](doc/snippets.md#standard-and-boost-types) and
[functions](doc/snippets.md#standard-and-boost-functions-and-idioms) (and a
few from boost) have a snippet that'll automatically include the related
header file there are are defined. NB: at this time, inclusions are not
optimized as IncludeWhatYouUse would optimize them for us.
* When a snippet/template requires header files, they will get included
automatically (as long as the snippet specifies the headers files required)
; note: so far this feature cannot detect whether a required header file is
already indirectly included through other included files.
* Some snippets will try to detect the C++11 dialect (98/03/11/14/17) in
order to adapt the result produced -- it will be done through the analysis
of the [option `(bg):cpp_std_flavour`](doc/option.md#bgcpp_std_flavour-and-cxxflags) , or
the analysis of `$CXXFLAGS`, or through the analysis of CMake `CXXFLAGS`
variables (this will require
[lh-cmake](http://github.com/LucHermitte/lh-cmake), and the project to be
configured to CMake.)I'll try to maintain an up-to-date [documentation](doc/snippets.md) of the
snippets as most of them have options.#### Wizards and other high-level features
* [class](doc/snippets.md#cppclass): builds a class skeleton based on the selected (simplified) semantics (value copyable, stack-based non copyable, entity non-copyable, entity clonable)
* [singleton](doc/snippets.md#cppsingleton): my very own way to define singletons based on my conclusions on this anti-pattern -- you may prefer Loki's or ACE's solutions
* [:DOX](doc/Doxygen.md): analyses a function signature (parameters, return type, throw specification) and provide a default Doxygenized documentation
* [:GOTOIMPL](doc/GotoImplementation.md), :MOVETOIMPL: search and jump to a function definition from its declaration, provide a default one in the _ad'hoc_ implementation file if no definition is found
* [:ADDATTRIBUTE](doc/Accessors.md): old facility that helps define const-correct accessors and mutator, will be reworked. [lh-refactor](http://github.com/LucHermitte/vim-refactor) provides more ergonomic mappings for this purpose.
* [:CppDisplayUnmatchedFunctions](doc/UmatchedFunctions.md), `u`: shows the list of functions for which there is neither a declaration, nor a definition
* [:Override](doc/Override.md): Ask which inherited virtual function should be overridden in the current class (feature still in its very early stages)
* `:Constructor` (that takes the following parameters: `init`, `default`, `copy`, `assign`), or `:ConstructorInit`, `:ConstructorDefault`, `:ConstructorCopy`, `AssignmentOperator`. They'll analyse the list of know attributes (from a ctags database) to generate the related construction functions.### Syntax highlighting
* assign in condition (bad practice)
* catch by value (bad practice)
* throw specifications ([do you really know what they are about, and still want them?](http://www.gotw.ca/gotw/082.htm)), BTW they have been deprecated in C++11
* C casts in C++ (bad practice)
* cases that fall through the next one (code smell -- disabled by default)
* function definitions### Miscellaneous
* home like VC++: mappings that override `` and `` to mimic how these keys behave in VC++.
* omap-param: defines the o-mappings `,i` and `,a` to select the current parameter (in a list of parameters).
* SiR,
* lh-cpp imports a [C&C++ Folding plugin](https://github.com/LucHermitte/VimFold4C),
which is still experimental.
* [lh-dev](http://github.com/LucHermitte/lh-dev), which is required by
lh-cpp, provides a few commands like `:NameConvert` that permits to change
the naming style of a symbol. The possible styles are: `upper_camel_case`,
`lower_camel_case`, `snake`/`underscore`, `variable`, `local`, `global`,
`member`, `constant`, `static`, `param`, `getter`, `setter`)### Installation
* Requirements: Vim 7.+, [lh-vim-lib](https://github.com/LucHermitte/lh-vim-lib), [lh-style](https://github.com/LucHermitte/lh-style), [lh-brackets](https://github.com/LucHermitte/lh-brackets), [mu-template](https://github.com/LucHermitte/mu-template), [lh-dev](https://github.com/LucHermitte/lh-dev), [alternate-lite](https://github.com/LucHermitte/alternate-lite).
* With [vim-addon-manager](https://github.com/MarcWeber/vim-addon-manager), install lh-cpp. This is the preferred method because of the various dependencies.
```vim
ActivateAddons lh-cpp
```
* or with [vim-flavor](https://github.com/kana/vim-flavor) which also supports
dependencies:
```
flavor 'LucHermitte/lh-cpp'
```
* or you can clone the git repositories (expecting I haven't forgotten anything):
```
git clone [email protected]:LucHermitte/lh-vim-lib.git
git clone [email protected]:LucHermitte/lh-style.git
git clone [email protected]:LucHermitte/lh-tags.git
git clone [email protected]:LucHermitte/lh-dev.git
git clone [email protected]:LucHermitte/lh-brackets.git
git clone [email protected]:LucHermitte/searchInRuntime.git
git clone [email protected]:LucHermitte/mu-template.git
git clone [email protected]:tomtom/stakeholders_vim.git
git clone [email protected]:LucHermitte/alternate-lite.git
git clone [email protected]:LucHermitte/lh-cpp.git
```
* or with Vundle/NeoBundle (expecting I haven't forgotten anything):
```vim
Bundle 'LucHermitte/lh-vim-lib'
Bundle 'LucHermitte/lh-style'
Bundle 'LucHermitte/lh-tags'
Bundle 'LucHermitte/lh-dev'
Bundle 'LucHermitte/lh-brackets'
Bundle 'LucHermitte/searchInRuntime'
Bundle 'LucHermitte/mu-template'
Bundle 'tomtom/stakeholders_vim'
Bundle 'LucHermitte/alternate-lite'
Bundle 'LucHermitte/lh-cpp'
```## Credits
Many people have to be credited:
* the Vim & VimL gurus ;
* the people I've stolen scripts and functions from: Stephen Riehm, Michael
Sharpe, Georgi Slavchev, Johannes Zellner, Saul Lubkin ;
* the people that gave me many great ideas and even feedback: Gergely Kontra,
Leif Wickland, Robert Kelly IV [I've also stolen scripts from them] ;
* Thomas Ribo for his feedback and features-requirements.
* and many more that I have probably forgotten.## License
* Documentation is under CC-BY-SA 3.0
* lh-cpp is under GPLv3 with exceptions. See acompagning [license file](License.md), i.e.
* Plugin, snippets and templates are under GPLv3
* Most code generated from snippets (for control statements, proto
-> definition, accessors, ...) are under the License Exception
detailled in the [license file](License.md).
* However, code generated from the following wizards: `class`,
`singleton`, `enum` (1&2, switch, for), `abs-rel` -> is under Boost
Software Licence## See also
* [C++ tips on vim.wikia](http://vim.wikia.com/wiki/Category:C%2B%2B)
* c.vim
* **Project Management**: [local\_vimrc](https://github.com/LucHermitte/local_vimrc)
* **Compilation**: [BuildToolsWrappers](http://github.com/LucHermitte/vim-build-tools-wrapper)
* **Errors Highlighting**: syntastic, [compil-hints](http://github.com/LucHermitte/vim-compil-hints) (a non-dynamic syntastic-lite plugin that'll only highlight errors found after a compilation stage)
* **CMake Integration**: [lh-cmake](https://github.com/LucHermitte/lh-cmake) + [local\_vimrc](https://github.com/LucHermitte/local_vimrc) + [BuildToolsWrappers](http://github.com/LucHermitte/vim-build-tools-wrapper)
* **Refactoring**: refactor.vim, [my generic refactoring plugin](http://github.com/LucHermitte/vim-refactor)
* **Code Completion**: [YouCompleteMe](https://github.com/Valloric/YouCompleteMe), really, check this one!, or [OmniCppComplete](http://www.vim.org/scripts/script.php?script_id=1520), or [clang\_complete](https://github.com/Rip-Rip/clang_complete)
* **Code Indexing**: [clang\_indexer](https://github.com/LucHermitte/clang_indexer) and [vim-clang](https://github.com/LucHermitte/vim-clang), [lh-tags](http://github.com/LucHermitte/lh-tags)