最近在學習Python,自然也安裝了Atom編輯器的一些Python插件。有一個插件名字叫做 atom-python-run
,作用很簡單,就是按F5運作目前Python檔案。不過這個插件有一個問題,就是隻能在Windows平台上以cmd方式運作。我希望這個插件能支援Powershell方式運作,是以我就給作者提了Issue。結果發現Issue還不少。而作者正好比較忙,目前沒工夫。是以我就想,為什麼不自己做一個Atom插件呢?
以上就是我開發這個插件的目的了。這個插件的主要功能就是按F5啟動一個終端運作Python檔案,終端可以是cmd也可以是powershell。
編寫插件
這個插件我就叫它
run-python-simply
,聽名字應該就能猜出它的作用。首先打開Atom編輯器,然後點選菜單欄
Packages->Package Generator->Generate Package
,輸入要建立的插件名字,然後按回車。
時間統計
在編寫插件之前,我們首先分析一下插件的需求。由于
這個插件有CodeBlocks式的程式傳回值和運作時間的顯示,我希望我的插件也具有這個功能。看了一下atom-python-run的源代碼,作者的實作方式是寫一個C++程式,用這個C++程式調用Python檔案,時間統計在C++程式中。我這裡就不使用C++了,既然是Python的插件,那麼我這裡就使用Python來統計時間。
下面的腳本很簡單,要執行的檔案通過指令行參數傳入。程式傳回的結果附帶時間統計和傳回值的,這個和atom-python-run插件的輸出結果相同。
# 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的文檔就行了。
{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
,編輯器那麼編輯器就自動生成了下拉清單。

下拉清單配置
本來在寫這個插件的時候我有很多想法準備總結一下,後來寫完了回頭一看感覺也就這樣。沒什麼說的了,大家都是聰明人,看看就得了。是以就這樣吧。
釋出插件
推送到Github
代碼寫完之後,就能釋出了。首先需要将它推送到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檔案,有興趣的同學可以下載下傳試試。