吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 11372|回复: 22
收起左侧

[原创工具] Eclipse代码补全优化,自动提示优化上屏,用后包你爱不释手org.eclipse.jface.text修改

  [复制链接]
MedusaSTears 发表于 2018-10-26 14:59
本帖最后由 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的链接,
所以各位自己动手修改吧,不再提供下载地址



免费评分

参与人数 3吾爱币 +2 热心值 +3 收起 理由
scry + 1 + 1 谢谢@Thanks!
950117 + 1 谢谢@Thanks!
xh0909 + 1 + 1 我很赞同!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

 楼主| MedusaSTears 发表于 2018-10-26 15:13
oushiran 发表于 2018-10-26 15:08
嘿嘿,以前从.net开始玩JAVA 刚接触eclipse的时候也是各种不习惯,使用这个东西。后来发现IDEA可能比较好用 ...

还没用过IDEA呢,真打算想尝试,不过工作什么的都用这个eclipse,初学者一枚,以后肯定会接触到的
a1533675 发表于 2018-10-30 10:25
MedusaSTears 发表于 2018-10-26 16:27
我看idea安装包不大啊,为啥拖不起?

IDEA就是比较卡,可能运行机制不一样?配置高的电脑可能感觉不出来,配置低的电脑明显感觉没有Eclipse快
oushiran 发表于 2018-10-26 15:08
嘿嘿,以前从.net开始玩JAVA 刚接触eclipse的时候也是各种不习惯,使用这个东西。后来发现IDEA可能比较好用一点
NOOB 发表于 2018-10-26 15:40
我用idea
tfbyly 发表于 2018-10-26 16:02
公司电脑拖不起idea 不得已用回eclipse
SGC沉默 发表于 2018-10-26 16:10
多年老鸟不建议新手对eclipse做修改
 楼主| MedusaSTears 发表于 2018-10-26 16:27
tfbyly 发表于 2018-10-26 16:02
公司电脑拖不起idea 不得已用回eclipse

我看idea安装包不大啊,为啥拖不起?
 楼主| MedusaSTears 发表于 2018-10-26 16:28
SGC沉默 发表于 2018-10-26 16:10
多年老鸟不建议新手对eclipse做修改

因为?怕代码全称记不住是么?
巨无霸 发表于 2018-10-26 17:13
MyEclipse用习惯了,想换idea,但又怕用不习惯!
ddian 发表于 2018-10-26 18:04
程序猿 利器
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-25 21:53

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表