PhpStorm 插件开发

Phpstorm 的内核其实是:IntelliJ IDEA。隶属于同一个软件公司,所以要开发Phpstorm插件的话,还是得需要IntelliJ IDEA。其实jetbrains开发的ide都可以用IntelliJ IDEA来开发插件。


IntelliJ IDEA:http://www.jetbrains.com/idea/download/

开发文档:http://www.jetbrains.org/intellij/sdk/docs/welcome.html

官网步骤:http://www.jetbrains.org/intellij/sdk/docs/phpstorm/setting_up_environment.html



创建工程的时候选择:intellij platform plugin ,在project sdk的时候选择 intellij idea iu 具体的版本号可以按你电脑里安装的为准。


屏幕快照 2018-09-03 下午9.50.20.png


Next后会出现一个空的工程结构界面,并且会帮你打开plugin.xml描述文件。


屏幕快照 2018-09-03 下午9.52.45.png


<idea-plugin>
  <id>com.your.company.unique.plugin.id</id>
  <name>Plugin display name here</name>
  <version>1.0</version>
  <vendor email="support@yourcompany.com" url="http://www.yourcompany.com">YourCompany</vendor>
  <description><![CDATA[
      Enter short description for your plugin here.<br>
      <em>most HTML tags may be used</em>
    ]]></description>
  <change-notes><![CDATA[
      Add change notes here.<br>
      <em>most HTML tags may be used</em>
    ]]>
  </change-notes>
  <!-- please see http://www.jetbrains.org/intellij/sdk/docs/basics/getting_started/build_number_ranges.html for description -->
  <idea-version since-build="173.0"/>
  <!-- please see http://www.jetbrains.org/intellij/sdk/docs/basics/getting_started/plugin_compatibility.html
       on how to target different products -->
  <!-- uncomment to enable plugin in all products
  <depends>com.intellij.modules.lang</depends>
  -->
  <extensions defaultExtensionNs="com.intellij">
    <!-- Add your extensions here -->
  </extensions>
  <actions>
    <!-- Add your actions here -->
  </actions>
</idea-plugin>


在上面补充如下代码:

<depends>com.jetbrains.php</depends>
<depends>com.intellij.modules.platform</depends>


注意第二行的id。这里面要填写你的实际包名。如果这个填不对的话,插件是不被ide识别的。其余的可以参考节点名来编写。


点击文件(File)-> Project Structure ->libraries  点击+号,然后选择 java  这里要添加两个文件,这两个文件在phpstorm的安装目录下的plugins里的php目录然后lib目录里。从这个目录结构也可以看出,你编写的插件也可以这样放:plugins/xxx(这个名字你自己取)/lib/目录下。


言归正传,打开plugins/php/lib你会看到几个jar。选择:php.jar 和 php-openapi.jar。这两个就好了。


屏幕快照 2018-09-03 下午10.02.50.png


再次打开Modules-dependencies。然后将compile改为provided。


屏幕快照 2018-09-03 下午10.04.09.png


在你的工程目录下的src右键选择创建一个包


屏幕快照 2018-09-03 下午10.05.08.png

还记得上面提到的id吗?那个id就填写这个包名。这个包名建议格式:com.xxx。例如 com.myplug。这样的话,你的plugin.xml的描述文件里的第二行id也要填写这个。


下面我们来创建一个action。


屏幕快照 2018-09-03 下午10.07.58.png


如下填写


屏幕快照 2018-09-03 下午10.10.32.png


第一个是你的id或者说你的包名

第二个是你的实现类名

第三个是你右键的提示文本

第四个是你的描述文本


由于groups选择的事editorpopupmenu 所以只会在代码编辑区域右键才会弹出这个菜单。下面的keyboard shortcuts是快捷键。可设置可不设置。


下面是编辑器帮你初始化的一个类,包含了一个魔术函数actionPerformed:


package com.myplug;
import com.intellij.openapi.actionSystem.AnAction;
import com.intellij.openapi.actionSystem.AnActionEvent;
public class delline extends AnAction {
    @Override
    public void actionPerformed(AnActionEvent e) {
        // TODO: insert action logic here
    }
}


