idea插件2020版本
本项目名为MarkDownNoteYYF
,因为Java
学习经常要翻看源码,但是源码是只读文件无法添加注释,所以编写一款插件用来给源码做笔记,并且可以保存为MarkDown
格式文件,同时也支持上传到GitHub
仓库保存.目前已经发布至JetBrains插件库中
https://plugins.jetbrains.com/plugin/15393-markdownnoteyyf
-
选中文本,右键点击
MarkDownNote
-
可以选择添加到已有笔记中,也可以选择创建一个新的笔记列表
- 编写笔记,笔记标题:当前笔记的标题;笔记内容:对选中代码段的解释
- 点击添加到笔记列表以后,笔记就会添加到
noteWindow
中
- 可以再添加一条笔记到当前笔记列表
- 创建一个新的笔记列表
- 点击保存按钮以后选择保存路径可以生成当前文档标题的
MarkDown
格式文件
- 配置
setting
中的内容后可以双击上传,即可上传到指定github
仓库文档上传成功会显示
- 删除笔记按钮点击后会删除当前笔记列表
- 清空按钮点击后会清空当前的笔记列表,但不会删除
- 关闭按钮点击后会关闭
noteWindow
窗口
Ps:笔记在idea
关闭后再次打开也会存在
点击Setting
点击Developer Settings
选中所有以后,点击确定
保存好Token
因为不会再看到了,所以最好复制到文件中
建造者模式
: 对于NoteData
类,有一个NoteDataBuild
类
public class NoteDataBuilder {
public static NoteData build(String selectedText, String fileName) {
NoteData noteData = new NoteData();
noteData.setSelectedText(selectedText);
noteData.setFileName(fileName);
noteData.setFileType(getFileType(fileName));
return noteData;
}
public static NoteData build(Map map) {
NoteData noteData = new NoteData();
noteData.setSelectedText((String) map.get("selectedText"));
noteData.setFileName((String) map.get("fileName"));
noteData.setFileType((String) map.get("fileType"));
noteData.setNote((String) map.get("note"));
noteData.setNoteTitle((String) map.get("noteTitle"));
return noteData;
}
}
因为使用Jackson
从文件中取出json
转换成JavaBean
时会转换成LinkedHashMap
所以用build()
方法传入一个Map
构造NoteData
对象
模板模式
- 在使用
MarkDown
模板的时候,方便添加更多的模板在类cc.yyf.note.procesor.Processor
和cc.yyf.note.procesor.AbstractFreeMarkProcessor
和cc.yyf.note.procesor.FreeMarkProcessor
- 在
Setting
页面中添加更多的上传方式,目前只支持GitHub
后续可以添加更多的云盘 ,在类cc.yyf.note.window.GitHubUploadSettingView
和cc.yyf.note.window.UploadSettingView
- 在使用
- 使用
Jackson
来保存文档,还有保存笔记列表
["StringSourceCode","IntegerSourceCode"]
{"StringSourceCode":[{"selectedText":"private final byte[] value;","fileName":"String.class","fileType":"class","note":"String底层采用byte[]数组封装","noteTitle":"String底层封装"},{"selectedText":"public String() {\n this.value = \"\".value;\n this.coder = \"\".coder;\n }","fileName":"String.class","fileType":"class","note":"String构造一个空字符串","noteTitle":"String构造"}],"IntegerSourceCode":[{"selectedText":"static final int low = -128;\n static final int high;\n static final Integer[] cache;","fileName":"Integer.class","fileType":"class","note":"Integer底层缓存了一个cache数组保存-128到127","noteTitle":"Integer缓存"}]}
- 实现
ApplicationInitializedListener
接口,用来在IDEA
启动时完成初始化
/**
用来初始化的方法
*/
public void componentsInitialized() {}
同时需要在plugin.xml
中配置
<extensions defaultExtensionNs="com.intellij">
<applicationInitializedListener implementation="cc.yyf.note.init.IDEAInit"/>
</extensions>
- 实现了
ProjectCloseHandler
接口完成了在IDEA
关闭时调用的操作
@Override
public boolean canClose(@NotNull Project project) {
/**
返回true可以关闭,false就不能关闭
*/
return true;
}
同样这个也要在plugin.xml
中配置
<extensions defaultExtensionNs="com.intellij">
<applicationInitializedListener implementation="cc.yyf.note.init.IDEAInit"/>
<projectCloseHandler implementation="cc.yyf.note.destroy.IDEDestroy"/>
</extensions>
- 实现
Configurable
接口用来在Setting
中添加自己的界面
/**
通过返回一个JCompont显示界面
*/
@Override
public @Nullable JComponent createComponent() {
}
同样需要在plugin.xml
中配置
<extensions defaultExtensionNs="com.intellij">
<applicationInitializedListener implementation="cc.yyf.note.init.IDEAInit"/>
<projectCloseHandler implementation="cc.yyf.note.destroy.IDEDestroy"/>
<applicationConfigurable displayName="MarkDownUpload" instance="cc.yyf.note.window.FirstSettingView">
<configurable instance="cc.yyf.note.window.GitHubUploadSettingView"/>
</applicationConfigurable>
</extensions>
applicationConfigurable
可以配置多级页面
- 通过实现
ToolWindowFactory
来实现ToolWindow
(边边那个noteWindow
框)
@Override
public void createToolWindowContent(@NotNull Project project, @NotNull ToolWindow toolWindow) {
// 创建NoteListWindow对象
NoteListWindow window = new NoteListWindow(project, toolWindow);
// 将window中的JComboBox实例传出来
MyComponent.noteToolWindowJComboBox = window.getTextFieldTopic();
// 获取内容工厂实例
ContentFactory contentFactory = ContentFactory.SERVICE.getInstance();
// 获取用于toolWindow显示的内容
Content content = contentFactory.createContent(window.getContentPanel(), "", false);
// 给toolWindow设置内容
toolWindow.getContentManager().addContent(content);
}
在plugin.xml
中配置
<extensions defaultExtensionNs="com.intellij">
<applicationInitializedListener implementation="cc.yyf.note.init.IDEAInit"/>
<projectCloseHandler implementation="cc.yyf.note.destroy.IDEDestroy"/>
<!-- Add your extensions here -->
<toolWindow id = "noteWindow" factoryClass="cc.yyf.note.window.NoteToolWindow" anchor="right"/>
<applicationConfigurable displayName="MarkDownUpload" instance="cc.yyf.note.window.FirstSettingView">
<configurable instance="cc.yyf.note.window.GitHubUploadSettingView"/>
</applicationConfigurable>
</extensions>
- 继承
AnAction
实现一个动作(可以理解为一次点击事件)
@Override
public void actionPerformed(AnActionEvent e) {
// TODO: insert action logic here
}
<actions>
<!-- Add your actions here -->
<action id="PopupMenuActionID" class="cc.yyf.note.action.PopupMenuAction" text="MarkDownNote" description="添加MarkDown笔记">
<add-to-group group-id="EditorPopupMenu" anchor="first"/>
<keyboard-shortcut keymap="$default" first-keystroke="ctrl F"/>
</action>
</actions>
我的点击事件是EditorPopupMenu
.
- 使用
FreeMark
模板
## ${topic}
@[toc]
<#list noteList as note>
### ${note.noteTitle}
- ${note.note}
- ${note.fileName}
```${note.fileType}
${note.selectedText}
`` `
</#list>
- 没有找到
IDEA
关闭的时候调用的方法,所以只能使用关闭项目时候调用的方法,导致在直接点击右上角关闭按钮的时候这个方法会调用两次. - 可能是线程的一些问题,再点击上传到
github
按钮的时候,要点击两次才能上传成功. - 后续可以开发删除单条笔记和修改笔记排序
github
上传时不能用中文作为文件名,所以不要使用中文作为文档标题
一开始面对官方的英文文档看起来是很困难的,还有对于gradle
也是第一次使用,以前都是使用maven
,对于插件开发也是第一次,API
的陌生是开发最大的阻力,很多东西有想法但是很难实现,第一阶段的开发没有上传github
也不能支持多个笔记,也不能支持笔记的持久化,IDEA
关了笔记就没了,去看了几个插件的实现,用了一个翻译插件,可惜不是用Java
开发的后来看了easy_javadoc
的源码,知道了如何在Setting
中添加页面,加了easy_javadoc
作者的开源交流群,群主很热心的解答问题.第二阶段有了上传github
功能,但是不支持多笔记,而且不能持久化,于是去看了看Java Swing
编程,用Jackson
存储将对象转化为json
存储在文件中.最终有了现在的项目