好友
阅读权限20
听众
最后登录1970-1-1
|
本帖最后由 MedusaSTears 于 2018-11-6 13:59 编辑
如果发错区,还请版主谅解,帮忙移动一下,谢谢
版权声明:尊重原作者劳动,转载请标明出处 https://blog.csdn.net/MedusaSTears/article/details/80357073
原帖:
Eclipse代码补全优化:Enter回车补全;Ctrl+Enter覆盖补全;Tab下移候选;Shift+Tab上移候选;ESC和SPACE取消提示,退格、句号、括号、分号、等号、不会上屏保留原按键值
我在CSDN上发过,这里算是自己转自己的帖子吧,下面说一下主要功能:
Eclipse作为开发常用工具,比较不爽的就是代码自动提示和补全的对话框了,网上也有教如何让所有按钮都触发代码提示功能,就是把触发指令改成
.abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVW
大部分程序员按照修改后就很满意了,感觉很不错,但是我发现相继来了另外的问题:
1.提示框出来后,如果按了 句号(点) 括号( 分号; 等号= 会直接把当前已经弹出的代码候选词上屏,反而这个我们不需要,每次需要删除很麻烦
2.即便问题1你选择了ESC解决问题,无非习惯就好了也可以,但是默认的代码提示框是没有快捷选词方式的,没有12345直接选择,而是只能鼠标点选或者↑↓移动后回车,这个操作无疑增加了打代码的时间,降低了效率
3.网上大部分的修改方式,都是把TAB改车默认候选词上屏,也有很多人使用,但是我还是用不惯,因为如果是2345非首位的候选词,还是得按照问题2的操作弄,很麻烦
4.于是本人参考问题3中的"大部分人的修改方式",对应找到org.eclipse.jface.text这个jar包的源码,仔细通读了相应方法之后,
"独自原创"修改了下面的代码,"并未转载任何人,全网唯一".
当然了思路还是有借鉴,毕竟我这种初学者不可能一下就知道org.eclipse.jface.text这个jar包就是对应eclipse候选词相关的jar包.
于是为了"提高编程效率",更加"智能化,高效的"用eclipse打出对应的代码,我做了以下修改:
一、修改代码助手触发器为全按键触发:
1.文件Files → 导出Export → 常规General → 首选项Preference
=> 下一步
=> 全部导出 → 浏览(你要导出到哪里,放桌面就行,一会用)
=> 完成
2.用记事本打开导出的epf文件,找到下面对应的代码,并修改成我这个样子的:
[HTML] 纯文本查看 复制代码
/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$([{
3.步骤1里相反的操作,导入epf:
文件Files → 导入Import → 常规General → 首选项Preference → 浏览 → 打开桌面修改后的文件 → 完成
完成这几步,就实现了打代码时,不论你按哪个按钮,都会弹出代码提示框
二、Eclipse代码补全优化:Enter回车补全;Ctrl+Enter覆盖补全;Tab下移候选;Shift+Tab上移候选;ESC和SPACE关闭候选词提示框,退格、句号、括号、分号、等号、不会上屏保留原按键值
1.前提:手动修改必须是带有SDK版本的Eclipse,这里附上下载地址:
http://archive.eclipse.org/eclipse/downloads/
这个就是带有Eclipse源码的版本.有人问这个和普通的有什么区别? 区别就是:在这下载的Eclipse,导出的Eclipse关键必备型的Plugins,可以导入源码工程,就是Eclipse运行的时候,必备的基础jar包,它对应的源码文件.
我这么说有些拗口,下面会具体解释
2.在视图窗口,打开Plugins的视图
窗口Windows → 显示视图Show View → 其他Other
=> 插件开发 → 插件Plug-ins
=> 找到这个文件: org.eclipse.jface.text_xxxxxxxx.jar 下划线后边是版本号,不同版本的Eclipse只有xxxxx不一样
Eclipse Mars.2 4.5.2版本的 叫做 org.eclipse.jface.text_3.10.0.v20150603-1752.jar
Eclipse Photon 4.8版本的叫做 org.eclipse.jface.text_3.13.0.v20180527-1819.jar
=> 鼠标右键 → Import导入 → Source Project源项目
=> 在项目资源管理器/包资源管理器 找到刚才导入的项目 org.eclipse.jface.text
=> 找到打开这个:org.eclipse.jface.text\src\org\eclipse\jface\text\contentassist\CompletionProposalPopup.java
=> 用搜索Ctrl+F 跳转到方法 verifyKey (搜索 public boolean verifyKey(VerifyEvent e) )
=> 按照我这个代码修改这个方法,相关的我都写到注释里了
这里解释一下步骤1的那个问题:
如果不是SDK版本,是找不到org.eclipse.jface.text的源码的,也就没办法修改和生成新的org.eclipse.jface.text.jar这个文件.
网上很多教程都只是千篇一律的"直接导出",
可是对于找不到或者无法导出的都没有作解释,大家都不知道为什么.
我估计大部分也都是人云亦云,自己也没有真正搞清楚吧
主要是key==0和key!=0的两种情况下
都要把tab和shift+tab的写进去
而且要把获取焦点事件屏蔽掉.最开始我没屏蔽,反而按两次tab都是获取焦点,
而这恰恰也让我意识到,是获取焦点在下移之前拦截了事件
[Java] 纯文本查看 复制代码
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;
}
由于版主说不让用CSDN的链接,
所以各位自己动手修改吧,不再提供下载地址
|
免费评分
-
查看全部评分
|