Sublime Text 3 - 在 package/plugin 中为文件类型设置语法

我正在忙于制作一个 Sublime Text 插件/包,以方便我们工作场所开发 Lua 脚本。

我们有几个不同的扩展名的 Lua 文件,用途不同。我希望 ST3 为这些文件提供正确的 Lua 语法。

我知道可以设置 ST3 记住特定文件扩展名的语法,并将其保存为(在我的情况下)Lua.sublime-settings 文件,保存在 AppData\Roaming\Sublime Text 3\Packages\User 中。

然而,如果我将此文件放在我的新插件文件夹中,它将被忽略。

我是否做错了什么,或者我想要的不可能?

点赞
用户814803
用户814803

这不起作用是因为语法特定的设置只从定义语法的软件包和User软件包中加载(因此用户可以自定义它们)。

以下是官方设置文档的引用:

按以下顺序查找设置文件:

1. Packages/Default/Preferences.sublime-settings
2. Packages/Default/Preferences (<platform>).sublime-settings
3. Packages/User/Preferences.sublime-settings
4. <Project Settings>
5. Packages/<syntax>/<syntax>.sublime-settings
6. Packages/User/<syntax>.sublime-settings
7. <Buffer Specific Settings>

仅从软件包本身和用户软件包中引用<syntax>

如果我必须猜测,我会说这是因为除了定义语法的原始软件包作者之外,所有其他设置都被认为是用户自定义设置,并且这些设置需要在User包(特别是在其根目录下)中确保它们被最后加载。

一个简单(但不理想)的解决方案是向用户说明他们必须手动进行此步骤。

另一种方法是在插件加载时添加一些插件代码来扩展设置:

def plugin_loaded():
    settings = sublime.load_settings("Lua.sublime-settings")
    extensions = settings.get("extensions", [])

    if "blarb" not in extensions:
        extensions.append("blarb")
        settings.set("extensions", extensions)
        sublime.save_settings("Lua.sublime-settings")

如果您采用这种方法,可能希望在某些地方(例如特定于您的软件包的设置中)包含额外的哨兵设置,指示您是否这样做,而不是像上面的示例那样强制设置。

实际上,您将检查是否设置了该哨兵而不是强制扩展名,以便如果用户决定为您的文件使用其他语法,您不会将其强制到Lua语法中。

还可以定义自己的语法,只需嵌入标准Lua语法,就可以使其正常工作而无需编写任何代码或让用户执行任何操作:

%YAML 1.2
---
name: Blarb
scope: source.lua
file_extensions:
  - blarb

contexts:
  main:
    - include: scope:source.lua

这样做后,文件中的范围仍将是source.lua,因为语法文件中的scope就是这样写的。状态行将将语法名称设置为Blarb。如果需要,可以修改其中任何一个来更改顶级作用域或显示名称。

例如,更改作用域为source.blarb,以便可以创建仅适用于特定变体的Lua文件的键绑定/片段。

这种方法的潜在缺点/功能是,由于语法特定设置的名称来自提供语法的文件的名称,因此如果用户有任何Lua特定设置,则这些设置默认情况下不适用于您的Blarb文件。

同样,任何通过检查作用域source.lua进行特殊设置的Lua特定内容,在Blarb文件中也不起作用,原因相同,这可能是一个问题或不是问题。

2018-01-23 03:09:42