The recent increase in the intimacy of sublime, previously just used it to write the web, now found to use it to write C + + is also very convenient, especially its intrusion-free mode is too good, so I simply got a C + + sublime build system, so in sublime can also compile C + +, in addition to not debugging, has been considered a development environment.
However, yesterday, I found that I used to use the visual assist in the sublime can not find a similar plug-in. In particular, ALT + up, ALT + down shortcut keys, in the VC is jump to the class or function definition, is one of my most commonly used shortcut keys. Well, since I can't find it, I'll make one myself.
In fact, it is not difficult to do plug-ins for sublime, Sublime is a script-driven Python, plug-ins are often used in python. On the Internet to read some information, and then look at the Sublime3\package\default directory inside a few py, I probably understand the idea of plug-ins.
First, in the Sublime3 installation directory \data\packages directory under the new directory, the name can be arbitrary, I named Jumptag.
Then, because I want to catch the shortcut keys, there will be. sublime-keymap files; To use Python, you must have a. py file. So create several files in this Jumptag directory: Default (Linux). Sublime-keymap, Default (OSX). Sublime-keymap, Default (Windows). Sublime-keymap and jumptag.py
Of these, three. sublime-keymap files are the same:
[ "Keys": ["Alt+up"], "command": "Jump_tag_prev"}, "keys": ["Alt+down"], "command": "Jump_ Tag_next "}]
In fact, it's JSON format, meaning to call the command Jump_tag_prev,alt+down call Jump_tag_next when you press Alt+up.
So where does the Jump_tag_prev, Jump_tag_next command be implemented? In the. py file, of course:
1 ImportSublime, Sublime_plugin2 ImportRe3 4 5_datas = {"view_id"70A"Recorder": None}6 7 classJumptagrecorder (Sublime_plugin. EventListener):8 defOn_modified_async (self, view):9_datas["view_id"] =view.id ();Ten_datas["Recorder"]=None; One A defOn_activated_async (self, view): -_datas["view_id"] =0; -_datas["Recorder"]=None; the - - defgen_recorder (view): - if(_datas["Recorder"] isNoneor_datas["view_id"] !=view.id ()): +_datas["view_id"] =view.id () -_datas["Recorder"]= View.find_all (r"(^(?! [\t]*?\b (if|while|for|try) \b) [\w \t*&]*?\ ([^ ()]*?\] (? =[\w\s]*?\{)) | (\bclass\b|\bstruct\b) [\w \t:,<>]+? (? =[\s]*?\{)") + A return_datas["Recorder"] at - - classJumptagprevcommand (Sublime_plugin. Textcommand): #注意看类的名字, corresponds to the Jump_tag_prev_command command - defRun (self, edit): -Reg_list =Gen_recorder (Self.view) - in ifReg_list isNone: - return to + forRegioninchSelf.view.sel (): -PT = Region the Break * $Closest_num = 999999999Panax NotoginsengClosest_region =Sublime. Region (0,0) - the forRegioninchreg_list: + ifRegion.end () <Pt.begin (): An = pt.begin ()-region.end () the ifN <Closest_num: +Closest_num =N -Closest_region = Region $ $ ifclosest_region.empty (): - return - the Self.view.sel (). Clear () - Self.view.sel (). Add (closest_region)Wuyi the self.view.show (Closest_region.begin ()) - Wu classJumptagnextcommand (Sublime_plugin. Textcommand): #这个类的名字对应了 jump_tag_next_command Command - defRun (self, edit): About $Reg_list =Gen_recorder (Self.view) - - ifReg_list isNone: - return A + forRegioninchSelf.view.sel (): thePT = Region - Break $ theClosest_num = 999999999 theClosest_region =Sublime. Region (0,0) the the forRegioninchreg_list: - ifRegion.begin () >pt.end (): inn = region.begin ()-pt.end () the ifN <Closest_num: theClosest_num =N AboutClosest_region = Region the the ifclosest_region.empty (): the return + - Self.view.sel (). Clear () the Self.view.sel (). Add (closest_region)Bayi theSelf.view.show (Closest_region.begin ())
A little bit of this code: because we want to jump between function definition and class definition, we have to find out the location of these definitions first, the function Gen_recorder is the job, I admit that the name of the letter is not a good drop. It calls a api:find_all of sublime, finds all the function definitions and class definitions by regular expressions, and I don't know if the regular expression is optimal, but the functionality is implemented.
Now that we have a function for defining the location, then when do we need to find the location of these definitions? You should know that full-text lookup is a relatively time-consuming operation and should not be called every time you press a shortcut key. We can save the defined position and look it up again when the document changes. Therefore, it is necessary to listen to the document modification events. It's also easy to define a listener:
classJumptagrecorder (Sublime_plugin. EventListener):#Note that the brackets must be sublime_plugin. EventListener defOn_modified_async (self, view):#Note the name of the function_datas["view_id"] =view.id (); _datas["Recorder"]=None; defOn_activated_async (self, view): _datas["view_id"] =0; _datas["Recorder"]= None;
The name of the class above is arbitrary, but note that the parentheses must be sublime_plugin. EventListener, the method of the class must follow the API documentation http://www.sublimetext.com/docs/3/api_reference.html
Finally, is the implementation of Jump_tag_prev, Jump_tag_next command, the code is very simple, I believe that no one can not understand. Note that the command corresponds to the class, can not be arbitrarily named, you must change the command name to "Hump", but also command, and must have a run method.
Simple, just realize a small plug-in! Yes, let me influence the more deep is sublime is hot load plug-in code, that is, once the plugin code is modified, sublime immediately reload, this is really convenient.
DIY Development Sublime plug-ins (1)