为自定义Sublime Text 2代码片段定义范围

64

尝试为Sublime Text 2编写自己的代码片段时,我遇到了以下两个问题:

  1. 查找作用域键。我发现我可以逐个查看我的软件包,并查找对已声明的“scope”属性的引用。例如,在~/Library/Application Support/Sublime Text 2/Packages/JavaScript/Comments.tmPreferences(我的HTML软件包中的文件)中有以下两行:

    <key>scope</key>
    <string>source.js</string>
    
    所以,如果我想让当前的片段适用于 JavaScript 文件,我会定义它的作用域如下:
    <scope>source.js</scope>
    

    我假设所有这些范围键都是根据我安装的软件包动态定义的。Sublime Text是否在任何地方构建了一个列表,以便我更容易地引用?浏览大量软件包文件似乎过于繁琐。

    定义多个范围属性。这一点我已经弄清楚了,下面这行代码允许我的代码片段在HTML和JavaScript文件中工作。

    <scope>text.html, source.js</scope>
    
5个回答

146

这是在 Sublime Text 2 中使用的代码片段作用域列表 -

ActionScript: source.actionscript.2
AppleScript: source.applescript
ASP: source.asp
Batch FIle: source.dosbatch
C#: source.cs
C++: source.c++
Clojure: source.clojure
CoffeeScript: source.coffee
CSS: source.css
D: source.d
Diff: source.diff
Erlang: source.erlang
Go: source.go
GraphViz: source.dot
Groovy: source.groovy
Haskell: source.haskell
HTML: text.html(.basic)
JSP: text.html.jsp
Java: source.java
Java Properties: source.java-props
Java Doc: text.html.javadoc
JSON: source.json
Javascript: source.js
BibTex: source.bibtex
Latex Log: text.log.latex
Latex Memoir: text.tex.latex.memoir
Latex: text.tex.latex
LESS: source.css.less
TeX: text.tex
Lisp: source.lisp
Lua: source.lua
MakeFile: source.makefile
Markdown: text.html.markdown
Multi Markdown: text.html.markdown.multimarkdown
Matlab: source.matlab
Objective-C: source.objc
Objective-C++: source.objc++
OCaml campl4: source.camlp4.ocaml
OCaml: source.ocaml
OCamllex: source.ocamllex
Perl: source.perl
PHP: source.php
Regular Expression(python): source.regexp.python
Python: source.python
R Console: source.r-console
R: source.r
Ruby on Rails: source.ruby.rails
Ruby HAML: text.haml
SQL(Ruby): source.sql.ruby
Regular Expression: source.regexp
RestructuredText: text.restructuredtext
Ruby: source.ruby
SASS: source.sass
Scala: source.scala
Shell Script: source.shell
SQL: source.sql
Stylus: source.stylus
TCL: source.tcl
HTML(TCL): text.html.tcl
Plain text: text.plain
Textile: text.html.textile
XML: text.xml
XSL: text.xml.xsl
YAML: source.yaml
如果缺少了什么,请在这个要点中添加:https://gist.github.com/4705378

当我点击工具 -> 新建代码片段时,会打开一个文件,我想在那个文件上显示这个列表。因为我不经常去那里,但我也不想再次在Google上搜索。 - Omar Tariq
请收藏此页面。这样做比浏览一个庞大的列表,然后删除所有其他行要少得多。 - Bibhas Debnath
你的意思是说没有默认的代码片段文件? - Omar Tariq

79

查看光标位置的当前作用域

  1. 将光标放置在您想要知道其作用域的文件中。
  2. 使用此键盘快捷键:

    Windows: ctrl+shift+alt+p
    Mac: ctrl+shift+p

  3. Windows 中,当前作用域将显示在状态栏的左侧;Mac 中则显示在弹出窗口中。

将这些作为<scope>键填入您的foo.sublime-snippet文件中。

返回的作用域从通用到特定列出。选择最能够“范围化”代码片段以供制表符触发器使用的作用域(s)。


我在状态栏中没有看到这样的值。你能提供一张截图吗? - Šime Vidas
我也不知道。这一定是依赖于某个包。 - Bibhas Debnath
3
它取决于软件包;该软件包名为“Scope Hunter”,下面是我的回答中的链接。 - alexwlchan
42
在Mac OS X上,这是ctrl+shift+p。 - dain
2
对于那些没有看到状态栏价值的人,请看底部左侧。你应该会看到,例如,source.js。 - Jarrod

8
有一个名叫 Scope Hunter 的包,作者是 Isaac Muse,对于这个问题非常有帮助。
它可以显示文档中任何光标下的作用域,当我调试自己的片段时,我发现这非常有用。有时候非常详细; 来自我前面的文档的示例范围:
Scope: text.tex.latex
       meta.function.environment.list.latex
       meta.function.environment.general.latex
       meta.function.environment.math.latex
       string.other.math.block.environment.latex
       meta.group.braces.tex
       meta.space-after-command.latex

(为方便阅读而包裹的)

如果我花一周的时间逐个分析SL2,也不可能找到那个东西,但这个软件包只需要几秒钟就能找到。强烈推荐。

这种详细程度也意味着您可以非常精细地定义代码段,如果您想的话。例如,meta.function.environment.list.latex大致对应于LaTeX中的列表,因此我有一个代码段,在列表环境中按下super+enter时插入一个新的\item,而其他人则没有。我可以更有效地针对代码段进行定位,而不是盲目猜测。

源代码在Github上,或者可以通过Package Control安装它。


我刚刚卸载了它,因为我可以通过按键获取那些信息(如被接受的答案中所指定的)。 - fregante
感谢您对高度具体范围的有用性的指示笔记! - ptim

7

实际上,您可以使用Ctrl+Alt+Shift+P(无需使用Scope Hunter),它将在左侧底部栏中的Col/Line信息后立即显示范围。虽然字体很小,但它确实存在。


5
要回答问题#1,需要查看语法的.tmLanguage文件,寻找键:scopeName。这是语法用于片段作用域值的内容。
例如,来自nathos / sass-textmate-bundle的摘录。
<key>scopeName</key>
<string>source.sass</string>

因此,在您的代码片段中使用 source.sass

有关定义语法的更多信息,请参见此处。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接