符号
Sublime Text 提供对 符号导航(跳转到类和函数定义等)的基本支持。符号导航可以为任何类型的文件启用。
Sublime Text 中的符号导航框架严格基于文本。不会执行词法或语法分析。
格式
符号使用元数据文件定义。由于符号定义文件通常由包需要,因此为了方便起见,它们在本页中单独讨论。
与常规元数据文件一样,符号定义文件具有 .tmPreferences
扩展名并使用属性列表格式。文件名被 Sublime Text 忽略。
另请参阅
元数据 : 关于元数据文件的详细文档。
定义符号
Sublime Text 提供两种类型的符号列表:本地符号列表(活动文件)和全局符号列表(项目范围)。使用符号定义文件,您可以分别针对两者。
符号定义文件使用范围选择器来捕获源代码文件中的符号。
多个符号定义文件可以共存于同一个包中。例如,两个符号定义文件可以协同工作:一个定义所有符号,另一个可以选择性地隐藏一些符号,如果它们对用户来说不感兴趣。
让我们看一个符号定义文件的示例
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>name</key>
<string>Symbol List</string>
<key>scope</key>
<string>source.python meta.function.python, source.python meta.class.python</string>
<key>settings</key>
<dict>
<key>showInSymbolList</key>
<integer>1</integer>
</dict>
</dict>
</plist>
使用上面的文件,Sublime Text 将扫描源代码文件以查找范围名称 source.python meta.function.python
和 source.python meta.class.python
,并且其中的文本将被索引为符号。showInSymbolList
设置告诉 Sublime Text 使用本地符号列表。
文本转换
可以在符号显示给用户之前对其应用转换。符号转换由定义为使用 Oniguruma 语法的正则表达式的文本替换组成。
这是一个文本替换的示例
s/class\s+([A-Za-z_][A-Za-z0-9_]*.+?\)?)(\:|$)/$1/g;
在这种情况下,捕获的符号,例如 class FooBar(object)
,将在符号列表中显示为 FooBar(object)
。
让我们扩展我们之前的示例以使用符号转换
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>name</key>
<string>Symbol List</string>
<key>scope</key>
<string>source.python meta.function.python, source.python meta.class.python</string>
<key>settings</key>
<dict>
<key>showInSymbolList</key>
<integer>1</integer>
<key>symbolTransformation</key>
<string>
s/class\s+([A-Za-z_][A-Za-z0-9_]*.+?\)?)(\:|$)/$1/g;
s/def\s+([A-Za-z_][A-Za-z0-9_]*\()(?:(.{0,40}?\))|((.{40}).+?\)))(\:)/$1(?2:$2)(?3:$4…\))/g;
</string>
</dict>
</dict>
</plist>
符号定义文件的结构
所有元数据文件共享相同的顶层结构,该结构继承自属性列表格式。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
...
</dict>
</plist>
这些是符号定义文件中所有有效的元素
name
: 可选。符号定义的名称。被 Sublime Text 忽略。
<key>name</key>
<string>Some arbitrary name goes here</string>
scope
: 必需。Sublime Text 将用于在文件中捕获符号的范围名称的逗号分隔列表。
<key>scope</key>
<string>source.python meta.function.python, source.python meta.class.python</string>
settings
: 必需。 用于存放设置的容器。
<key>settings</key>
<dict>
...
</dict>
uuid
: 可选。 文件的唯一标识符。Sublime Text 会忽略此项。
<key>uuid</key>
<string>BC062860-3346-4D3B-8421-C5543F83D11F</string>
settings
子元素
showInSymbolList
: 可选。 将符号链接到本地符号列表。有效值为 0
或 1
。如果为 0
,则不会显示相应的符号。
<key>showInSymbolList</key>
<integer>1</integer>
showInIndexedSymbolList
: 可选。 将符号链接到全局符号列表。有效值为 0
或 1
。如果为 0
,则不会显示相应的符号。
<key>showInIndexedSymbolList</key>
<integer>1</integer>
symbolTransformation
: 可选。 针对本地符号列表。用分号分隔的文本替换列表,以正则表达式表示,使用 Oniguruma 语法。替换指令之间的空格会被忽略。
<key>symbolTransformation</key>
<string>
s/class\s+([A-Za-z_][A-Za-z0-9_]*.+?\)?)(\:|$)/$1/g;
s/def\s+([A-Za-z_][A-Za-z0-9_]*\()(?:(.{0,40}?\))|((.{40}).+?\)))(\:)/$1(?2:$2)(?3:$4…\))/g;
</string>
symbolIndexTransformation
: 可选。 针对全局符号列表。用分号分隔的文本替换列表,以正则表达式表示,使用 Oniguruma 语法。替换指令之间的空格会被忽略。
<key>symbolIndexTransformation</key>
<string>
s/class\s+([A-Za-z_][A-Za-z0-9_]*.+?\)?)(\:|$)/$1/g;
s/def\s+([A-Za-z_][A-Za-z0-9_]*\()(?:(.{0,40}?\))|((.{40}).+?\)))(\:)/$1(?2:$2)(?3:$4…\))/g;
</string>
导航符号
定义符号后,您可以使用标准键绑定来导航它们。
快捷键 | 描述 |
---|---|
F12 | 转到定义 |
Ctrl R | 显示本地符号列表 |
Ctrl ⇧ R | 显示全局符号列表 |
另请参阅
转到任何位置 : 使用“转到任何位置”浏览符号。