Intellij IDEA CodeReview插件开发1:理论篇

IntelliJ Platform SDK

可以让我们开发插件,定制IDE,例如支持特定的语言

插件

在IntelliJ平台上构建的产品是可组合的应用程序,插件可以通过多种方式扩展平台,从添加简单的菜单项到添加对完整语言,构建系统和调试器的支持。

分类

  • 自定义语言支持 (Kotlin)
  • 框架集成 (Spring)
  • 工具集成 (DBHelper)
  • 用户界面加载项(背景图片插件)

结构

  1. 组成部分
.IntelliJIDEAx0/
  plugins/
    sample.jar/
      com/foo/...
      ...
      ...
      META-INF/
        plugin.xml
        pluginIcon.svg
        pluginIcon_dark.svg

jar包+plugin.xml+图标
plugin.xml

  • 依赖于一个或多个其他插件

<idea-plugin url="http://www.jetbrains.com/idea">

  
  <name>VssIntegrationname>

  
  <id>VssIntegrationid>

  
  <description>Vss integration plugindescription>

  
  <change-notes>Initial release of the plugin.change-notes>

  
  <version>1.0version>

  
  <vendor url="http://www.jetbrains.com" email="[email protected]" />

  
  <depends>MyFirstPlugindepends>

  
  <depends optional="true" config-file="mysecondplugin.xml">MySecondPlugindepends>

  
  <helpset file="myhelp.jar" path="/Help.hs" />

  
  <idea-version since-build="3000" until-build="3999"/>

  
  <resource-bundle>messages.MyPluginBundleresource-bundle>

  
  <application-components>
    <component>
      
      <interface-class>com.foo.Component1Interfaceinterface-class>

      
      <implementation-class>com.foo.impl.Component1Implimplementation-class>
    component>
  application-components>

  
  <project-components>
    <component>
      
      <interface-class>com.foo.Component2interface-class>

      
      <option name="workspace" value="true" />

      
      <loadForDefaultProject>
    component>
  project-components>

  
  <module-components>
    <component>
      <interface-class>com.foo.Component3interface-class>
    component>
  module-components>

  
  <actions>
    <action id="VssIntegration.GarbageCollection" class="com.foo.impl.CollectGarbage" text="Collect _Garbage" description="Run garbage collector">
      <keyboard-shortcut first-keystroke="control alt G" second-keystroke="C" keymap="$default"/>
    action>
  actions>

  
  <extensionPoints>
    <extensionPoint name="testExtensionPoint" beanClass="com.foo.impl.MyExtensionBean"/>
  extensionPoints>

  
  <extensions xmlns="VssIntegration">
    <testExtensionPoint implementation="com.foo.impl.MyExtensionImpl"/>
  extensions>
idea-plugin>
  1. 组件
    分层
  • 应用层
  • 项目层
  • 模块层

常见组件

  • Menus and toolbars
  • Tool Windows
  • Dialogs
  • Popups
  • Notifications
  • File and Class Choosers
  • Editor Components
  • List and Tree Controls
  • Miscellaneous Swing Components
  1. 扩展
    如果您希望插件扩展其他插件或IntelliJ平台的功能,则必须声明一个或多个扩展。
    <extensions defaultExtensionNs="com.intellij">
        <toolWindow canCloseContents="true" anchor="bottom"
                    id="CodeReview"
                    factoryClass="org.codereview.gui.CodeReviewToolWindow">
        toolWindow>
    extensions>

平台基础

Action动作

    <actions>
        <action id="ReviewAction" class="org.codereview.action.ReviewAction" text="CodeReview"
                description="CodeReview">
            <add-to-group group-id="EditorPopupMenu" anchor="first"/>
            <keyboard-shortcut keymap="$default" first-keystroke="ctrl alt Q"/>
        action>
    actions>

开发步骤
a. 创建Action extends AnAction
b. 重写actionPerformed方法
c. 在plugin.xml中注册,包括分组配置
d. 设置可见性和能动性
e. 测试功能

文件

  • Virtual File System
    虚拟文件系统(VFS)是IntelliJ Platform的一个组件,它封装了用于处理文件的大部分活动。 它有以下主要用途:
    • 提供用于处理文件的通用API,无论其实际位置如何(在磁盘上,存档中,在HTTP服务器上等)
    • 在检测到修改时跟踪文件修改并提供文件内容的新旧版本。
      提供将附加持久数据与VFS中的文件相关联的可能性。
  • Virtual File
    • 我如何获得虚拟文件?

      • 来自一个动作:e.getData(PlatformDataKeys.VIRTUAL_FILE)如果您对多项选择感兴趣,还可以使用e.getData(PlatformDataKeys.VIRTUAL_FILE_ARRAY)
      • 从本地文件系统中的路径:LocalFileSystem.getInstance()findFileByIoFile()
      • 从PSI文件:psiFile.getVirtualFile()(如果PSI文件仅存在于内存中,则可能返回null)
      • 从文档:FileDocumentManager.getInstance()。getFile()
    • 我该怎么办?
      可以使用典型的文件操作,例如遍历文件系统,获取文件内容,重命名,移动或删除。应使用VfsUtilCore.iterateChildrenRecursively执行递归迭代,以防止由递归符号链接引起的无限循环。

    • 它从何而来?
      通过从项目根目录开始上下扫描文件系统,可以逐步构建VFS。 VFS刷新检测到文件系统中出现的新文件。可以使用(VirtualFileManager.getInstance()refresh()VirtualFile.refresh())以编程方式启动刷新操作。每当文件系统观察者收到文件系统更改通知时(Windows和Mac操作系统上都可用),也会触发VFS刷新。
      作为插件开发人员,如果需要访问刚通过IntelliJ Platform API由外部工具创建的文件,则可能需要调用VFS刷新。

文档

  • 我如何获得文件?
    - 来自一个动作:e.getData(PlatformDataKeys.EDITOR).getDocument()
    - 从虚拟文件:FileDocumentManager.getDocument()。 如果之前未加载文档内容,则此调用会强制从磁盘加载文档内容; 如果您只对打开的文档或可能已修改的文档感兴趣,请改用FileDocumentManager.getCachedDocument()
    - 从PSI文件:PsiDocumentManager.getInstance()getDocument()PsiDocumentManager.getInstance()getCachedDocument()
    • 我可以用文件做什么?
      • 您可以执行在“纯文本”级别上访问或修改文件内容的任何操作(作为字符序列,而不是Java元素树)。

编辑器

获得final Editor editor = e.getData(CommonDataKeys.EDITOR);
坐标系

  • Logical position ignore folding
  • Visual position take folding into account

事件

  • TypedActionHandler
    TypedActionHandler接口旨在实现对编辑器中键入的键的自定义处理。
  • EditorActionHandler
    EditorActionHandler.java用于编辑器中按键激活的操作

参考:
sdk-docs on github

你可能感兴趣的:(java)