Idea 有很多实用的插件,极大地方便了码农的搬砖工作
但有些功能求人不如求己,毕竟每个人的习惯和遇到的问题是不一样的。
问题背景
-
有的时候(然而我已经忘了什么时候),会想知道某段代码多少行,之前的做法是复制出来放到新建的文本编辑器中查看,后来感觉这种事情应当可以写插件来实现,于是诞生了这个项目——计算代码行数。
这是个极为简单的功能,但是写插件这种事情我是一头雾水,于是第一步,搜索 github,浏览了许多,发现了一个插件,作用是给一段文本排序:LinesSorter,想想恰好能改为我想要的功能,果断 FORK 下来。
-
在之前的工作中,经常会犯一种低级错误——set 错字段,因为两个字段的单词首字母很接近(可能头两个字母都是一样的),恰好类型有一样,一个不注意,setOrderId 可能就 set 成了 OrnotId(意会),于是产生了第二个想法——标记行内相同的单词。如此只要标记下,就能很直观的看到是否 set 正确了。
轻车熟路,搜索 github,发现插件 MultiHighlight,果断 FORK。
环境搭建
环境搭建很容易,安装 intelliJ SDK 插件即可,选择 SDK 时,新建并定位到 intelliJ 文件夹本身即可。
不同的插件可能基于不同的 SDK 构建,所以 down 下来的代码未必能够正常运行,我一般是将代码拷贝到自己的项目中
除了代码,最重要的是 plugin.xml,位于 resources 中。
项目构建成功后运行,就可以查看效果,在通过调试了解代码的运行逻辑。
正文
核心代码非常少,如下:
@Override
public void doExecute(Editor editor, @Nullable Caret caret, DataContext dataContext) {
final Document doc = editor.getDocument();
int startLine;
int endLine;
boolean hasSelection = editor.getSelectionModel().hasSelection();
if (hasSelection) {
startLine = doc.getLineNumber(editor.getSelectionModel().getSelectionStart());
endLine = doc.getLineNumber(editor.getSelectionModel().getSelectionEnd());
if (doc.getLineStartOffset(endLine) == editor.getSelectionModel().getSelectionEnd()) {
endLine--;
}
} else {
startLine = 0;
endLine = doc.getLineCount() - 1;
}
if (startLine <= endLine) {
String message = String.format("%d lines are selected!", endLine - startLine + 1);
Messages.showInfoMessage(message, "Count Result");
}
}
-
editor.getDocument() 获取到了当前编辑器的内容
-
hasSelection 很好理解,就是有没有选中文本
-
startLine 和 endLine 获取到了选中文本的行号
-
最后通过 showInfoMessage 方法,将计算好的行号通过消息框的方式展现
其实我真正写的代码就在最后那个 if 中,其他的都是 Line Sorter 的代码 😂
添加配置
<actions>
<group id="editor.lines.group">
<separator/>
<action id="lines.count"
class="org.b3log.zephyr.action.CountLinesAction"
text="Count Lines"
description="Count selected lines or whole file if selection is empty">
</action>
<add-to-group group-id="EditorPopupMenu" anchor="last"/>
</group>
</actions>
这段配置的重点在于 add-to-group,他将这个功能添加到了右键菜单中,这个就是通过文档查到的了 😂
部署
Build 中,会多一个 Prepare Plugin Module XXX For Deployment
构建好,通过本地安装就可以供自己使用了
效果
供自己使用,所以不讲究那么多了 😂 有这个颜色标记,下次应该不会再 set 错字段了……
后记
官方似乎没有给出明确的 API 文档(或者我没找到……),一方面通过一个 Guide, 一方面查找相关类的 JavaDoc(Github 上有 IntelliJ Community 的源码,线上看就好了,要 down 下来的话,我 down 了八九百 M 没有完成,放弃了。。。)
稍微复杂一点的功能就是第二个,行内代码着色,感兴趣的可以直接上我的 Github 上看
本文纯属灌水
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于