Intellij IDEA插件

来源:互联网 发布:男人中式服装品牌知乎 编辑:程序博客网 时间:2024/05/18 02:28

以前用Eclipse的时候,有一个“Link with Editor”,即下面红色框住的图标。作用是展开当前打开的文件所在的目录树


后来转到idea以后,也有这么一个类似的图标可以点击,效果一模一样,功能名改为了“Scroll From Source”,即下面红色框住的图标。



       不过自从换了Mac以后,鼠标已经被我丢弃了,所以快捷键对我来说是越多越好。但是不幸的是,这个功能居然不能添加快捷键,这搞得我有时候得用触摸板点击,甚为不爽。而且也有几个用idea的朋友对这点吐槽多次了,所以我用了点零碎的时间看了下开发插件的过程,然后花了半个下午写了一个可以为”Scroll From Source“这个功能添加快捷键的插件。


       插件已经提交到jetbrains的官方插件库中,地址是:https://plugins.jetbrains.com/plugin/7606?pr=idea 同时我把插件的源代码也公开到了github,地址是:https://github.com/luonanqin/intellij-idea-plugins/tree/master/ScrollFromSource 因为代码很简单,所以我就顺便贴出来简单说明下

[java] view plain copy
  1. package luonq;  
  2.   
  3. import com.intellij.ide.projectView.ProjectView;  
  4. import com.intellij.ide.projectView.impl.ProjectViewImpl;  
  5. import com.intellij.openapi.actionSystem.AnAction;  
  6. import com.intellij.openapi.actionSystem.AnActionEvent;  
  7. import com.intellij.openapi.diagnostic.Logger;  
  8. import com.intellij.openapi.project.Project;  
  9.   
  10. import java.lang.reflect.Field;  
  11. import java.lang.reflect.Method;  
  12.   
  13. /** 
  14.  * Created by Luonanqin on 11/13/14. 
  15.  */  
  16. public class ScrollFromSource extends AnAction {  
  17.   
  18.     private static final Logger LOG = Logger.getInstance(ScrollFromSource.class);  
  19.   
  20.     public void actionPerformed(AnActionEvent e) {  
  21.         try {  
  22.             Project project = e.getProject();  
  23.             ProjectViewImpl projectView = (ProjectViewImpl) ProjectView.getInstance(project);  
  24.   
  25.             Class<ProjectViewImpl> clazz = ProjectViewImpl.class;  
  26.   
  27.             Field[] fields = clazz.getDeclaredFields();  
  28.             Field myAutoScrollFromSourceHandlerField = null;  
  29.             for (int i = 0; i < fields.length; i++) {  
  30.                 Field field = fields[i];  
  31.                 // can't use field's name to find the variable of MyAutoScrollFromSourceHandler  
  32.                 if ("MyAutoScrollFromSourceHandler".equals(field.getType().getSimpleName())) {  
  33.                     myAutoScrollFromSourceHandlerField = field;  
  34.                 }  
  35.             }  
  36.   
  37.             myAutoScrollFromSourceHandlerField.setAccessible(true);  
  38.             Object handler = myAutoScrollFromSourceHandlerField.get(projectView);  
  39.   
  40.             Class<?>[] clazzes = clazz.getDeclaredClasses();  
  41.             for (int i = 0; i < clazzes.length; i++) {  
  42.                 Class<?> clazze = clazzes[i];  
  43.                 String simpleName = clazze.getSimpleName();  
  44.                 if ("MyAutoScrollFromSourceHandler".equals(simpleName)) {  
  45.                     Method fromSource = clazze.getMethod("scrollFromSource");  
  46.                     fromSource.setAccessible(true);  
  47.                     fromSource.invoke(handler);  
  48.                     return;  
  49.                 }  
  50.             }  
  51.         } catch (Exception ex) {  
  52.             LOG.error("ScrollFromSource execute ERROR!", ex);  
  53.         }  
  54.     }  
  55. }  

       这个插件其实耍了个小聪明,因为我是找到了Scroll From Source的触发代码,所以用反射的办法把触发他的对象取了出来,然后再用反射的办法调用这个对象去触发Scroll From Source方法,这样就达到效果了。最后为这个AnAction配置快捷键,目标达成!!


效果图如下:






PS:目前只测试了idea的community和ultimate版本,其他平台没测试过。如果使用中有出现问题可以随时回复我。

原创粉丝点击