最近在学习Python,天然也安装了Atom编辑器的一些Python插件。有一个插件名字叫作atom-python-run,做用很简单,就是按F5运行当前Python文件。不过这个插件有一个问题,就是只能在Windows平台上以cmd方式运行。我但愿这个插件能支持Powershell方式运行,因此我就给做者提了Issue。结果发现Issue还很多。而做者正比如较忙,目前没工夫。因此我就想,为何不本身作一个Atom插件呢?python
以上就是我开发这个插件的目的了。这个插件的主要功能就是按F5启动一个终端运行Python文件,终端能够是cmd也能够是powershell。git
这个插件我就叫它run-python-simply
,听名字应该就能猜出它的做用。首先打开Atom编辑器,而后点击菜单栏Packages->Package Generator->Generate Package
,输入要建立的插件名字,而后按回车。github
在编写插件以前,咱们首先分析一下插件的需求。因为atom-python-run这个插件有CodeBlocks式的程序返回值和运行时间的显示,我但愿个人插件也具备这个功能。看了一下atom-python-run的源代码,做者的实现方式是写一个C++程序,用这个C++程序调用Python文件,时间统计在C++程序中。我这里就不使用C++了,既然是Python的插件,那么我这里就使用Python来统计时间。shell
下面的脚本很简单,要执行的文件经过命令行参数传入。程序返回的结果附带时间统计和返回值的,这个和atom-python-run插件的输出结果相同。json
# Python 3 file import subprocess import time import sys script = sys.argv[1] start = time.time() process = subprocess.run(['python', script], stderr=subprocess.STDOUT) exitcode = process.returncode end = time.time() seconds = end - start print() print( f'Process return {exitcode} ({hex(exitcode)}) execution time: {seconds:.03f} s') subprocess.call("pause", shell=True)
插件的主要代码我使用了CoffeeScript编写。默认自动生成的代码有两个,一个视图,另外一个是代码。因为咱们这个插件不须要显示什么内容,因此那个View文件直接删了就行。剩下一个文件写成下面这样。浏览器
这个文件的实现参考了atom-python-run。因为我也是刚刚学习编写插件,对于插件怎么写仍是不太懂,因此最简单的办法就是参考另外一个插件了。固然即便是参考,过程也是很痛苦的。由于我毕竟对JavaScript和CoffeeScript不太熟悉,有些简单的地方也浪费了很多时间。并且插件的调试也不太方便,须要开两个Atom窗口,一个修改完以后,重载另外一个。编辑器
写完以后再看看代码,并不怎么难。因为代码时间的统计已经作Python文件中作好了,因此在这里只须要调用那个Python,让Python调用实际的Python文件就好了。学习
这里用到的知识点有NodeJS的path
、child_process
模块。具体用法看NodeJS文档就行了。还有就是几个Atom接口的使用:notifications
用来建立通知,就是右上角的气泡通知;atom.config
用来获取Atom的配置项;config
节点用来添加插件的配置。具体使用到时不难,看Atom的文档就好了。ui
{CompositeDisposable} = require 'atom' child_process = require 'child_process' path = require 'path' module.exports = RunPythonSimply = subscriptions: null activate: (state) -> @subscriptions = new CompositeDisposable @subscriptions.add atom.commands.add 'atom-workspace', 'run-python-simply:toggle': => @toggle() deactivate: -> @subscriptions.dispose() serialize: -> toggle: -> editor = atom.workspace.getActiveTextEditor() if editor file = editor.buffer.file if file fileInfo = path.parse(file.path) if fileInfo.ext != ".py" atom.notifications.add("warning", "Current file is not a python source file") else editor.save() @run(file.path) else atom.notifications.add("info", "No source file to run") run: (file)-> command = atom.config.get('run-python-simply.command') args = command.split(" ").concat(['python', __dirname + path.sep + 'exec.py', file]) process = child_process.spawn("start", args, { shell: true detached: true }) process.unref() config: command: title: "Command Prompt" type: 'string' default: 'cmd /c' enum: [ {value: 'cmd /c', description: 'Command Line Prompt'} {value: 'powershell -command', description: 'Powershell'} ]
其实Atom的插件系统比我想的要简单。一开始我以为Atom插件要作的事情其实还挺多,还要本身管理本身的配置对话框。后来我发现根本不须要,Atom的系统比较智能。就像上面代码中的那样,只要咱们在代码中声明了一个config
元素,编辑器就会自动生成对应的配置界面。比方说上面我声明了两个enum
,编辑器那么编辑器就自动生成了下拉列表。atom
原本在写这个插件的时候我有不少想法准备总结一下,后来写完了回头一看感受也就这样。没什么说的了,你们都是聪明人,看看就得了。因此就这样吧。
代码写完以后,就能发布了。首先须要将它推送到Github。咱们在Github上建立一个仓库,而后把代码推动去就行了。若是对Git命令不熟悉的话,可使用Git Extensions,这是Windows下最好用的图形客户端了。
第一步是输入apm login
。这样会在浏览器中打开一个网页,在网页上登陆Atom帐号以后,复制网页上的Token,而后粘贴回命令行中,再按回车。这样就完成了登陆工做。
登陆以后,命令行切到咱们插件的Git目录中,而后输入apm publish minor
,稍等片刻插件就发布成功了。这个命令能够接受minor
、major
、patch
三个参数,当咱们须要更新大版本、小版本、修订版本的时候使用。
这个命令在后台其实会作不少事情,好比设置package.json
中的版本号、添加版本标签并提交到版本库中。完成以后,会显示下面这样的祝贺信息。这样,插件就发布完成了。能够看到第一次提交插件的版本号为v0.0.1
。若是咱们查看一下Github仓库,也会发现多了一个名为Prepare v0.0.1
的提交。
这时候搜索一下Atom插件仓库,会发现咱们的插件已经成功出如今了插件仓库中。这样这个插件就算开发完成了!插件地址是run-python-simply,源代码地址是Github。这个插件做用很简单,就是在cmd或者powershell中运行当前的Python文件,有兴趣的同窗能够下载试试。