IntelliJ IDEA 插件自定义开发

  ### 近期突然迷上了idea 的插件自定义开发

插件可以实现哪些功能:

  • 新建自研框架模块/项目

  • 资源树

  • 代码自动生成

  • 代码Lint

  • 资源代码跳转


下面这只是个最简单的demo

新建项目

 

 

 

 这里是向我们的右键generate菜单里新增一个菜单(功能是我们自定义实现的)

 

 

 

 

import com.intellij.openapi.actionSystem.AnAction;
import com.intellij.openapi.actionSystem.AnActionEvent;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.ui.Messages;

public class ClassName extends AnAction {

@Override
public void actionPerformed(AnActionEvent e) {
  Project project = e.getProject();
   Messages.showMessageDialog(project,"hello world","hello idea",Messages.getInformationIcon());
  }
}

写完打成jar包 然后用idea 本地安装

测试

 

 

 

 


###一些简单的api使用

AnActionEvent e
// 当前项目
Project project = e.getData(PlatformDataKeys.PROJECT);
// 当前文件
PsiFile file = e.getData(CommonDataKeys.PSI_FILE);
// 当前文件路径
String classPath = file.getVirtualFile().getPath();

// 当前的方法
Editor editor = anActionEvent.getData(CommonDataKeys.EDITOR);
int offset = editor.getCaretModel().getOffset();
PsiElement element = psiFile.findElementAt(offset);
PsiMethod containingMethod = PsiTreeUtil.getParentOfType(element, PsiMethod.class);
// 当前方法所在的类
PsiClass containingClass = containingMethod.getContainingClass();
// 方法中的本地变量
containingMethod.accept(new JavaRecursiveElementVisitor() {
@Override
public void visitLocalVariable(PsiLocalVariable variable) {
super.visitLocalVariable(variable);
infoBuilder.append(variable.getName()).append("\n");
}
});

// 当前类 和 字段
PsiFile file = e.getData(CommonDataKeys.PSI_FILE);
Editor editor = e.getData(CommonDataKeys.EDITOR);
int offset = editor.getCaretModel().getOffset();
PsiElement element = file.findElementAt(offset);
PsiClass eClass = PsiTreeUtil.getParentOfType(element, PsiClass.class);
PsiField[] allFields = eClass.getAllFields();

// 选中的内容进行替换
final Editor editor = e.getRequiredData(CommonDataKeys.EDITOR);
final Project project = e.getRequiredData(CommonDataKeys.PROJECT);
final Document document = editor.getDocument();
Caret primaryCaret = editor.getCaretModel().getPrimaryCaret();
int start = primaryCaret.getSelectionStart();
int end = primaryCaret.getSelectionEnd();
WriteCommandAction.runWriteCommandAction(project, () ->
document.replaceString(start, end, "editor_basics")
);
primaryCaret.removeSelection();


// 使用Template 生成代码的同时并格式化
TemplateManager manager = TemplateManager.getInstance(e.getProject());
Template template = manager.createTemplate("","",content);
template.setToReformat(true);
manager.startTemplate(editor,template);

// 获取选择的数据模型
SelectionModel selectionModel = editor.getSelectionModel();

// 获取当前选择的文本
String selectedText = selectionModel.getSelectedText();

// 获取到当前文件的类 并向该文件下增加代码
Project project = e.getProject();
WriteCommandAction.runWriteCommandAction(e.getProject(),()->{
PsiJavaFile file = (PsiJavaFile) e.getData(CommonDataKeys.PSI_FILE);
PsiElementFactory instance = PsiElementFactory.SERVICE.getInstance(e.getProject());
file.add(instance.createField("age", PsiType.INT));
file.add(instance.createConstructor());
System.out.println(file.getName());
});




// 弹窗alter
Messages.showMessageDialog(
currentProject,
message.toString(),
title,
Messages.getInformationIcon());

 

posted @ 2022-09-13 15:57  D·Felix  阅读(670)  评论(0编辑  收藏  举报