为Eclipse CDT添加完整的代码自动完成功能

Eclipse CDT是个很好的C/C++ IDE,但是其编辑器却有个非常糟糕的槽点:代码自动完成只支持由‘.’、‘:’、‘>’这三个字符触发,这比大多数C/C++ IDE都差得多。这个问题很早就被提出来,并且解决的办法并不复杂,很多人都给出了解决方案,但是不知道为什么CDT的作者一直没有改进。既然原生CDT功能不足,那就自己动手,丰衣足食。

以下制作方法来源于网上素材,我在这里不过是重新整理了一遍,没啥创造性。写这篇博客不过是为了留下文字,免得以后还要改造的时候找不到相关的帖子了。

1、首先要下载eclipse插件开发环境,在eclipse官网下载Eclipse for RCP and RAP Developpers:

为Eclipse CDT添加完整的代码自动完成功能_第1张图片

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之类。

CDT的URL

4、回车之后,对话框下方会列出可用的组件,勾选CDT Main Features和CDT Optional Features两个组件:

为Eclipse CDT添加完整的代码自动完成功能_第2张图片 勾选CDT组件

5、点击“Next”按钮后,eclipse会加载勾选的CDT组件。

6、等组件下载完成后,选择Window菜单中的Show View子菜单中的Plug-Ins菜单项:

为Eclipse CDT添加完整的代码自动完成功能_第3张图片

7、在左侧的plug-ins列表中找到org.eclipse.cdt.ui:

为Eclipse CDT添加完整的代码自动完成功能_第4张图片

8、鼠标右击org.eclipse.cdt.ui插件,在弹出菜单中选择“import as ...”子菜单的Source Project菜单项,将CDT插件源代码导入到当前工作台中:

为Eclipse CDT添加完整的代码自动完成功能_第5张图片

9、切换到左侧的Project Explorer界面,在src文件夹下找到org.eclipse.cdt.internal.ui.text.contentassist包:

为Eclipse CDT添加完整的代码自动完成功能_第6张图片 org.eclipse.cdt.internal.ui.text.contentassist包

为Eclipse CDT添加完整的代码自动完成功能_第7张图片

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 ...”:

为Eclipse CDT添加完整的代码自动完成功能_第8张图片

13、在弹出对话框中选择JAR File:

为Eclipse CDT添加完整的代码自动完成功能_第9张图片

为Eclipse CDT添加完整的代码自动完成功能_第10张图片

为Eclipse CDT添加完整的代码自动完成功能_第11张图片

为Eclipse CDT添加完整的代码自动完成功能_第12张图片

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、展示效果:

为Eclipse CDT添加完整的代码自动完成功能_第13张图片 最终效果

 

你可能感兴趣的:(CDT,Eclipse,插件)