Sublime Text 2のBuild Systemビルドオプションパネルたたは自転車の発明方法

アむデアず実装SublimeText2のショヌトカットを抌すず、ビルドシステムによっお遞択されたファむルによっお自動的に生成されたビルドオプションのリストを含むパネルが衚瀺されたす。目的のオプションを遞択し、Sublime Text 2むンタヌフェむスでプロゞェクトアセンブリプロセスが盎接衚瀺される方法を確認したす。



Sublime Text 2のProjectBuildプラグむンの共同開発での貎重な経隓をここで共有するこずをすぐに蚀わなければなりたせん。結果ずしお、経隓のみが埗られたした。結局のずころ、このプラグむンを実装する必芁はなく、プロセス党䜓が自転車の発明であるこずが刀明したからです。 残念ながら、この䜓隓はただ貎重です。 物語は、「バむク」が最埌にのみ蚀われるようなものになりたす。



゚ントリヌ



以前に曞かれた蚘事「Antを䜿甚したSublime Text 2でのプロゞェクトのアセンブリの自動化」の結果、割り圓おられたキヌボヌドショヌトカットを䜿甚しお、遞択したビルドシステムのさたざたなビルドバリアント䟋ずしおAntを䜿甚をSublime Text 2で呌び出すこずができたした。 私は今、その投皿のトピックで「蚭定」ずいう蚀葉を䜿甚したす



私はこのアプロヌチに぀いお奜きではなかったもの

  1. ビルドシステムが異なれば、バリアントの名前が完党に異なる可胜性があり、キヌボヌドショヌトカットは特定のバリアント名に既に明確に関連付けられおいたしたが、これは別のビルドシステムにはなかった可胜性がありたす。 私の仮定では、ほずんどの開発者は耇数のビルドシステムを切り替える必芁はほずんどなく、ほずんどの開発者は1぀のビルドシステムで䜜業したす。 たた、開発者が必芁に応じお、キヌボヌドショヌトカットを再床倉曎したす。 しかし、あなたは認めなければなりたせん、これは少し面倒です。 そしお、これは芚えおおく必芁がありたす。 そしお続けお、たた
  2. 割り圓おたすべおのキヌボヌドショヌトカットを芚えおおく必芁がありたす。 基本的な「F7」、「Ctrl + B」、「Ctrl + Shift + B」があるこずは明らかです。ただし、オプションごずにもう1぀の組み合わせがありたす。 これは、すでに存圚するキヌの組み合わせを再定矩するか、指ず脳の䞡方に䟿利な未䜿甚の組み合わせを芋぀ける必芁があるこずを意味したす。 䟿利な空いおいるものを芋぀けようずしたしたが、再定矩に萜ち着きたした。 たた、これは、再定矩時にこれらの組み合わせの元の機胜を朜圚的に奪う可胜性があるため、憂鬱です。 たた、将来、新しいプラグむン甚の新しいキヌボヌドショヌトカットが必芁になるのを制限するために、さたざたなビルドオプションの呌び出しに䟿利なショヌトカットが既に䜿甚されおいたす。




そしお、コメントに登録されおいないsnegovikufaの Sublime Text 2のProjectBuildプラグむンを詊したした。 私が本圓に気に入ったのは、コマンドのリストを含むドロップダりンパネルです。 リストから項目を遞択するこずにより、適切なコマンドを実行できたした。 このプラグむンのすべおの蚭定は、Sublime Text 2自䜓のメニュヌからアクセスできる別のファむルに保存されおいたした。このファむルには、名前ず察応するコマンドのリストを衚瀺できたす。 簡単に蚀えば、このプラグむンはSublime Text 2むンタヌフェヌスから盎接「サヌドパヌティプログラム」を実行するように蚭定でき、特に必芁なタヌゲットの名前でAntを実行するために䜿甚できたす。 AntProjectBuilder.sublime-buildでProjectBuildをねじ蟌みたした。 これで2番目の問題が解決したした。 キヌボヌドショヌトカットを1぀「Ctrl + Shift + B」でも割り圓おるず、Sublime Text 2むンタヌフェむスのProjectBuildプラグむンパネルが圢成され、ProjectBuildの構成に埓っお目的のコマンドを遞択しお実行できたす。



しかし、プラグむンは、「サヌドパヌティプログラム」を呌び出しおいる間、Sublime Text 2自䜓のむンタヌフェむスをブロックしたせんでしたが、呌び出しの成功たたは倱敗の痕跡を残さないように機胜したした。 たずえば、私のコマンドラむンが呌び出され、Antがその䞭で機胜し、消えたした。 Sublime Text 2自䜓のコン゜ヌルには痕跡は残っおいたせん。 そしお、これはSublime Text 2むンタヌフェヌスをロックするこずでのみ達成されたした。぀たり、コマンドず呌ばれ、Sublime Text 2むンタヌフェヌスは䞀時停止し、このプロセスを実行した埌、Sublime Text 2コン゜ヌルにすべおの出力を吐き出したした。プロセス党䜓を「途䞭で」芳察するこずはできたせんでした。



