In a nutshell, I'm searching for a working autocompletion feature for the Vim editor. I've argued before that Vim completely replaces an IDE under Linux and while that's certainly true, it lacks one important feature: autocompletion.
I know about Ctrl+N, Exuberant Ctags integration, Taglist, cppcomplete and OmniCppComplete. Alas, none of these fits my description of “working autocompletion:”
- Ctrl+N works nicely (only) if you've forgotton how to spell
class
, orwhile
. Oh well. - Ctags gives you the rudiments but has a lot of drawbacks.
- Taglist is just a Ctags wrapper and as such, inherits most of its drawbacks (although it works well for listing declarations).
- cppcomplete simply doesn't work as promised, and I can't figure out what I did wrong, or if it's “working” correctly and the limitations are by design.
- OmniCppComplete seems to have the same problems as cppcomplete, i.e. auto-completion doesn't work properly. Additionally, the
tags
file once again needs to be updated manually.
I'm aware of the fact that not even modern, full-blown IDEs offer good C++ code completion. That's why I've accepted Vim's lack in this area until now. But I think a fundamental level of code completion isn't too much to ask, and is in fact required for productive usage. So I'm searching for something that can accomplish at least the following things.
Syntax awareness. cppcomplete promises (but doesn't deliver for me), correct, scope-aware auto-completion of the following:
variableName.abc variableName->abc typeName::abc
And really, anything else is completely useless.
Configurability. I need to specify (easily) where the source files are, and hence where the script gets its auto-completion information from. In fact, I've got a Makefile in my directory which specifies the required include paths. Eclipse can interpret the information found therein, why not a Vim script as well?
Up-to-dateness. As soon as I change something in my file, I want the auto-completion to reflect this. I do not want to manually trigger
ctags
(or something comparable). Also, changes should be incremental, i.e. when I've changed just one file it's completely unacceptable forctags
to re-parse the whole directory tree (which may be huge).
Did I forget anything? Feel free to update.
I'm comfortable with quite a lot of configuration and/or tinkering but I don't want to program a solution from scratch, and I'm not good at debugging Vim scripts.
A final note, I'd really like something similar for Java and C# but I guess that's too much to hope for: ctags
only parses code files and both Java and C# have huge, precompiled frameworks that would need to be indexed. Unfortunately, developing .NET without an IDE is even more of a PITA than C++.
sh
(meaning it's in my library) and followed by the abbreviation of my class. For exampleshP
forParser
class. Then all you need to do is writeshP
and hit CTRL+p (or CTRL+n if you want) and get the class members from last use to first (or first to last if CTRL+n) – Shahbazclang_complete
is technically the most sound but prohibitively slow due to lack of caching the results and partial compilation. I have to admit that I haven’t tried all answers because some require a convoluted, time-consuming setup. I’ll hold my breath for a usable plugin now that clang finally allows developers to build ASTs from C++ sources (until now, there were no good free parsers for C++ available). – Konrad Rudolphclang_complete
recently? It can uselibclang
with caching now and thus should be faster. – Jan Larresformatted like this
.) – Konrad Rudolph