最近在學習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文件,有興趣的同窗能夠下載試試。