Idea 插件开发手记

本贴最后更新于 2647 天前,其中的信息可能已经时移世异

Idea 有很多实用的插件,极大地方便了码农的搬砖工作

但有些功能求人不如求己,毕竟每个人的习惯和遇到的问题是不一样的。

问题背景

  1. 有的时候(然而我已经忘了什么时候),会想知道某段代码多少行,之前的做法是复制出来放到新建的文本编辑器中查看,后来感觉这种事情应当可以写插件来实现,于是诞生了这个项目——计算代码行数。

    这是个极为简单的功能,但是写插件这种事情我是一头雾水,于是第一步,搜索 github,浏览了许多,发现了一个插件,作用是给一段文本排序:LinesSorter,想想恰好能改为我想要的功能,果断 FORK 下来。

  2. 在之前的工作中,经常会犯一种低级错误——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

构建好,通过本地安装就可以供自己使用了

效果

9e058ea59290470aba6b30496b0fb951-20170824113905.png

0b9589df27bd416fa1d1a70d22693833-20170824113738.png

供自己使用,所以不讲究那么多了 😂 有这个颜色标记,下次应该不会再 set 错字段了……

后记

官方似乎没有给出明确的 API 文档(或者我没找到……),一方面通过一个 Guide, 一方面查找相关类的 JavaDoc(Github 上有 IntelliJ Community 的源码,线上看就好了,要 down 下来的话,我 down 了八九百 M 没有完成,放弃了。。。)

稍微复杂一点的功能就是第二个,行内代码着色,感兴趣的可以直接上我的 Github 上看

本文纯属灌水

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
  • 这样应该不同的词用不同的颜色,要不也很看不出来呀

    1 回复
  • 其他回帖
  • Angonger

    想起来很早我为了不累眼,把屏幕色温调的特别黄,然后我们人事那边经过“你显示器坏了吗?给你换个新的吧!”你找个会不会被看到给你换个显示器 😂

    3 回复
  • ZephyrJung

    逐行标记每一行内相同的单词,一个单词一个颜色
    因为是当文本处理了,所以那种 import 之类的无用代码也会标记

    1 回复
  • ZephyrJung

    当你用 Color.后看到的候选颜色时,会发现可选择的余地并不多

  • 查看全部回帖