SublimeText 如何让自定义语法做一些基本的事情?

问题描述 投票:0回答:1

我正在尝试为纯文本文件创建自己的语法定义。

我可能以一种非常hacky的方式做到这一点,但它似乎工作正常。我如何找到更多“颜色”,例如:

keyword.control.c
string.quoted.double.c
constant.numeric.c

因为我想在我的文本文件中撒上更多颜色......主要是红色和蓝色。

当前着色(我想要更多!)

我正在使用

Plain Text Coloured.sublime-syntax

它看起来像这样:

%YAML 1.2

---

# http://www.sublimetext.com/docs/syntax.html

name: Plain Text Coloured

file_extensions: [txt]

scope: source.txt

contexts:
  
  main: 
    # Purple
    - match: (MONDAY|TUESDAY|WEDNESDAY|THURSDAY|FRIDAY|SATURDAY|SUNDAY|CODEX|SORTIUM|LEXICANUM|GAWK|PCB NONSOMNUS|NONSOMNUS|MUTIM|PCB MUTIM|MUTIM|AQOS)
      scope: keyword.control.c

    # Green
    - match: '=='
      scope: string.quoted.double.c
    - match: '--'
      scope: string.quoted.double.
    - match: ':'
      scope: string.quoted.double.c
    - match: '✔'
      scope: string.quoted.double.c
    - match: '→'
      scope: string.quoted.double.c
    - match: '←'
      scope: string.quoted.double.c
    - match: '↑'
      scope: string.quoted.double.c
    - match: '↓'
      scope: string.quoted.double.c
    - match: '|'
      scope: string.quoted.double.c

      # Orange
    - match: '~'
      scope: constant.numeric.c 
    - match: '✗'
      scope: constant.numeric.c 
    - match: '>='
      scope: constant.numeric.c 
    - match: '<='
      scope: constant.numeric.c 
    - match: '>'
      scope: constant.numeric.c 
    - match: '<'
      scope: constant.numeric.c 
    - match: '±'
      scope: constant.numeric.c 
    
      # Red highlight
      # scope: constant.character.escape.c
    
    # - match: '..'
      # scope: constant.other.markdown
      # scope: keyword.txt
      # scope: comment.txt
      # Potential lexicanum :: Morphims | Alchemy | Necromancy  | Conjure | Exorcisim | Rune

我尝试四处寻找 C for sublime 的语法定义,但找不到任何内容,这是否是正确的搜索查询?

text syntax-highlighting sublimetext
1个回答
0
投票

Sublime 中的语法定义提供了

semantic
有关文本的信息;这些颜色实际上是由您的
color scheme
应用的。

例如,您的语法示例包含以下内容:

    - match: '~'
      scope: constant.numeric.c 

这告诉语法系统它应该将

constant.numeric.c
的语义范围应用于它碰巧看到的任何
~
。此处使用的名称完全是自由形式,由语法定义的作者(在本例中为您)决定。

导致文件中显示橙色的是配色方案的这一部分(此处的示例是

Mariana
):

        {
            "name": "Number",
            "scope": "constant.numeric",
            "foreground": "var(orange)"
        },

这里的配色方案规则规定,任何具有与

semantic scope
匹配的
constant.numeric
的内容都应显示为名为
orange
的变量中定义的任何颜色。

正如我上面提到的,语法定义所应用的

scope
是完全开放的;您可以为事物使用任何您想要的名称。然而,为了让与其匹配的东西显示为特定的颜色,配色方案必须有一个像上面那样的规则,告诉 Sublime 当它遇到一种颜色时使用什么颜色。

一般来说,有一组用于事物(在您的示例中为数字)的名称,这些名称用于所有语法定义,以便无论使用什么语言,单一配色方案都可以应用正确的颜色。

例如,

C
C++
Python
Java
都会将其数字显示为橙色,让您作为编辑文件的人更容易识别事物。

(旁注:请注意,示例中的

scope
constant.numeric.c
但配色方案仅匹配
constant.numeric
;这允许您拥有针对某些目的更具体的配色方案规则,例如如果您强烈希望橙色数字除了 Java 之外,您希望它们是紫色的,在这种情况下,您可以有一个仅匹配中的数字的配色方案规则。
java
)。

基于此,您有几个选项可以做您想做的事:

  1. 您可以继续上面的方式;如果您想要其他颜色,请在某个源文件中找到您想要的颜色,然后使用

    Tools > Developer > Show Scope Name
    查看对其应用了哪些名称,然后在语法中使用该名称。

  2. 您可以应用对您在语法中尝试执行的操作具有更多语义“意义”的名称,然后向应用您想要的颜色的配色方案添加规则。

#1 的优点是更容易做到;有人已经设置了配色方案,因此您只需使您的语法执行其他语法正在执行的操作即可。缺点是您只能使用配色方案中常用的颜色。

#2 的优点是你可以完全控制你想要的颜色,但代价是必须做更多的工作。

这是一个简单的例子;语法规则如下:

    - match: '~'
      scope: custom.orange

从命令面板中选择

UI: Customize Color Scheme
,然后在右侧显示的文件的
rules
部分中添加:

        {
            "name": "Custom text that is orange",
            "scope": "custom.orange",
            "foreground": "var(orange)"
        },

现在文本应该是原来的颜色,但您可以:

  1. 修改
    foreground
    ,说把东西变成蓝色,令人困惑:
            "foreground": "var(blue6)"
    
  2. 添加
    background
    以引起注意
            "background": "var(black)"
    
  3. 包含
    font_style
    可使文本变为粗体、斜体、下划线、发光或三者的某种组合:
            "font_style": "bold italic underline glow"
    

Example of single rule

作为旁注,您可能需要将语法顶部的

scope
更改为:

scope: text.plain.custom

Sublime 中的各种机制根据作用域的开始方式推断当前文件是源代码还是纯文本;

source.text
的范围使其认为它是源代码文件。因此,通常在常规文本文件中工作的
lorem
片段之类的东西在这里不起作用。

但是,这可能是您的意图,在这种情况下没关系。 :)

© www.soinside.com 2019 - 2024. All rights reserved.