如何开发一个 PyCharm 插件
PyCharm 是很多 Python 开发者优先选择的 IDE,功能强大,跨平台,提供免费社区版,非常良心。如果你想自己给PyCharm添加一些功能怎么办呢?有两个办法:
今天我们说说怎么搭建环境自己写一个 PyCharm 插件。
前期准备
先普及一下知识,开发 PyCharm 插件和开发 IntellJ IDEA 插件需要的环境是一样的,因为 PyCharm 本身就是 IDEA 的一个子集,说白了就是 IDEA 上套了一个 Python 语言支持的插件。其他系列的 IDEA IDE 其实也是一样的道理,都是套了对应语言支持的框架外加一点外观修改,就成了新的产品,比如 WebStrom,PhpStorm,RubyMine。到这里你应该有个印象,JetBrains 这个公司太能玩了,就一个 IDEA 能整出那么多产品来,很厉害吧?
开发 PyCharm 插件你需要:
- 对 Java 语言有一定了解,因为你只能用 Java 开发插件
- 安装最新版的 IntelliJ IDEA
- 安装 PyCharm Community Edition 到本地
- 确保 IntelliJ 安装并启用了
Plugin DevKit
插件,默认自带 - 配置 IntelliJ Platform SDK, 下文会涉及相关步骤
- (非必需)将IntellJ IDEA Community Edition 的代码克隆到本地,方便调试
如果你英文还可以,也可以阅读官方的帮助文档。
新建插件工程
从文件菜单选择 New Project, 选择 IntelliJ Platform Plugin,如果你没有配置SDK,点击New 菜单。
选择你本地 PyCharm Community Edition(社区版)的安装路径作为SDK目录,Java SDK 选择 1.8 以上的版本。
请注意,你也可以使用 PyCharm Professional (旗舰版) 的安装路径作为SDK目录,不过当你调试插件碰到核心代码时,社区版你可以一步一步跟到最里面,但旗舰版不行,因为旗舰版并不是开源的,你拿不到源代码。
回到 New Project 的界面,点击 Next,输入 Project name 和 Project location,点击完成。
小贴士:如果你是打开别人的写的插件,那么你直接选择打开工程目录是没有用的,因为 IntelliJ IDEA 不认为这是个插件工程,所以你没法运行和调试这个插件,一个不怎么优雅的办法就是从现有代码新建一个插件工程,StackOverflow 关于这个的吐槽问题你搜到,如果你有更好的办法请告诉我。当你换一台机器把插件代码克隆下来之后应该就知道我在说什么了。
插件工程目录结构
一个典型的插件目录结构就像下图。
- .idea 目录 – JetBrains IDE 生成的工程都会有这么一个目录,存放用户配置和缓存,无需关心。
- doc 目录 – 插件的文档,可选。
- out 目录 – 编译后的代码字节,无需关心。
- resources 目录 – 资源存放目录,插件的配置文件在此。
- src 目录 – 代码存放的位置。
- *.iml 文件 – 项目的配置文件。
修改插件信息
打开 /resources/META-INF/plugin.xml
, 更新插件信息,举例说明。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
|
<idea-plugin version="2">
<id>com.eflabs.plugin.efcommon</id>
<name>EF Common for PyCharm</name>
<version>3.1</version>
<vendor email="toby.qin@live.com">Toby Qin</vendor>
<description><![CDATA[
<b>Able to run and debug ef common tests easily.</b><br>
<br>
<ul>
<li>Support run/debug ef-common tests via context menu.</li>
<li>Show run button in the line of test case.</li>
</ul>]]>
</description>
<change-notes><![CDATA[
<b>v3.0</b><br>
<p>Support PyCharm 171.*</p>
<p>Support nested ef-common project.</p>
<br>
<b>Early version</b><br>
<p>Bug fix: failed to get run.template in resource.</p>
<p>The baby version.</p>
<br>]]>
</change-notes>
<!-- please see http://www.jetbrains.org/intellij/sdk/docs/basics/getting_started/build_number_ranges.html for description -->
<idea-version since-build="171.1"/>
<!-- please see http://confluence.jetbrains.com/display/IDEADEV/Plugin+Compatibility+with+IntelliJ+Platform+Products
on how to target different products -->
<depends>com.intellij.modules.python</depends>
<extensions defaultExtensionNs="com.intellij">
<!-- Add your extensions here -->
<configurationType implementation="com.eflabs.efcommon.runConfiguration.EfCommonConfigurationType"
order="FIRST"/>
<runConfigurationProducer implementation="com.eflabs.efcommon.runConfiguration.EfCommonConfigurationProducer"
order="FIRST"/>
<runLineMarkerContributor
implementationClass="com.eflabs.efcommon.runLineMarker.EfCommonRunLineMarkerContributor"
language="Python"/>
</extensions>
<actions>
<!-- Add your actions here -->
</actions>
</idea-plugin>
|
这个配置文件里有几点要注意的:
<id>
和<version>
用于声明你的插件唯一标识,同id和version的插件不能够重复上传。<depends>
节点声明了此插件的依赖条件,如果是PyCharm 适用的,那么就写com.intellij.modules.python
<extenstions
节点用于声明你要扩展的类,只要继承和实现对应的接口就可以了。<actions>
节点用于注册你要实现的 Action,比如你先写一些 Action,然后注册到某个菜单。
实现具体的业务代码
这里我略过最核心的部分,因为每个人的需求和代码能力都不一样,这应该去查阅Java编程规范。
简而言之,就是根据你自己的需求用Java实现一些接口和方法。
运行和调试你的插件
如果你的代码已经实现了,那么运行和调试就比较简单。
- 使用 Run | Run 菜单来运行你的插件,这时候会启动一个新的PyCharm,默认安装好你的插件。
- 使用 Run | Debug 菜单来调试你的插件,你可以设置断点进行调试。
发布你的插件
你可以选择本地发布你的插件,也可以选择上传到 JetBrains 的插件仓库。
本地发布安装
如果你的插件是内部小范围使用,并且可能带有敏感信息,那么这样的方式会比较适合你。从主菜单选择 Build > Prepare plugin ‘my_plugin’ For Deployment。
如果成功那么在工程目录就会生成一个同名的 jar 文件。
将这个文件 copy 到目标机器就可以通过 Install Plugin from disk … 完成安装。厦门叉车租赁
发布插件到 JetBrains Plugin 仓库
生成插件的步骤和本地发布是一样的,唯一不同的就是你需要到 JetBrains Plugins 网站去注册一个账号。
登录之后选择 UPLOAD PLUGIN 菜单,上传之后大概需要2个工作日审核。
审核通过后其他用户就可以直接从 Browse Repositories… 里搜索到你的插件并安装。通过插件仓库安装的插件,一旦有新版本发布,用户将收到更新提示。
写在最后
关于如何实现具体的插件业务代码,一个偷懒的办法就是去看现有功能大概是怎么实现的,你既然可以拿到 PyCharm Community Edition 的所有代码,还有啥看不到的,看懂只是时间问题。再或者去 github 搜搜看,万一有惊喜呢?
就 PyCharm 本身来说,我觉得作为 IDE 提供的功能已经很丰富了,为啥还要写插件呢?对啊,哪里来的需求,会不会是一个伪需求呢。写插件前请你想一想这个问题。
如何开发一个 PyCharm 插件的更多相关文章
- 开发一个shopify插件
开发一个shopify插件,shopify商城可以安装该插件:当用户在商城下单后,插件把订单数据按照指定格式传给disruptsports服务器: https://help.shopify. ...
- jQuery 开发一个简易插件
jQuery 开发一个简易插件 //主要内容 $.changeCss = function(options){ var defaults = { color:'blue', ele:'text', f ...
- 开发一个jQuery插件——多级联动菜单
引言 开发中,有好多地方用到联动菜单,以前每次遇到联动菜单的时候都去重新写,代码重用率很低,前几天又遇到联动菜单的问题,总结了下,发现可以开发一个联动菜单的功能,以后想用的时候就方便多了.项目中每个页 ...
- 如何开发一个Jquery插件
Jquery有两种开发插件的方法: 1.jquery.fn.extend(object); 2.jquery.extend(object); 第一种方法是给Jquery对象添加方法,jquery.fn ...
- 开发一个chrome插件:将百度搜索热点屏蔽掉!
每次百度搜索,搜索结果的右边总是出现些乱七八糟的搜索热点(推的都是些什么玩意,高校替课和我有毛关系,几个悲伤的热点我用星号顶掉了). 强迫症想把它隐藏掉,我用的是chrome浏览器,受adblock( ...
- 如何开发一个maven插件
maven是当下最流行的项目管理工具,其丰富的插件为我们的工作带来了很大的便利. 但是在一些情况下,开源的插件并不能完全满足我们的需求,我们需要自己创建插件,本文就从0开始带大家一起创建自己的插件. ...
- 如何开发和发布一个Vue插件
前言 Vue 项目开发过程中,经常用到插件,比如原生插件 vue-router.vuex,还有 element-ui 提供的 notify.message 等等.这些插件让我们的开发变得更简单更高效. ...
- 如何从0开发一个Atom组件
最近用Atom写博客比较多,然后发现一个很严重的问题..没有一个我想要的上传图片的方式,比如某乎上边就可以直接copy/paste文件,然后进行上传.然而在Atom上没有找到类似的插件,最接近的一个, ...
- chrome 浏览器插件开发(一)—— 创建第一个chrome插件
最近在开发一个chrome插件,在网上找到了一些的文章,虽说按照文章可以写出对应的例子,但若要进行实际开发,发现还是有不少文章中没有的坑.下面我将结合我在开发过程中遇到的几个方面,对这些坑做一下补充. ...
随机推荐
- 编程开发之--Oracle数据库--存储过程在out参数中使用光标(3)
在本系列学习随笔中的第2节我们留下了2个问题,我们现在讨论在out参数中使用光标. 1.要在out参数中使用光标,我们需要申明一个包的结构,包的结构分为包头和包体,包头只负责申明,包体只负责实现.包头 ...
- LNMP web服务的安装
第1章 安装Nginx 环境: 系统:CentOS6.5 软件:nginx-1.6.3 mysql-5.5.49 php-5.5.32 1.1 Nginx官网 http://nginx. ...
- 第五章 C程序结构
一.数值类型 1.实数常量的表示:3.5(双精度),3.5f(单精度),3.5L(长双精度) 2.整数常量:char字符常量(‘a’,‘b’,‘0’)当做一个整型常量参加运算 3.数字字符与英文字母字 ...
- PHP 变量分页标签页面源代码技术分享
最近在研究PHP的常规变量的分页源代码. 现在发布一个给大家看一下. defined('IN_DUOAO') or exit('No permission resources.');$smarty ...
- linux打patch简单示例
在项目中,有些模块是开源的,没有源码或者不能改动源码,想要修复.优化里面的Bug,这时就需要用到patch了. 1. 生成patch 制作补丁有两种法法,diff和quilt. 1.1 di ...
- django中的F和Q
F查询 Django 提供 F() 来做这样的比较.F() 的实例可以在查询中引用字段,来比较同一个 model 实例中两个不同字段的值. 查询书id大于\小于价格的书籍 models.Book.ob ...
- Leecode刷题之旅-C语言/python-383赎金信
/* * @lc app=leetcode.cn id=383 lang=c * * [383] 赎金信 * * https://leetcode-cn.com/problems/ransom-not ...
- 旁听<基因编辑与精准医疗>(北京大学)
昨天去北大生命科学院听了一场魏文胜教授关于基因方面的讲座.会场人不算太多,比起上次听城市规划,场面略显冷清.也能从一个侧面反映,关注基础科学领域的人虽然有,但是不是很多. 开场魏教授用了宣传海报作为导 ...
- Go类型特性-学习笔记
1.组合 Go语言使用组合来完成类型的设计,设计某一类型时想要拥有其他类型的功能只需要将其他类型嵌入该类型即可. 2.接口 与其他语言不同的是,编译器会自动判断该类型是否符合某正在使用的接口,甚至不需 ...
- linux——高级文本处理命令之wc、cut、sort
1. wc :Word Count 命令的功能为统计指定文件中的字节数.字数.行数,并将统计结果显示输出 1.1 命令格式: wc [选项]文件... 1.2 命令参数: -c 统计字节数. -l ...