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());