Eclipse代码补全优化:Enter回车补全;Ctrl+Enter覆盖补全;Tab下移候选;Shift+Tab上移候选;ESC和SPACE取消提示,退格、句号、括号、分号、等号、不会上屏保留原按键值

向给我思路的原帖表示敬意:

https://www.cnblogs.com/scue/archive/2013/09/13/3320365.html

2018.10.26亲测把代码直接覆盖到eclipse4.8版本的jface文件里对应的方法后,直接就可以用了,不需要费心自己动手修改了,对于仍不想打包解包plugin的童鞋,我还是传一份到CSDN上吧,直接覆盖就可以了

这是MARS.2的4.5.2版本的代码提示文件:

https://download.csdn.net/download/medusastears/10421871

这是Eclipse 4.8 Photon的代码提示文件:

https://download.csdn.net/download/medusastears/10745848

 

_________________原帖:____________________________

仅适用于下面说的这个文件,且Eclipse版本为MARS.2的4.5.2版本

org.eclipse.jface.text_3.10.0.v20150603-1752.jar

如果看懂的童鞋可以按照代码自行修改

测试的结果是,直接复制我那个方法,覆盖掉原来的就可以了,如果下载我修改好的,请对应好文件名

 

以下代码重新复写该方法,本帖只做记录,能看懂的就拿去用吧,看不懂的也没办法了

我也是读了好半天才搞懂了这个逻辑

主要是key==0和key!=0的两种情况下

都要把tab和shift+tab的写进去

而且要把获取焦点事件屏蔽掉.最开始我没屏蔽,反而按两次tab都是获取焦点,

而这恰恰也让我意识到,是获取焦点在下移之前拦截了事件

 

在导入工程下的org.eclipse.jface.text/src/org/eclipse/jface/text/contentassist/CompletionProposalPopup.java

“org.eclipse.jface.text.contentassist.CompletionProposalPopup#verifyKey()”的函数,直接修改为如下内容:

