Get all area names in Sublime Text 3

I am creating a plugin for ST3 and need a list of all defined areas. I know that pressing ctrl+alt+shift+p shows the current scope in the status bar, but I cannot do this for each file extension.

Edit:

In addition to simple .tmLanguage files .tmLanguage I extract the .sublime-package files and read the .tmLanguage files from the inside. This added some entries, such as source.php to the list. But source.python is still missing!

Actually python code: (this is for Python 3.3)

 import sublime, sublime_plugin, os, subprocess, glob, tempfile, plistlib from zipfile import ZipFile def scopes_inside(d): result = [] for k in d.keys(): if k == 'scopeName': result = result + [ s.strip() for s in d[k].split(',') ] elif isinstance(d[k], dict): result = result + scopes_inside(d[k]) return result scopes = set() for x in os.walk(sublime.packages_path() + '/..'): for f in glob.glob(os.path.join(x[0], '*.tmLanguage')): for s in scopes_inside(plistlib.readPlist(f)): scopes.add(s.strip()) for x in os.walk(sublime.packages_path() + '/..'): for f in glob.glob(os.path.join(x[0], '*.sublime-package')): input_zip = ZipFile(f) for name in input_zip.namelist(): if name.endswith('.tmLanguage'): for s in self.get_scopes_from(plistlib.readPlistFromBytes(input_zip.read(name))): scopes.add(s.strip()) scopes = list(scopes) 

And now he gives this list:

 "font", "license", "source.c++", "source.cmake", "source.coffee", "source.css", "source.d", "source.disasm", "source.dockerfile", "source.gdb.session", "source.gdbregs", "source.git", "source.gradle", "source.groovy", "source.gruntfile.coffee", "source.gruntfile.js", "source.gulpfile.coffee", "source.gulpfile.js", "source.ini", "source.ini.editorconfig", "source.jade", "source.jl", "source.js", "source.json", "source.json.bower", "source.json.npm", "source.jsx", "source.less", "source.php", "source.procfile", "source.puppet", "source.pyjade", "source.qml", "source.rust", "source.sass", "source.scss", "source.shell", "source.stylus", "source.swift", "source.yaml", "source.zen.5a454e6772616d6d6172", "text.html.basic", "text.html.mustache", "text.html.ruby", "text.html.twig", "text.slim", "text.todo" 

But I can not find languages ​​like python in this list. I think others are stored in some binaries somewhere in the installation folder. If so, how is the file syntax handled?

+7
python sublimetext3 sublime-text-plugin
May 10 '15 at 15:20
source share
1 answer

I just found the remaining packages that are stored in the installation directory. Thus, the final code that gives all the domain names:

 import sublime, sublime_plugin, os, subprocess, glob, tempfile, plistlib from zipfile import ZipFile # This function gives array of scope names from the plist dictionary passed as argument def scopes_inside(d): result = [] for k in d.keys(): if k == 'scopeName': result = result + [ s.strip() for s in d[k].split(',') ] elif isinstance(d[k], dict): result = result + scopes_inside(d[k]) return result # Using set to have unique values scopes = set() # Parsing all .tmLanguage files from the Packages directory for x in os.walk(sublime.packages_path()): for f in glob.glob(os.path.join(x[0], '*.tmLanguage')): for s in scopes_inside(plistlib.readPlist(f)): scopes.add(s.strip()) # Parsing all .tmLanguage files inside .sublime-package files from the Installed Packages directory for x in os.walk(sublime.installed_packages_path()): for f in glob.glob(os.path.join(x[0], '*.sublime-package')): input_zip = ZipFile(f) for name in input_zip.namelist(): if name.endswith('.tmLanguage'): for s in self.get_scopes_from(plistlib.readPlistFromBytes(input_zip.read(name))): scopes.add(s.strip()) # Parsing all .tmLanguage files inside .sublime-package files from the Installation directory for x in os.walk(os.path.dirname(sublime.executable_path())): for f in glob.glob(os.path.join(x[0], '*.sublime-package')): input_zip = ZipFile(f) for name in input_zip.namelist(): if name.endswith('.tmLanguage'): for s in self.get_scopes_from(plistlib.readPlistFromBytes(input_zip.read(name))): scopes.add(s.strip()) scopes = list(scopes) 

This code may give different results depending on the installed packages (some packages add new syntax / scope names). In my case, the result was:

 font license source.actionscript.2 source.applescript source.asp source.c source.c++ source.camlp4.ocaml source.clojure source.cmake source.coffee source.cs source.css source.d source.diff source.disasm source.dockerfile source.dosbatch source.dot source.erlang source.gdb.session source.gdbregs source.git source.go source.gradle source.groovy source.gruntfile.coffee source.gruntfile.js source.gulpfile.coffee source.gulpfile.js source.haskell source.ini source.ini.editorconfig source.jade source.java source.java-props source.jl source.js source.js.rails source.json source.json.bower source.json.npm source.jsx source.less source.lisp source.lua source.makefile source.matlab source.nant-build source.objc source.objc++ source.ocaml source.ocamllex source.ocamlyacc source.pascal source.perl source.php source.procfile source.puppet source.pyjade source.python source.qml source.r source.r-console source.regexp source.regexp.python source.ruby source.ruby.rails source.rust source.sass source.scala source.scss source.shell source.sql source.sql.ruby source.stylus source.swift source.tcl source.yaml source.zen.5a454e6772616d6d6172 text.bibtex text.haml text.html.asp text.html.basic text.html.erlang.yaws text.html.javadoc text.html.jsp text.html.markdown text.html.markdown.multimarkdown text.html.mustache text.html.ruby text.html.tcl text.html.textile text.html.twig text.log.latex text.plain text.restructuredtext text.slim text.tex text.tex.latex text.tex.latex.beamer text.tex.latex.haskell text.tex.latex.memoir text.tex.latex.rd text.tex.math text.todo text.xml text.xml.xsl 
+4
May 11 '15 at 14:54
source share



All Articles