CEDET's smart code completion, is sometimes known as "Intellisense". The CEDET infrastructure for parsing and tagging files, and analyzing source code is one of the most accurate completion tools for C++ anywhere. It will correctly handle inheritance scoping rules, templates, smart-pointers, and automatically filters based on what the value will be assigned into.
Code completion is not restricted to just C or C++. The completion engine is generic and works for any language that has a robust tagging parser written for CEDET, and a thin adaptation layer for the language.
In addition, the same engine used for smart completion enables smart function prototype help which will correctly display a prototype for the method of the correct class you are working with. It also enables you to jump to the correct declaration of what is referenced under point.
The image to the right shows smart completion configured to use
tooltips in a CEDET unit test source file going through a templated
Emacs has many pre-existing completion systems. One of the most popular kinds is sometimes known as "dabbrev", or Dynamic Abbreviations. This works by looking at the text prefix, and then snooping around for similar text to guess what you might be typing. Dabbrevs might be considered "clever", but not smart.
For CEDET, the smart completion engine is in a subsystem called Semantic. Semantic is a tool that starts with lexical and syntactic analysis and builds up to a code analyzer that can resolve completions from a an incomplete code fragment.
The smart completion in Semantic looks up your prefix in a database of all the variables, functions, and data types available to to semantic System. The scope of the code lookups is done with the EDE Project manager.
By way of example, if you start with a code snippet like this:
If the cursor is just after the M->, the first thing Semantic does is identify M as the variable of type struct Moose. The datatype Moose is then looked up in any databases available to this file. Logically, it would examine and find the Moose in the file moose.h.
Once found, all the members of Moose are examined. Since the result is being passed into q which is of type int, only things that can resolve to the same datatype are offered. That could be fields of type int, or other structures or classes that might also have ints in them.
The image below shows the smart completion engine working with Qt.
Start with the general CEDET setup. Be sure to enable both EDE, and Semantic's basic code helpers.
(load-file "~/cedet-1.0pre6/common/cedet.el") (global-ede-mode 1) ; Enable the Project management system (semantic-load-enable-code-helpers) ; Enable prototype help and smart completion
Next, you can configure one of the many smart completion tools. The engine that generates the completions list is used in a wide variety of tools within Semantic, and also externally authored.
Alex Ott has written a great article called A Gentle Introduction to CEDET that shows many different ways of enabling smart code completion.
Here are a few tools available in CEDET/Semantic for performing completion.
Start inline completion
M-x semantic-complete-analyze-inlineThis is a command that does completion inline (underlining the target symbol) and allows TAB to be used for completion purposes.
Automatically starting inline completion in idle time
This is a minor mode which runs semantic-complete-analyze-inline-idle during idle time. Instead of trying to complete the symbol immediately, it will just display the possible completions, and underline the current symbol the cursor is on.
Starting for inline completion when "." is pressed
(define-key your-mode-map-here "." 'semantic-complete-self-insert)
Binding semantic-complete-self-insert to a key will insert that key's text, as per self-insert-command, and then run the inline completion engine if there is appropriate context nearby.
Speedbar completion mode
This will start Speedbar in a special mode. In this mode it will analyze the cursor location, and provide intelligent references. Unlike inline completion, a raw list of options is provided and you just need to click on the one you want. Sometimes you need to press g to force an update.
Command based completion
The commands available (for binding to a key) are:
These commands are all very simple, and are designed as examples that a coder could examine to learn how to write their own completion interface.
Copyright(C) 1997,98,99,2000,01,02,03,04,05,06,07,08,09,10,11 Eric M. Ludlam
Verbatim copying and distribution is permitted in any medium, provided this notice is preserved.