PyCharm 是很多 Python 开发者优先选择的 IDE,功能强大,跨平台,提供免费社区版,非常良心。如果你想自己给 PyCharm 添加一些功能怎么办呢?有两个办法:
-
通过提需求实现,到 JetBrains 的 github 去提 issue 或者自己发 Pull Request 请他们 merge。
-
通过安装插件实现,你可以查找现有的 插件仓库,或者,自己写一个。
今天我们说说怎么搭建环境自己写一个 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 关于这个的吐槽问题你搜到,如果你有更好的办法请告诉我。当你换一台机器把插件代码克隆下来之后应该就知道我在说什么了。
插件工程目录结构
一个典型的插件目录结构就像下图。
修改插件信息
打开
/resources/
META
-
INF
/
plugin
.
xml
, 更新插件信息,举例说明。
version="2">
com.eflabs.plugin.efcommon
EF Common for PyCharm
3.1
email="[email protected]">Toby Qin
Able to run and debug ef common tests easily.
Support run/debug ef-common tests via context menu.
Show run button in the line of test case.
]]>
v3.0
Support PyCharm 171.*
Support nested ef-common project.
Early version
Bug fix: failed to get run.template in resource.
The baby version.
]]>
since-build="171.1"/>
com.intellij.modules.python
defaultExtensionNs="com.intellij">
implementation="com.eflabs.efcommon.runConfiguration.EfCommonConfigurationType"
order="FIRST"/>
implementation="com.eflabs.efcommon.runConfiguration.EfCommonConfigurationProducer"
order="FIRST"/>
implementationClass="com.eflabs.efcommon.runLineMarker.EfCommonRunLineMarkerContributor"
language="Python"/>