Sublime Text 3 中的自定义语法

2024-01-08

我正在努力找出如何使用新的 Sublime Text 3 创建新的语法突出显示.sublime 语法风格定义(之前的大多数答案都与旧的做法有关)。

从 Sublime Text Build 3084 开始,添加了新的语法定义格式,扩展名为 .sublime-syntax。

我可以找到:

  • 语法规则 https://www.sublimetext.com/docs/3/syntax.html
  • 范围命名规则 https://www.sublimetext.com/docs/3/scope_naming.html
  • 配色方案规则 https://www.sublimetext.com/docs/3/color_schemes.html

但我找不到最基本的信息来详细说明它们如何结合在一起!

我并不是想创建一个主题,或者调整现有的语法定义。我只想为带有我计划用于自己目的的扩展名的文件创建语法突出显示。

  1. 在语法定义中,我必须指定一个范围(例如范围:source.c)但是该范围文件位于哪里?或者更确切地说,我在哪里创建范围文件,如何命名它,以便加载?
  2. 我如何知道我的语法文件及其使用的范围文件已成功加载和应用?
  3. 是否有任何编译或刷新步骤,或者所有内容都会自动重新加载?

Thanks.


关于如何创建自定义语法的完整讨论远远超出了 Stack Overflow 答案这样简单的范围。另外,我认为你的问题比实际情况更复杂(尽管创建语法一般来说相当复杂)。

为了引导您完成创建自定义语法的步骤,这里有一个示例。

首先,创建一个包含以下内容的文件并将其保存在某个位置sample.ec, and 让文件保持打开状态:

// This is a line comment
if (x == 2)
    y = 1
else
    z = 1

您会注意到该文件的语法设置为Plain Text(参见右下角的状态行),这是 Sublime 未知的文件的默认语法。

现在,选择Tools > Developer > New Syntax...从菜单中。将出现一个包含以下内容的缓冲区。使用File > Save保存文件;该位置将默认为您的User包裹。您提供的名称并不重要,但请确保扩展名是sublime-syntax。在我的示例中,我正在调用我的文件Sample.sublime-syntax.

%YAML 1.2
---
# See http://www.sublimetext.com/docs/3/syntax.html
file_extensions:
  - ec
scope: source.example-c
contexts:
  main:
    # Strings begin and end with quotes, and use backslashes as an escape
    # character
    - match: '"'
      scope: punctuation.definition.string.begin.example-c
      push: double_quoted_string

    # Comments begin with a '//' and finish at the end of the line
    - match: '//'
      scope: punctuation.definition.comment.example-c
      push: line_comment

    # Keywords are if, else for and while.
    # Note that blackslashes don't need to be escaped within single quoted
    # strings in YAML. When using single quoted strings, only single quotes
    # need to be escaped: this is done by using two single quotes next to each
    # other.
    - match: '\b(if|else|for|while)\b'
      scope: keyword.control.example-c

    # Numbers
    - match: '\b(-)?[0-9.]+\b'
      scope: constant.numeric.example-c

  double_quoted_string:
    - meta_scope: string.quoted.double.example-c
    - match: '\\.'
      scope: constant.character.escape.example-c
    - match: '"'
      scope: punctuation.definition.string.end.example-c
      pop: true

  line_comment:
    - meta_scope: comment.line.example-c
    - match: $
      pop: true

现在打开 Sublime 控制台View > Show Console或按相关的按键绑定。您会看到控制台中的最后一行是这样的:

generating syntax summary

让控制台保持打开状态,单击语法文件,然后再次执行另一个保存操作,而不进行任何更改。同一行再次出现在控制台中。

  1. 是否有任何编译或刷新步骤,或者所有内容都会自动重新加载?

如此处所示,每次修改语法定义时,都会重新编译该文件并缓存结果。因此,没有编译步骤(除了保存),也不需要执行任何操作来刷新任何内容。

现在让我们将注意力转回示例文件。它仍然是开放的,语法仍然表明它是Plain Text.

现在关闭文件并再次重新打开它;一个快捷方式是使用File > Open Recent > Reopen Closed File或其关联的键绑定。

请注意,现在重新打开文件后,出现了一些更改。首先,窗口右下角的语法名称显示Sample(或者任何你命名的sublime-syntax上面的文件)。另一方面,文件的内容现在语法突出显示。

您看到的颜色取决于您使用的配色方案,但示例可能如下所示:

// This is a line comment
if (x == 2)
    y = 1
else
    z = 1
  1. 我如何知道我的语法文件及其使用的范围文件已成功加载和应用?

您可以看到,在保存更改时,由于没有错误消息而编译了语法文件,并且您可以通过尝试使用该语法来判断它已应用。

这里的语法是自动使用的,但是你会发现如果你检查View > Syntax或单击窗口右下角的当前语法名称,您的语法将出现在那里。同样,命令面板中现在有一个名为Set Syntax: Sample(管他呢)。

这就引出了你的最后一个问题。如果你回到你的sublime-syntax文件,您会在顶部看到:

# See http://www.sublimetext.com/docs/3/syntax.html
file_extensions:
  - ec
scope: source.example-c

首先要注意的是file_extensions包括ec,我们的示例文件名为sample.ec;因此,由于它的名称,此语法会自动应用于它。

现在切换到sample.ec文件,将光标放在缓冲区中的某个位置并使用Tools > Developer > Show Scope Name或按相关键。

出现的弹出窗口的内容将根据光标在文件中的位置而有所不同,但共同点是出现的范围始终以source.example-c.

  1. 在语法定义中,我必须指定一个范围(例如范围:source.c),但是该范围文件位于哪里?或者更确切地说,我在哪里创建范围文件,如何命名它,以便加载?

正如这里所看到的,不存在“范围文件”这样的东西;这sublime-syntax文件直接指定范围作为语法规则 https://www.sublimetext.com/docs/3/syntax.html,因此它是您为了创建语法而需要创建的唯一文件。它可能看起来像一个文件名,但它不是一个。

语法中应用的语法匹配规则的范围需要与配色方案中的范围一致,以便语法突出显示;这就是为什么你应该使用范围命名规则 https://www.sublimetext.com/docs/3/scope_naming.html使用所有语法共享的通用作用域集,除非您也打算这样做制定配色方案 https://www.sublimetext.com/docs/3/color_schemes.html与您的语法相一致,但除非您使用推荐的范围,否则您的语法将无法与其他配色方案很好地配合,并且您的配色方案也无法与其他语法很好地配合。

从这个起点开始,您可以修改sublime-syntax在此处保存文件,以便按照您想要的方式突出显示文件。这将包括更改顶部的基本范围,应用适当的扩展,然后包括与您的语言匹配的所有规则。

如上所述,创建与文件匹配的实际规则是创建语法中最复杂的部分,除非您的文件格式非常简单。它超出了 Stack Overflow 答案中可以传达的范围,但上面链接的官方文档为您提供了一些相关信息。

除了查看现有的语法文件以了解它们是如何做的之外,您还可以就以下问题提出更直接的问题:崇高论坛 https://forum.sublimetext.com/.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Sublime Text 3 中的自定义语法 的相关文章

随机推荐