public boolean verifyKey(VerifyEvent e) {
//修改排序,这里提前声明局部变量为成员变量,目的是令TAB和SHIFT+TAB可以直接用该变量
	int newSelection = fProposalTable.getSelectionIndex();
	int visibleRows = (fProposalTable.getSize().y / fProposalTable.getItemHeight()) - 1;
	int itemCount = fProposalTable.getItemCount();
	char key = e.character;

	if (!Helper.okToUse( fProposalShell )) {
		return true;
	}
	
//key==0 意思就是当你什么也没按,而且候选框出来的时候,怎么办
	if (key == 0) {
//todo ↓↓↓↓	添加Shift + Tab向上选择	↓↓↓↓
		if ((e.stateMask == SWT.SHIFT) && (e.keyCode == SWT.TAB)) {
			newSelection -= 1;
			if (newSelection < 0) {
				newSelection = itemCount - 1;
			}
			
			selectProposal( newSelection, (e.stateMask & SWT.CTRL) != 0 );
			e.doit = false;
			return false;
		}
// ↑↑↑↑	添加Shift + Tab向上选择	 ↑↑↑↑
		
//todo ↓↓↓↓	添加tab键向下移动	↓↓↓↓
		if (e.keyCode == SWT.TAB) {
			newSelection += 1;
			if (newSelection > itemCount - 1) {
				newSelection = 0;
			}
			
			selectProposal( newSelection, (e.stateMask & SWT.CTRL) != 0 );
			e.doit = false;
			return false;
		}
// ↑↑↑↑	添加tab键向下移动	 ↑↑↑↑
		
		switch (e.keyCode) {
		case SWT.ARROW_LEFT:
		case SWT.ARROW_RIGHT:
			filterProposals();
			return true;

		case SWT.ARROW_UP:
			newSelection -= 1;
			if (newSelection < 0) {
				newSelection = itemCount - 1;
			}
			break;
							
		case SWT.ARROW_DOWN:
			newSelection += 1;
			if (newSelection > itemCount - 1) {
				newSelection = 0;
			}
			break;

		case SWT.PAGE_DOWN:
			newSelection += visibleRows;
			if (newSelection >= itemCount) {
				newSelection = itemCount - 1;
			}
			break;

		case SWT.PAGE_UP:
			newSelection -= visibleRows;
			if (newSelection < 0) {
				newSelection = 0;
			}
			break;

		case SWT.HOME:
			newSelection = 0;
			break;

		case SWT.END:
			newSelection = itemCount - 1;
			break;

		default:	//默认大小写锁定键,control键,shift键,alt键,COMMAND键都是隐藏候选框
			if (e.keyCode != SWT.CAPS_LOCK && e.keyCode != SWT.MOD1 && e.keyCode != SWT.MOD2 && e.keyCode != SWT.MOD3 && e.keyCode != SWT.MOD4) {
				hide();
			}
			return true;
		}

		selectProposal( newSelection, (e.stateMask & SWT.CTRL) != 0 );
		e.doit = false;
		return false;
	}

	/* key != 0	也就是当前候选框在,而且你按下某个按钮的时候,应该如何处理
	这里多说两句,如果return false,就是该按钮不执行它本身的动能,有点像disable的感觉(这纯是我的个人猜测,佐证就是英文句号'.'return true之后不影响候选框了)*/
/*		TODO		这里注释的是一些常用按钮的ASCII码,下边有可能用到
 		0x09 TAB 键
		0x08 BACKSPACE 键
		0x10 SHIFT 键
		0xA2 左ctrl
		0xA3 右ctlr
		0xA4 左Alt
		0xA5 右Alt
		0x1B ESC 键
		0x2E DELETE 键
		0x12 ALT 键
		0x11 CTRL 键
		0xD ENTER 键
		0x71 F2 键
		0xA	ctrl+enter 好像10进制是 131085 吧? 
*/
//todo ↓↓↓↓	添加Shift + Tab向上选择	↓↓↓↓ 【和上边14行重复代码,不可省略】
	if ((e.stateMask == SWT.SHIFT) && (e.keyCode == SWT.TAB)) {
		newSelection -= 1;
		if (newSelection < 0) {
			newSelection = itemCount - 1;
		}

		selectProposal( newSelection, (e.stateMask & SWT.CTRL) != 0 );
		e.doit = false;
		return false;
	}
// ↑↑↑↑	添加Shift + Tab向上选择	 ↑↑↑↑【和上边重复代码,不可省略】
	
//todo ↓↓↓↓	添加tab键向下移动	↓↓↓↓【和上边27行重复代码,不可省略】
	if (e.keyCode == SWT.TAB) {
		newSelection += 1;
		if (newSelection > itemCount - 1) {
			newSelection = 0;
		}
		selectProposal( newSelection, (e.stateMask & SWT.CTRL) != 0 );
		e.doit = false;
		return false;
	}
// ↑↑↑↑	添加tab键向下移动	 ↑↑↑↑【和上边重复代码,不可省略】
			
	switch (key) {
		//todo ↓↓↓↓	这里是按哪些按钮会打断提示框,而不是默认第一条上屏	↓↓↓↓
		case 0x1B: // Esc
		case ' ': // 空格
			e.doit = false;
			hide();
			break;
		//↑↑↑↑	这里是按哪些按钮会打断提示框,而不是默认第一条上屏	↑↑↑↑
			
		//↓↓↓↓	这里按钮是 按了不会影响候选框的显示,所有按钮保留自己的输出值	↓↓↓↓
		case ';': // 分号
		case '=': // 等号
		case '\\':	//反斜杠
		case '/':	//斜杠
		case '\'':	//单引号
		case '`':	//反引号
		case '.':	//英文句号,点
		case '(':	// 左括号
		case ')':	// 右括号
		case '[':	//左中括号
		case ']':	//右中括号
		case '{':	//左花括号
		case '}':	//右花括号
		case 0x08: // Backspace
			return true;
		//↑↑↑↑	这里按钮是 按了不会影响候选框的显示,所有按钮保留自己的输出值	↑↑↑↑

		//↓↓↓↓	这里添加的是  第一条/被选中的候选项  直接上屏的按钮	↓↓↓↓
		case '\n': // Ctrl-Enter on w2k 	默认ctrl+enter是替换存在的后边文字
		case '\r': // Enter 0xD			默认enter是插入候选框文字,后边的文字保留
			e.doit = false;
			insertSelectedProposalWithMask( e.stateMask );
			break;
		//↑↑↑↑	这里添加的是  第一条/被选中的候选项  直接上屏的按钮	↑↑↑↑

		/*↓↓↓↓ 这里是提示框获取焦点的方法
			//case '\t': 	//tab键获取焦点
				e.doit = false;
				fProposalShell.setFocus();
				return false;
		↑↑↑↑里是提示框获取焦点的方法*/
		
	default:
		ICompletionProposal p = getSelectedProposal();
		if (p instanceof ICompletionProposalExtension) {
			ICompletionProposalExtension t = (ICompletionProposalExtension) p;
			char[] triggers = t.getTriggerCharacters();
			if (contains( triggers, key )) {
				e.doit = false;
				hide();
				insertProposal( p, key, e.stateMask, fContentAssistSubjectControlAdapter.getSelectedRange().x );
			}
		}
	}
	return true;
}

 

 

在此再添加上修改的首选项里的触发配置:

方法我再啰嗦一下吧,先把assist改成@@@@@@

然后export导出首选项

然后用记事本打开

把@@@@@的所在行,改成我下边对应的代码段

/instance/org.eclipse.wst.jsdt.ui/content_assist_autoactivation_triggers_java=.abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVW

/instance/org.eclipse.jdt.ui/content_assist_autoactivation_triggers_java=.abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVW

/instance/org.eclipse.wst.css.ui/autoProposeCode=<\=.\:abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVW$([{

/instance/org.eclipse.wst.html.ui/autoProposeCode=<\=.\:abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVW$([{

/instance/org.eclipse.wst.xml.ui/autoProposeCode=<\=.\:abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVW$([{

 

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值