【问题标题】:Configure Build System to be automatically chosen based on file extension将构建系统配置为根据文件扩展名自动选择
【发布时间】:2013-07-13 08:59:18
【问题描述】:

我创建了一个新的构建系统来运行 GolfScript 程序。定义如下:

{
    "cmd": ["ruby", "D:\\w\\sublime\\golfscript.rb", "$file"]
}

这可行,但每当我需要使用它时,我必须手动将构建系统从“自动”切换到“golfscript”,然后将其切换回能够运行 Ruby、Python 等。

我想让我的构建系统在我打开 *.gs 文件时自动应用。

我已阅读 some docs 并知道我可以使用 选择器 来实现这一点,因此我在现有配置中添加了一个选择器:

{
    "cmd": ["ruby", "D:\\w\\sublime\\golfscript.rb", "$file"],
    "selector": "source.gs"
}

在阅读了更多文档/示例之后,我无法弄清楚如何告诉 sublime 选择器的实际含义。

如何配置 source.gs 选择器以指向 *.gs 文件?

【问题讨论】:

  • source.gs 范围是否应用于文件?您可以通过输入 ctrl+shift+alt+p(在 Windows 中)进行检查。光标处的作用域会显示在状态栏中。
  • @skuroda 感谢您的回复;它说text.plain。如何为 *.gs 文件定义选择器?

标签: sublimetext sublimetext3


【解决方案1】:

您需要为 GolfScript 创建一个语法文件。

将以下 XML 保存为 golfScript.tmLanguage 并将其放入 Packages/Golfscript 文件夹中,如 here 所述。

您可能需要重新启动 ST。

<?xml version="1.0" encoding="UTF-8"?>
<plist version="1.0">
<dict>
    <key>fileTypes</key>
    <array>
        <string>gs</string>
    </array>
    <key>name</key>
    <string>GolfScript</string>
    <key>patterns</key>
    <array>
    </array>
    <key>scopeName</key>
    <string>source.gs</string>
    <key>uuid</key>
    <string>c4c7fc10-d937-4f5d-9cb7-4316026457e5</string>
</dict>
</plist>

【讨论】:

  • 谢谢!现在,当在 *.gs 文件中按 CTRL+ALT+SHIFT+P 时,我在状态栏中看到 source.gs。但是,构建不起作用。我将其设置为自动并适用于 Ruby、Python 等,但不适用于 GolfScript。
  • 好的,我开始工作了;我在 *.sublime-build 文件中用"selector": "source.gs" 替换了"selector": ["source.gs"]
  • 很高兴你把一切都弄清楚了。如果您必须移动机器(只需复制一个目录),我只建议使用 User 文件夹以使其更容易。我认为文件的实际名称并不重要。只要它有.tmLanguage 扩展名。
  • 其实我认为.tmLanguage 文件的位置很重要。我试图移动它,而 Sublime 一直在抱怨。无论如何,我非常感谢你的帮助。我已经被困在这个问题上很长时间了。
  • 我在User/Syntax/ 中有一堆自定义的荧光笔。但只要你让它工作,没关系:)
【解决方案2】:

将构建与特定类型的文件相关联通常合适的做法是使用selector,它告诉 Sublime 如何根据相关文件类型选择构建。

但是,如果语言的扩展与该语言的正常扩展不匹配,或者没有可用的语法定义来提供适当的范围(因此该语言的语法突出显示),您可以通过sublime-build 文件中的file_patterns 键提供有关要使用的构建的提示,如documentation on build system options 中所述。

例如,假设 GolfScript 文件的扩展名为 gs

{
    "cmd": ["ruby", "D:\\w\\sublime\\golfscript.rb", "$file"],
    "file_patterns": ["*.gs"]
}

这将向 Sublime 表明对于任何具有此扩展名的文件,此构建都是适用的,并将被视为当前文件的潜在构建系统。

根据所讨论的文件类型,Sublime 可能会在您第一次运行构建时要求您选择正确的构建,类似于构建具有多个变体时会发生的情况。在这种情况下,系统会提示您选择构建,然后它将被记住以供将来构建,您需要使用Build With 再次选择。

例如,假设 .gs 文件与 Ruby 的语法相关联(例如),上面的构建和 Ruby 文件的构建(基于该构建系统中的 scope 选择器选择)将成为候选人,要求您在第一次构建时消除歧义。

【讨论】:

  • 感谢您的回答。好像file_patterns 不被ST2识别吧?
  • 不,它是在 ST3 中添加的。如果您使用 ST2,除了其他答案提到的关于制作假语法的内容。其他选项包括自定义键绑定,但 ST2 也没有增强的 build 命令,可让您触发它以进行不同的构建。
  • 感谢您的回答@OdatNurd!
  • 对于 ST2 @OdatNurd,不使用.sublime-build + .tmLanguage,是否可以只使用.sublime-buildstackoverflow.com/questions/8088475/…stackoverflow.com/questions/7574502/… 的方法?我还没能做到。
  • @Basj 取决于你想要做什么;它会将扩展名与文件类型相关联,但将启用该语言的所有功能。例如,.stuff 可以是 Python (.py),所以 Python 构建可以工作,但它也有 Python sn-ps,语法高亮为 Python 等。添加存根语言的想法是意味着有一个独特的scope,这样您就可以触发构建,而无需遵循该语言的所有其他功能。
【解决方案3】:

我们可以使用@skuroda 的方法,但是简化了:patternsuuid 似乎没有必要。

创建golfScript.tmLanguage

<?xml version="1.0" encoding="UTF-8" ?>
<plist version="1.0">
    <dict>
        <key>name</key>
        <string>GolfScript</string>
        <key>scopeName</key>
        <string>source.gs</string>
        <key>fileTypes</key>
        <array>
            <string>gs</string>
        </array>
    </dict>
</plist>

【讨论】:

    【解决方案4】:

    选择器可能有误。尝试使用 embedding.gs 而不是 source.gs

    {
        "cmd": ["ruby", "D:\\w\\sublime\\golfscript.rb", "$file"],
        "selector": "embedding.gs"
    }
    

    【讨论】:

      猜你喜欢
      • 2017-06-05
      • 2020-09-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-08
      • 1970-01-01
      • 2011-08-17
      相关资源
      最近更新 更多