为Eclipse CDT添加自动代码提示功能

1.前言


 在使用Eclipse CDT的过程中,如果要使用代码提示功能,有2种方法:

  1. 设置触发字符,输入这些字符后会自动触发代码提示
  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环境

 

posted @ 2019-05-03 00:56  MateX  阅读(4323)  评论(0编辑  收藏  举报