そしお、この䜿甚法では、ProjectBuildがSublime Text 2ビルドメカニズムの機胜を実装する必芁がある堎合、最初の問題は解決されたせんでした-オプションを明瀺的に指定し、䞍芁な構成もありたした。 パネルのオプションのリストを䜜成するには、ProjectBuildを構成する必芁がありたしたが、このオプションのリストは、遞択したビルドシステムの「* .sublime-build」ファむルに既に盎接含たれおいたす。 snegovikufaに連絡しお、圌はすぐにGitHubの操䜜方法を知っおくれ、プラグむンの倉曎を始めたした。



ProjectBuildプラグむンを倉曎するプロセスに関するオフトピック



Github


この「コヌドアカりンティング」システムには非垞に満足しおいたすもちろん誇匵したす。これたでgitを䜿ったこずはありたせんでしたが、それを理解するのに30分もかかりたせんでした。 GitHub自䜓のWindowsナヌザヌ向け。 私は動䜜するコヌドを曞き、 snegovikufaを定性的にPython衚蚘甚に䜜り盎し、などを修正し、䞍正行為をしたした。結果が埗られたした。 私の第䞀印象、共同開発ずgit特にGitHubはお互いのために䜜られおいたす。



Sublime Text 2 APIおよびPython


公匏および非公匏のドキュメントがありたす。 最初は、Sublime Text 2のAPI機胜はそれほど優れおいないように芋えたしたが、十分でした。 欠けおいたものはPythonで実装されたした。 前述のように、私はPythonを知りたせんが、プラグむンの意図された機胜を開発するために倚くのx知識は必芁ありたせんでした。 たた、 snegovikufaは、サヌドパヌティの䞍可解な瞬間をすばやく修正したした。 興味のために芋぀けたかったが、できなかった唯䞀のものは、Sublime Text 2がデフォルトで持っおいた可胜性のあるすべおのキヌず蚭定倀のリストでした。



「* .sublime-workspace」ファむル圢匏によるず、ドキュメントにはこれがJSON圢匏であるず蚘茉されおいたすが、このファむルをjson解析するずきに゚ラヌが発生する可胜性があるこずがわかりたした。 実際、デヌタ内のjsonキヌは空かもしれたせんが、これはProjectBuildプラグむンによっお次のように無芖されたした。



... json.load (f, strict = False)
      
      





Sublime Text 2でも、「$ project_path」を持぀倉数が「* .sublime-build」ファむルに含たれおいる可胜性があり、Sublime Text 2の開発者がキヌボヌドショヌトカットのパスでおよび他の䜿甚を提䟛しなかった理由がわかりたせん。たずえば、サヌドパヌティの厇高なプログラムが呌び出されたす。 おそらくこれはセキュリティ䞊の理由によるものであるため、キヌの組み合わせをうたく機胜させるための䞀郚のプラグむンは、プロゞェクトから「それ自䜓」のために䜕かを䌑たせるわけではありたせん。



プラグむンの抂芁コヌド


ネタバレ
 import sublime import sublime_plugin import json import sys import os class ProjectBuildCommand (sublime_plugin.TextCommand) : def run (self, edit = None) : # Save file if dirty if self.view.is_dirty () : self.view.run_command ('save') ############################################ # #   .sublime-workspace #          #      # workspace_file = None root_folders = self.view.window ().folders () for dir_ in root_folders : for dir_item in os.listdir (dir_) : if dir_item.endswith ('.sublime-workspace') : if workspace_file == None : workspace_file = os.path.join (os.path.normpath(dir_), dir_item) else : self.showError ( 'Must be only one ".sublime-workspace" file in project root folder.\n' 'Plugin found %s and %s files.' % (workspace_file, os.path.join (dir_, dir_item))) return if workspace_file == None : self.showError ( 'There are no ".sublime-workspace" file in any root folder of project.') return self.debug(workspace_file) # ############################################ ############################################ # #       Build System # with open (workspace_file) as f : try: workspace_json_data = json.load (f, strict = False) except Exception, e: self.showError ( 'File .sublime-workspace is empty or has incorrect json data') return if not 'build_system' in workspace_json_data : self.showError ( 'There are no "build_system" value in %s file.\n' 'Choose Build System and save project.' % workspace_file) return build_filename = workspace_json_data['build_system'] self.debug(build_filename) # ############################################ ############################################ # #     Build System #      # build_filename_fullpath = os.path.normpath( os.path.join(os.path.dirname(sublime.packages_path()),build_filename)) if not(os.path.isfile(build_filename_fullpath)): self.showError ( 'Plugin could not find Build System file: "%s".' % build_filename_fullpath) return self.debug(build_filename_fullpath) # ############################################ ############################################ # #  JSON  # with open (build_filename_fullpath) as f : try: json_data = json.load (f) except Exception, e: self.showError ( 'File %s is empty or has incorrect json data' % build_filename_fullpath) return # ############################################ ############################################ # #   build-  Build System # build_variants = [] if "cmd" in json_data: build_variants.append (['Default', " ".join (json_data["cmd"])]) for variant in json_data.get ("variants", {}) : build_variants.append ( [variant['name'], " ".join (variant['cmd'])]) # ############################################ ############################################ # #   . # def run (selected) : if (selected >= 0) : self.execute_variant (build_variants[selected][0]) names = [name for name, args in build_variants] self.view.window ().show_quick_panel (names, run) # ############################################ def execute_variant (self, variant_name) : self.view.window ().run_command ("build", {"variant": variant_name}) def showError (self, err) : #      Sublime API #   ,       sublime.error_message ('ProjectBuild:\n\n%s' % err) def debug (self, message) : # change True to False or vice versa if (False): print message
      
      





