为Eclipse CDT添加自动代码提示功能
1.前言
在使用Eclipse CDT的过程中,如果要使用代码提示功能,有2种方法:
- 设置触发字符,输入这些字符后会自动触发代码提示
- 使用快捷键 ALT+/,手动触发该功能
方法1的设置方法如下图,可以设置 . -> :: 三种触发类型。
但是对于其他C/C++好用的IDE,这种方式显然有点弱,那么如何将它改造成全自动提示呢?
方法是修改CDT。。。
2.CDT开发环境搭建
本文的开发环境是Manjaro,需要安装git,maven
yay -S git yay -S maven
git clone https://github.com/eclipse-cdt/cdt.git
git checkout CDT_9_7_0
cd cdt
mvn package
然后经过几十分钟的构建,可以编译成功。
下载Eclipse Committers:https://www.eclipse.org/downloads/packages/release/2019-03/r/eclipse-ide-eclipse-committers
下载完成,打开菜单 Help -> Install New Software,然后如图安装新组件:
将CDT目录导入到Eclipse中,将所有包全部导入
找到org.eclipse.cdt.target这个包,打开其中的cdt.target,右上角点击Set As Active Target Platform
同样打开cdt-baseline.target并点击
然后等待好久,等联网下载完成
点击菜单Project -> Build All
右键选择org.eclipse.cdt.ui这个包,右键菜单Run As Eclipse Application
不出意外,新的Eclipse就会打开,原Eclipse的下方Console窗口打印新Eclipse的log输出
至此,CDT开发环境搭建完成
3.代码修改
接下来到了激动人心的时刻,修改代码使其达到我们想要的功能dsa
首先打开 cdt/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/contentassist/CContentAssistProcessor.java ,找到verifyAutoActivation方法,按照下面修改,添加2行:
这个方法的功能是判断当前位置的字符是否可以触发自动提示,default分之的加入是为了处理我们的场景,Character.isAlphabetic过滤到非a-z A-Z的字符
@Override protected boolean verifyAutoActivation(ITextViewer viewer, int offset) { IDocument doc = viewer.getDocument(); System.out.println("verifyAutoActivation"); 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; //add start default: return Character.isAlphabetic(activationChar); //add end } } catch (org.eclipse.jface.text.BadLocationException e) { } return false; } }
找到setCompletionProposalAutoActivationCharacters方法,按照下面修改:
这里的修改是为了加上字母触发代码提示
public void setCompletionProposalAutoActivationCharacters(char[] activationSet) { String myAddCharacters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; //$NON-NLS-1$ myAddCharacters += new String(activationSet); fCompletionAutoActivationCharacters = myAddCharacters.toCharArray(); //fCompletionAutoActivationCharacters = activationSet; }
至此修改完毕,右键选择org.eclipse.cdt.ui这个包,右键菜单Run As Eclipse Application,试验一下,发现已经可以了
4.效果展示
5.插件打包
右键选择org.eclipse.cdt.ui这个包,右键菜单Deployable Plug-ins and fragments
选择导出目录,点击Finish
在导出目录的plugins子目录可以找到jar,
在eclipse/plugins中有一个org.eclipse.cdt.ui_6.4.100.*****.jar,记录该文件名并备份,然后把新的jar拷贝过来并改名,大功告成!
如果到了目标eclipse环境还是不能使用的情况,推测原因可能是版本不配套,此时可能需要导出org.eclipse.jface.text
首先是导入这个包 Window -> Show View -> Other ->Plug-ins,
在Plug-ins窗口选中org.eclipse.jface.text,右键Import As -> Source Project
然后和上面那个一样的方法,导出jar,拷贝到目标eclipse环境中