作一個運行Python文件的Atom插件

最近在學習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的pathchild_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。咱們在Github上建立一個倉庫,而後把代碼推動去就行了。若是對Git命令不熟悉的話,可使用Git Extensions,這是Windows下最好用的圖形客戶端了。

發佈插件

第一步是輸入apm login。這樣會在瀏覽器中打開一個網頁,在網頁上登陸Atom帳號以後,複製網頁上的Token,而後粘貼回命令行中,再按回車。這樣就完成了登陸工做。

登陸以後,命令行切到咱們插件的Git目錄中,而後輸入apm publish minor,稍等片刻插件就發佈成功了。這個命令能夠接受minormajorpatch三個參數,當咱們須要更新大版本、小版本、修訂版本的時候使用。

這個命令在後臺其實會作不少事情,好比設置package.json中的版本號、添加版本標籤並提交到版本庫中。完成以後,會顯示下面這樣的祝賀信息。這樣,插件就發佈完成了。能夠看到第一次提交插件的版本號爲v0.0.1。若是咱們查看一下Github倉庫,也會發現多了一個名爲Prepare v0.0.1的提交。

發佈完成

這時候搜索一下Atom插件倉庫,會發現咱們的插件已經成功出如今了插件倉庫中。這樣這個插件就算開發完成了!插件地址是run-python-simply,源代碼地址是Github。這個插件做用很簡單,就是在cmd或者powershell中運行當前的Python文件,有興趣的同窗能夠下載試試。

相關文章
相關標籤/搜索