向给我思路的原帖表示敬意:
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$([{