获取Sublime Text 3上的所有范围名称

web*_*eat 9 python sublimetext3 sublime-text-plugin

我正在为ST3创建一个插件,需要所有已定义范围的列表.我知道命中ctrl+alt+shift+p显示状态栏中的当前范围,但我无法为每个文件扩展名执行此操作.

编辑:

除了简单的.tmLanguage文件,我正在从内部提取.sublime-package文件和读取.tmLanguage文件.这增加source.php了列表中的一些条目.但 source.python仍然缺少!

实际上,python代码是:(这是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)
Run Code Online (Sandbox Code Playgroud)

它现在给出了这个列表:

"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"
Run Code Online (Sandbox Code Playgroud)

但我找不到像python这个列表中的一些语言.我猜其他文件存储在安装文件夹中的某些二进制文件中.如果这是真的那么解析文件怎么样?

web*_*eat 6

我刚刚发现其余的软件包存储在安装目录中.所以给出所有范围名称的最终代码是:

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)
Run Code Online (Sandbox Code Playgroud)

根据安装的包,此代码可能会给出不同的结果(某些包添加新的语法/范围名称).就我而言,结果是:

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
Run Code Online (Sandbox Code Playgroud)

  • 你也错过了标点符号等所有内置范围.*et.al. (2认同)