actionPerformed 这个方法调用的事件是:弹出右键菜单,单击后才会调用。


下面这个例子是我写的一个删除空行的例子,仅供参考:



package com.x;
import com.intellij.codeInsight.editorActions.PasteHandler;
import com.intellij.openapi.actionSystem.AnAction;
import com.intellij.openapi.actionSystem.AnActionEvent;
import com.intellij.openapi.actionSystem.CommonDataKeys;
import com.intellij.openapi.actionSystem.IdeActions;
import com.intellij.openapi.command.WriteCommandAction;
import com.intellij.openapi.editor.*;
import com.intellij.openapi.editor.actionSystem.EditorActionHandler;
import com.intellij.openapi.editor.actionSystem.EditorActionManager;
import com.intellij.openapi.editor.actionSystem.TypedActionHandler;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.ui.Messages;
import com.intellij.openapi.ui.messages.MessagesService;
import org.apache.commons.lang.StringUtils;
import org.jetbrains.rpc.CommandProcessor;
import java.util.List;
import java.awt.*;
import java.util.ArrayList;
public class delBlankLine extends AnAction {
    @Override
    public void actionPerformed(AnActionEvent e) {
        // TODO: insert action logic here
        final Editor editor = e.getRequiredData(CommonDataKeys.EDITOR);
        CaretModel caretModel = editor.getCaretModel();
        SelectionModel selectionModel = editor.getSelectionModel();
        Document document = editor.getDocument();
        LogicalPosition logicalPosition = caretModel.getLogicalPosition(); //不带自动换行
        VisualPosition visualPosition = caretModel.getVisualPosition(); //带自动换行产生的行
        String codeText = document.getText().toString();
        String[] stringList = codeText.split("\n");
//      +"\n"+String.valueOf(logicalPosition.column)+"\n"+String.valueOf(logicalPosition.line)
        String lineText = stringList[logicalPosition.line];
        String lineTexts = lineText.replaceAll(" ", "");
        if (lineTexts.equals("")) {
             selectionModel.selectLineAtCaret(); //设置当前行选中
//            EditorActionManager actionManager = EditorActionManager.getInstance();
//            //Insert one more caret below the active caret
//            EditorActionHandler actionHandler = actionManager.getActionHandler(IdeActions.ACTION_EDITOR_DELETE_LINE);
//            actionHandler.execute(editor, caretModel.getCurrentCaret(), e.getDataContext());
            String[] d_arr = delete(logicalPosition.line, stringList);
            final Project project = e.getRequiredData(CommonDataKeys.PROJECT);
            //Access document, caret, and selection
            final int start = selectionModel.getSelectionStart();
            final int end = selectionModel.getSelectionEnd();
            //New instance of Runnable to make a replacement
            Runnable runnable = new Runnable() {
                @Override
                public void run() {
                    document.setText(arrToString(d_arr).toString());
                }
            };
            WriteCommandAction.runWriteCommandAction(project, runnable);
            selectionModel.removeSelection();
//            Messages.showMessageDialog(arrToString(stringList).toString(), "info", Messages.getInformationIcon());
        }
//        Messages.showMessageDialog(stringList[logicalPosition.line].toString(), "info", Messages.getInformationIcon());
    }
    public String[] delete(int index, String array[]) {
        List<String> list = new ArrayList<String>();
        for (int i = 0; i < array.length; i++) {
            list.add(array[i]);
        }
        list.remove(index);
        String[] newStr = list.toArray(new String[1]); //返回一个包含所有对象的指定类型的数组
        return newStr;
    }
    public String arrToString(String array[]) {
        StringBuffer s_b = new StringBuffer();
        for (int i = 0; i < array.length; i++) {
            s_b.append(array[i].toString() + "\n");
        }
        return s_b.toString();
//        return  StringUtils.join(array, "\n");
    }
}



屏幕快照 2018-09-03 下午10.18.28.png





PhpStorm 插件开发


本站如无特别说明即为原创,转而告知:(https://iwonmo.com/archives/1370.html)

标签: java, phpstorm插件编写, 插件开发, jetbrains插件

添加新评论