Eclipse CDT是个很好的C/C++ IDE,但是其编辑器却有个非常糟糕的槽点:代码自动完成只支持由‘.’、‘:’、‘>’这三个字符触发,这比大多数C/C++ IDE都差得多。这个问题很早就被提出来,并且解决的办法并不复杂,很多人都给出了解决方案,但是不知道为什么CDT的作者一直没有改进。既然原生CDT功能不足,那就自己动手,丰衣足食。
以下制作方法来源于网上素材,我在这里不过是重新整理了一遍,没啥创造性。写这篇博客不过是为了留下文字,免得以后还要改造的时候找不到相关的帖子了。
1、首先要下载eclipse插件开发环境,在eclipse官网下载Eclipse for RCP and RAP Developpers:
2、解压缩并运行Eclipse for RCP and RAP;
3、执行Help菜单的Install New Software菜单项,在弹出对话框的“Work with”处填写地址:http://download.eclipse.org/tools/cdt/releases/9.10,不过,随着CDT的升级,这个地址后面的版本号可能会不同,比如可能会变为10.0、10.1之类。
4、回车之后,对话框下方会列出可用的组件,勾选CDT Main Features和CDT Optional Features两个组件:
5、点击“Next”按钮后,eclipse会加载勾选的CDT组件。
6、等组件下载完成后,选择Window菜单中的Show View子菜单中的Plug-Ins菜单项:
7、在左侧的plug-ins列表中找到org.eclipse.cdt.ui:
8、鼠标右击org.eclipse.cdt.ui插件,在弹出菜单中选择“import as ...”子菜单的Source Project菜单项,将CDT插件源代码导入到当前工作台中:
9、切换到左侧的Project Explorer界面,在src文件夹下找到org.eclipse.cdt.internal.ui.text.contentassist包:
10、打开org.eclipse.cdt.internal.ui.text.contentassist包里面的CContentAssistProcessor.java,找到protected boolean verifyAutoActivation(ITextViewer viewer, int offset)函数,做如下修改:
@Override
protected boolean verifyAutoActivation(ITextViewer viewer, int offset) {
IDocument doc = viewer.getDocument();
if (doc == null) {
return false;
}
if (offset <= 0) {
return false;
}
try {
char activationChar = doc.getChar(--offset);
switch (activationChar) {
case ':':
return offset > 0 && doc.getChar(--offset) == ':';
case '>':
return offset > 0 && doc.getChar(--offset) == '-';
case '.':
// Avoid completion of float literals
CHeuristicScanner scanner = new CHeuristicScanner(doc);
int token = scanner.previousToken(--offset, Math.max(0, offset - 200));
// The scanner reports numbers as identifiers
if (token == Symbols.TokenIDENT
&& !Character.isJavaIdentifierStart(doc.getChar(scanner.getPosition() + 1))) {
// Not a valid identifier
return false;
}
return true;
default:
// return ((activationChar >= 97) && (activationChar <= 122)) ? true : (activationChar >= 65 && activationChar <= 90);
return Character.isAlphabetic(activationChar);
}
} catch (BadLocationException e) {
}
return false;
}
上述代码是在原本代码的switch块中加了default分支,用于对“:>.”之外的字符进行处理。
11、打开org.eclipse.cdt.internal.ui.text.contentassist包里面的ContentAssistProcessor.java,找到public void setCompletionProposalAutoActivationCharacters(char[] activationSet)函数,做如下修改:
public void setCompletionProposalAutoActivationCharacters(char[] activationSet) {
// fCompletionAutoActivationCharacters = activationSet;
String myActivationSet = ".:>ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
char[] triggers = myActivationSet.toCharArray();
fCompletionAutoActivationCharacters = triggers;
}
这一处修改是重新定义了触发自动完成功能的字符序列,新的字符序列由myActivationSet定义。
至此,代码修改工作已经完成,接下来就是编译和打包导出。
12、鼠标右击org.eclipse.cdt.ui,在弹出菜单中选择“Export ...”:
13、在弹出对话框中选择JAR File:
14、点击finish按钮后,即可生成修改版的org.eclipse.cdt.ui.v.vv.xxxxxxxxxxxx.jar插件包(其中v.vv.xxxxxxxxxxxx是插件的版本号,跟当时下载的CDT插件版本有关),用这个插件包替换掉原生版的org.eclipse.cdt.ui.v.vv.xxxxxxxxxxxx.jar文件即可。需要注意的是,原生版CDT的jar文件的版本号可能跟修改所用的CDT代码版本号不同,只需要把修改后的jar软件版本号重命名为原生版cdt.ui插件版本号即可。
15、展示效果: