如何为Sublime Text 3创建新的语法语言定义?

时间:2015-11-26 16:17:46

标签: sublimetext3 syntax-highlighting

我想为具有特定格式的日志文件设置新的语言定义。我一直在搜索互联网,寻找一个真正有效的教程,我还没找到。我已经尝试创建sublime-syntax个文件,AAAPackageDev个文件(包括JSON和YAML),还有一个我无法记住其名称的语法包 - 它们似乎都没有工作,其中一些遗漏了重要的细节,比如保存文件的位置,如何让语法定义作为选项出现(我怀疑这与保存位置有关),或者keyword.other.joelog范围与keyword.other主题颜色(您是否只删除最后一位?最后一位是否必须与标题中设置的范围相匹配?)。这非常令人沮丧。

最简单的是,我想采取以下文件并突出显示:

2015-11-25 14:35:11 [LOG] Blah Blah Blah
2015-11-25 14:35:11 [LOG] some log statement
2015-11-25 14:35:11 [LOG] some other log statement
2015-11-25 14:35:11 [DEBUG] some embedded filename: [[ /path/to/file ]]
2015-11-25 14:35:11 [INFO] .............. blah blah ..............
2015-11-25 14:35:11 [DEBUG] <<PASS>> Directory not found: [[ /some/dir/name ]]
2015-11-25 14:35:11 [ERROR] <<FAIL>> Directory found: [[ /some/other/dir/name ]]
2015-11-25 14:35:11 [WARNING] some strange condition occurred

最终,我希望语法定义类似于以下内容:

  • 日志行应该是&#34;正常&#34;文本
  • DEBUG行应完全视为注释
  • ERROR行应被视为其他内容(例如变量)
  • INFO行正常,但INFO一词应突出显示为某些内容(例如关键字)
  • 警告类似于ERROR或INFO
  • [[ some string ]]的格式嵌入字符串,以字符串形式突出显示,不论其所在行的类型如何
  • 以不同的颜色突出显示<<PASS>><<FAIL>>,无论他们在哪个行上

我很乐意在手动选择模式时让其中任何一个工作,特别是如果我可以根据完整文件名选择模式(它将根据前缀选择,而不仅仅是后缀,例如joelog-20151126-110719.log,键入&#39; joelog&#39;前缀和&#39; log&#39;后缀)。

这可能吗?我可以用JSON,YAML,XML,Martian编写这个 - 只要我知道规则,任何语言或样式定义都可以。

修改抱歉,我打算包含我试图关注的网页:

使用sublime-syntx个文件,我无法弄清楚如何让它显示为一个选项。使用AAAPackageDev文件,我可以让我的新语法定义显示出来,但它从未突出显示任何内容,即使只是按照教程执行操作(放弃我自己的所有愿望,只是想要突出显示的内容)任何时尚)。

谢谢!

2 个答案:

答案 0 :(得分:3)

我重新开始,没有任何工作......直到我删除了所有文件和尝试,然后从头再次开始。这些文件中的某些东西阻止了其他定义被读入,也许?毫无头绪,但现在它终于开始工作了。

我取得的成功是PackageDev。这是我想出的(它还在进行中):

# [PackageDev] target_format: plist, ext: tmLanguage
---
name: JoeLog
scopeName: source.joelog
fileTypes: [joe]
uuid: 0fb395f8-9fb7-41c2-8b56-51f971de8505

patterns:
- match: ^\d+-\d+-\d+ \d+:\d+:\d+ \[DEBUG\] (<<PASS>>).*$
  name: comment.joelog
  captures:
    '1': {name: constant.other.symbol.joelog}
- match: ^\d+-\d+-\d+ \d+:\d+:\d+ \[DEBUG\] (<<FAIL>>).*$
  name: variable.joelog
- match: ^\d+-\d+-\d+ \d+:\d+:\d+ \[DEBUG\].*$
  name: comment.joelog
- match: ^\d+-\d+-\d+ \d+:\d+:\d+ \[ERROR\].*$
  name: variable.joelog
- match: ^\d+-\d+-\d+ \d+:\d+:\d+ \[LOG\].*$
  name: support.class.joelog
- match: ^\d+-\d+-\d+ \d+:\d+:\d+ \[INFO\].*$
  name: support.function.joelog
- match: ^\d+-\d+-\d+ \d+:\d+:\d+ \[WARNING\].*$
  name: keyword.other.joelog
- match: \[WARNING\]
  name: keyword.other.joelog
- match: ^\d+-\d+-\d+ \d+:\d+:\d+ \[FATAL\].*$
  name: invalid.illegal.joelog
- begin: ^\d+-\d+-\d+ \d+:\d+:\d+ \[STACK TRACE\].*$
  end: ^\s*$
  name: invalid.illegal.joelog
...

我仍然不知道我正在做的事情的一半,但至少有些事情正在发挥作用。我希望能够在<<PASS>><<FAIL>>中进行着色而无需复制DEBUG定义,因为这些字符串可能出现在其他行上,我不想复制所有这些,但我还没有想出如何做到这一点,(任何指针都会受到欢迎)。

由于我选择的主题中使用的颜色,挑选了范围,但这可能是一个坏主意,我应该从上下文的角度来看有意义的范围。但我会把它留给另一天。 TmTheme Editor对于查看我的主题中定义的范围以及实际范围名称是一个很大的帮助。

我使用ApplySyntax包(可通过包控制获得)根据完整文件名选择此新语法,而不仅仅是扩展名。

答案 1 :(得分:1)

以下是我通过重新设计一些颜色主题并使用您对TmThemeEditor的有用链接而编译的常用范围的列表:

# Common generic scopes used in sublime-syntax / color-scheme
comment
comment.line
constant
constant.character
constant.character.escape
constant.language
constant.numeric
constant.other
constant.other.symbol
entity
entity.name.class
entity.name.filename
entity.name.function
entity.name.tag
entity.name.type.class
entity.other.attribute-name
entity.other.inherited-class
invalid
invalid.deprecated
keyword
keyword.control
keyword.control.import
keyword.operator
keyword.other
punctuation
punctuation.definition.string.begin
punctuation.definition.string.end
punctuation.definition.tag
punctuation.definition.tag.begin
punctuation.definition.tag.end
punctuation.definition.variable
storage
storage.modifier
storage.type
storage.type.class
storage.type.function
string
string.regexp
support
support.class
support.constant
support.function
support.other.variable
support.type
variable
variable.function
variable.language
variable.other
variable.parameter