跳至内容

符号

Sublime Text 提供对 符号导航(跳转到类和函数定义等)的基本支持。符号导航可以为任何类型的文件启用。

Sublime Text 中的符号导航框架严格基于文本。不会执行词法或语法分析。

格式

符号使用元数据文件定义。由于符号定义文件通常由包需要,因此为了方便起见,它们在本页中单独讨论。

与常规元数据文件一样,符号定义文件具有 .tmPreferences 扩展名并使用属性列表格式。文件名被 Sublime Text 忽略。

另请参阅

元数据 : 关于元数据文件的详细文档。

定义符号

Sublime Text 提供两种类型的符号列表:本地符号列表(活动文件)和全局符号列表(项目范围)。使用符号定义文件,您可以分别针对两者。

符号定义文件使用范围选择器来捕获源代码文件中的符号。

多个符号定义文件可以共存于同一个包中。例如,两个符号定义文件可以协同工作:一个定义所有符号,另一个可以选择性地隐藏一些符号,如果它们对用户来说不感兴趣。

让我们看一个符号定义文件的示例

xml
<?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.pythonsource.python meta.class.python,并且其中的文本将被索引为符号。showInSymbolList 设置告诉 Sublime Text 使用本地符号列表。

文本转换

可以在符号显示给用户之前对其应用转换。符号转换由定义为使用 Oniguruma 语法的正则表达式的文本替换组成。

这是一个文本替换的示例

perl
s/class\s+([A-Za-z_][A-Za-z0-9_]*.+?\)?)(\:|$)/$1/g;

在这种情况下,捕获的符号,例如 class FooBar(object),将在符号列表中显示为 FooBar(object)

让我们扩展我们之前的示例以使用符号转换

xml
<?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
<?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 忽略。

xml
<key>name</key>
<string>Some arbitrary name goes here</string>

scope : 必需。Sublime Text 将用于在文件中捕获符号的范围名称的逗号分隔列表。

xml
<key>scope</key>
<string>source.python meta.function.python, source.python meta.class.python</string>

settings : 必需。 用于存放设置的容器。

xml
<key>settings</key>
<dict>
   ...
</dict>

uuid : 可选。 文件的唯一标识符。Sublime Text 会忽略此项。

xml
<key>uuid</key>
<string>BC062860-3346-4D3B-8421-C5543F83D11F</string>

settings 子元素

showInSymbolList : 可选。 将符号链接到本地符号列表。有效值为 01。如果为 0,则不会显示相应的符号。

xml
<key>showInSymbolList</key>
<integer>1</integer>

showInIndexedSymbolList : 可选。 将符号链接到全局符号列表。有效值为 01。如果为 0,则不会显示相应的符号。

xml
<key>showInIndexedSymbolList</key>
<integer>1</integer>

symbolTransformation : 可选。 针对本地符号列表。用分号分隔的文本替换列表,以正则表达式表示,使用 Oniguruma 语法。替换指令之间的空格会被忽略。

xml
<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 语法。替换指令之间的空格会被忽略。

xml
<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显示全局符号列表

另请参阅

转到任何位置 : 使用“转到任何位置”浏览符号。