Sublimeプラグインの開発-簡単なコードテンプレートプラグイン


最近はsublimeを使ったgolang開発が行われていて、全体的にいい感じで、eclipseなどのIDEには及ばないが、使い勝手が軽くて便利で、golangの開発は十分だ.一部のコードの多重化率が高く、よく使われていますが、自分の記憶力が非常に悪く、自分で叩くたびに他のIDEのプラグインのようにコードテンプレートを直接挿入したいと思って、sublimeのプラグイン開発を検討しました(ネット上ではGistを推薦する人が多いのですが、ネット上の理由でGistプラグインが適用されるのが遅く、毎回長い時間待たなければならないことがわかりました).
プラグインを装着した人はsublimeのプラグインがpythonで開発されていることを知っているので、開発するにはpythonを初歩的に把握する必要があります.初歩的には、sublimeプラグインの開発は実際にpythonを使用してsublineが提供するインタフェースを呼び出して開発されているため、MFCのように、各動作の下位層がどのように実現されているかに注目する必要はありません(以下を見てください).
)、これらのアクションインタフェースを呼び出して一連の操作を完了するだけでよい.
入門開発プロセスここでは説明しません.ここには入門チュートリアルがあります.公式インタフェースのドキュメントを加えると、簡単なはずです.
  • Sublime Text 2プラグイン
  • の開発方法
  • sublime公式開発例
  • sublime 2インタフェースドキュメント
  • 次は主に私のこのプラグインの開発を紹介します.
    一、機能確定
    やはり古い規則で、仕事をして善いことをしようとすると、必ず先に器を利して、私たちはまずプラグインの機能を確定します.初めて開発したので、基本的なニーズを満たすだけでいいので、あまり複雑に開発するつもりはなく、機能を確定しました.
  • 選択コードをテンプレートライブラリに追加
  • テンプレートライブラリから選択する指定コードを現在位置
  • に挿入する.
  • は、テンプレート内の{date}}を現在の日付
  • に置き換えるなど、いくつかの変数の置換を完了することができる.
    二、機能設計
    この3つの機能を1つずつ分析します.まず最初の実装方法は多く,すべてのテンプレートを同じファイルに存在させ,境界子を適用して採点することができるが,これでは修正追加を削除する際にすべてのテンプレートを繰り返し判断することが面倒になる.だから直接各テンプレートに1つのファイルを保存することができて、ファイル名は直接テンプレート名で命名して、このように処理するのはとても便利で、このように多くのファイルを生成することができるのではないかと言う人がいるかもしれませんが、多くなってから探すのは遅いのではないでしょうか.私はいつもいかなるプログラム設計もバランスのとれた実現の複雑さと性能を両立させなければならないと思っています.一方的に追求するのではなく、一方的に追求しなければなりません.sublimeで私たちが普段よく使うコードテンプレートは実は限られていて、普通は数十個しかありません(多くても覚えられません)、これに対して直接単独でファイルを書くのは全然大丈夫ですが、逆に効率的にインデックスを作るためには、鶏を殺すために牛刀を使います.もちろん、実は使いやすいように、フォルダごとにグループ化して保存したほうが合理的ですが、今はおっくうですから、先にそうしましょう.コードを挿入するのは簡単です.テンプレートフォルダを巡ってすべてのファイル名を読み出して選択し、対応するファイルを読み込んでカーソル位置に挿入すればいいです.変数の置換はもっと簡単です.前の変数の置換を挿入すればいいです.もちろん、カスタム変数を実装するには、プロファイルを追加する必要があります.
    三、コード実装
    コードは詳しく説明しませんが、前のチュートリアルドキュメントを見たら下のコードが簡単です.まず、コード構造を見てみましょう.
    template  #     
    codemanage.py #    
    Default (XXX).sublime-keymap #       ,XXX   
    var-map.conf  #        ,key=value

        codemanage.pyコードは次のとおりです.
    #-*- coding: UTF-8 -*-
    import sublime, sublime_plugin
    import os
    import os.path
    import time
    import sys
    
    reload(sys)   
    sys.setdefaultencoding('utf8')
    
    #    ,                 ,             
    class CodeTplAddCommand(sublime_plugin.TextCommand):
    	def run(self,edit):
    		#        
    		selstr = ''
    		sels = self.view.sel()
    		for sel in sels:
    			value = self.view.substr(sel)
    			if value == '':
    				continue
    			selstr = selstr + value + '
    ' if selstr == '': sublime.message_dialog("Select content is empty.") return def on_done(name): if name=='': sublime.message_dialog("Template name is empty.") return # path = os.path.join(sublime.packages_path(),"CodeManage","template",name+".ctpl") try: f = open(path, 'w') print selstr selstr.encode("gbk") f.write(selstr) except Exception, e: print e sublime.message_dialog("Write template file fail:"+str(e)) return finally: f.close() def on_change(name): return def on_cancel(): return # self.view.window().show_input_panel('Plese input the code template name','template',on_done,on_change,on_cancel) # class CodeTplInsertCommand(sublime_plugin.TextCommand): def run(self,edit): filenames = [] rootdir= os.path.join(sublime.packages_path(),"CodeManage","template") for p,d,files in os.walk(rootdir): filenames = files def on_sel_done(selvalue): if selvalue==-1: return filename = filenames[selvalue] content = '' if filename=='': sublime.message_dialog("Template is not exist.") return path = os.path.join(sublime.packages_path(),"CodeManage","template",filename) try: f = open(path, 'r') content = f.read() if content=='': sublime.message_dialog("Template file is empty") return content = ReplaceVar(content) except Exception, e: sublime.message_dialog("Open template file fail:"+str(e)) return finally: f.close() # sels = self.view.sel() for sel in sels: self.view.insert(edit,sel.begin(),content) # self.view.window().show_quick_panel(filenames,on_sel_done) # # {{XXX}} ({{data}} ) def ReplaceVar(content): varmap = { '{{date}}':time.strftime('%Y-%m-%d',time.localtime(time.time())) } # try: path = os.path.join(sublime.packages_path(),"CodeManage","var-map.conf") f = open(path, 'r') for line in f.readlines(): if line=='': continue value = line.split("=") varmap["{{"+value[0]+"}}"] = value[1] except Exception, e: sublime.message_dialog("Open var-map file fail:"+str(e)) return finally: f.close() for (k,v) in varmap.items(): content = content.replace(k,v) return content

    pythonがわかるのは簡単だと思います.
    四、まとめ
        
    今はまだ機能が整っていませんが、もう使っています.
    便利になりました.sublimeプラグインの開発は比較的簡単で、入門後は自分の軽量レベルIDEを簡単にカスタマイズできるようになりました.
    プラグインアドレス:
    github