首页 > 解决方案 > XML 的符号列表定义

问题描述

使用 Sublime Text 3,我一直致力于为看起来不错的 XML 文件定义符号列表。

到目前为止,我已经取得了一些可行的东西。对于这个 XML 示例:

<?xml version="1.0" encoding="UTF-8"?>
<definition assembly="com.bla" version="1.0">
    <string name="parent"/>
        <child name="child" />
    </string>
</definition>

我可以得到:

符号

使用:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//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>text.xml meta.tag.xml</string>
    <key>settings</key>
    <dict>
        <key>showInIndexedSymbolList</key>
        <integer>1</integer>
        <key>showInSymbolList</key>
        <integer>1</integer>
    </dict>
</dict>
</plist>

但是,我想在父级下缩进子级并删除结束标签。这些可能吗?

标签: xmlsublimetext3symbols

解决方案


您需要XML 语法定义以不同的方式限定结束标记,以便能够将它们从符号列表中排除,因为指示在符号列表中放置什么的逻辑仅基于语法定义分配的范围。即假设您将语法定义修改为范围结束标记为meta.tag.xml.closing,您的范围选择器可能看起来像<string>text.xml meta.tag.xml - meta.tag.xml.closing</string>,并且您只会得到开始(和自结束)标记。


至于缩进,这通常是通过使用正则表达式转换来完成的,这并不是真正为递归嵌套而设计的,因为通常没有足够的上下文可供正则表达式替换工作。

一种解决方法是再次修改语法定义以将元范围应用于每个标记的内容,并让多个tmPreferences文件在比前一个更具体的嵌套上进行操作,并且只是对缩进进行硬编码,但这会仅限于您为正确处理多少嵌套而创建的文件数量,但无论 XML 文件的布局如何,它都可以工作。

如果您的 XML 文件已经很好地缩进(- 并且有插件,如果没有的话),那么您可以通过更改语法定义来实现您想要的,以在打开标记之前限定空白。将其限定为meta.tag可能会干扰一些依赖此范围的 ST 内置命令,因此最好添加一个单独的范围来覆盖空白和标签本身,从而使原始meta.tag范围保持不变。使用这种方法,符号已经包含来自文件的相同缩进,并且您可以潜在地将 4 个空格转换为 1,例如,使符号索引看起来不像主文档那样缩进。


推荐阅读