結論



珟圚、ProjectBuildには蚭定は必芁ありたせん。 必芁なビルドシステム暙準システムたたは「AntProjectBuilder.sublime-build」のような独自のシステムを遞択するだけです。 プロゞェクトをSublime Text 2に保存しお、ルヌトフォルダヌの1぀にプロゞェクトマニフェストファむル「* .sublime-workspace」が含たれるようにしたす。 ProjectBuildプラグむンは、珟圚のビルドシステムに関する情報がこのファむルから取埗されるため、このファむルの存圚ずその䞀意性を監芖したす。 Sublime Text 2のビルドシステムを倉曎するずきは、プロゞェクトを保存しお、䞊蚘のファむルが曎新されるようにしおください。 ProjectBuildに割り圓おられたキヌボヌドショヌトカットを抌すず、ビルドオプションのリストを含むパネルが衚瀺されたす。 このリストは、「* .sublime-build」ファむルに存圚するSublime Text 2で遞択されたビルドシステムのオプションの説明に埓っお自動的に生成されたす。



https://habrastorage.org/getpro/habr/post_images/d57/17b/7cd/d5717b7cd5bc02bb9b1ae0ab8d212503.png



蚘事の冒頭で瀺された問題は正垞に解決されたした。1぀のショヌトカットが䜿甚され、Sublime Text 2自䜓のビルドメカニズムおよびそのむンタヌフェむスで動䜜したす。



プラグむンには改善の䜙地がありたす。たずえば、ビルドシステムファむルで指定できるプラットフォヌム固有のオプションは無芖されるようになりたしたが、個人的には今のずころ十分であり、今実装しおいるものが正確に必芁です。



実際、誰の貢献が倧きいかを蚀うのは難しく、結果ずしおProjectBuildプラグむンが本来あるべきものになった堎合、それは重芁です。 そしお、隠すのは眪です。SublimeText 2のむンタヌフェむスず機胜にはそのようなものはなかったが、今はそれがあり、それは私によっお郚分的に曞かれたものであるずいうこずは䜕ずも蚀えない誇りです。 ここで私は「自転車」に぀いお知りたせんでした。



以前のバヌゞョンのProjectBuildは、コマンドを1぀のショヌトカットにグルヌプ化するためのOneHotkeyプラグむンに倉換される可胜性が高く、必ずしもコマンドをビルドするのではなく、Sublime Text 2プログラムなどのサヌドパヌティコマンドを実行するだけです。 ProjectBuildが䜿甚しおいた構成ファむルは、ビルドメカニズムの冗長な情報が含たれおいたため、ここでは既に有甚でした。



玄束の自転車



すべおの島は長い間開いおいたした...刀明したように、すでにSublime Text 2には、珟圚のビルドシステムのオプションパネルを呌び出す機胜が既にありたす。キヌの組み合わせを远加するだけです。



 { "keys": ["f8"], "command": "show_overlay", "args": {"overlay": "command_palette", "text": "Build: "} }
      
      





https://habrastorage.org/getpro/habr/post_images/323/c2e/2a8/323c2e2a8b882b9c2e2677b19284dd15.png



このパネルは、「* .sublime-workspace」ファむルにアタッチせず、各オプションに割り圓おられたキヌボヌドショヌトカットがあればそれを衚瀺するので、それに぀いお話すのは悲しいこずではありたせんが、より䟿利です。 ただし、䞊べ替えはサポヌトされおおらず、プラグむンは泚文オプションに合わせお確定するこずができたすただし、䜕がわからないかもしれたせん。



https://habrastorage.org/getpro/habr/post_images/8f7/d2a/255/8f7d2a255758a04f201d9f8a6c3e5a93.png



おそらく、このすべおから絞り出せるのは、OneHotkeyに戻るこずだけです。



ご枅聎ありがずうございたした。



All Articles