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



我想为具有特定格式的日志文件设置一个新的语言定义。我一直在网上搜索一个真正有效的教程,但我还没有找到。我已经尝试创建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

最终,我想要类似以下的语法定义:

  • 日志行应为"正常"文本
  • 调试行应完全作为注释处理
  • ERROR行应被视为其他行(例如变量)
  • INFO行正常,但单词INFO应突出显示为某物(例如关键字)
  • 类似于ERROR或INFO的警告
  • [[ some string ]]格式的嵌入字符串突出显示为字符串,而不管其所在的行类型如何
  • 使用不同颜色高亮显示<<PASS>><<FAIL>>,而不管它们所在的线路类型如何

当手动选择模式时,我很乐意让这些功能发挥作用,尤其是如果我可以根据完整的文件名选择模式(它将根据前缀而不仅仅是后缀来选择,例如joelog-20151126-110719.log键入"joelog"前缀和"log"后缀)。

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

编辑:对不起,我想包括我试图关注的页面:

  • http://docs.sublimetext.info/en/latest/extensibility/syntaxdefs.html
  • http://www.sublimetext.com/docs/3/syntax.html
    • http://www.sublimetext.com/docs/3/packages.html
  • https://github.com/SublimeText/AAAPackageDev
    • https://github.com/SublimeText/AAAPackageDev/blob/master/Syntax%20Definitions/Sublime%20Text%20Syntax%20Def%20%28YAML%29.YAML-tmLanguage
  • https://packagecontrol.io/packages/SyntaxHighlightTools

对于sublime-syntx文件,我不知道如何将其显示为一个选项。有了AAAPackageDev文件,我可以显示我的新语法定义,但它从未突出显示任何内容,即使只是在遵循教程的时候(放弃了我自己的所有愿望,只是试图以任何方式突出显示一些内容)。

谢谢!

我重新开始,但什么都没用。。。直到我删除了所有的文件和尝试,然后又从头开始。这些文件中的某些内容可能阻止了其他定义的读取?没有任何线索,但现在终于奏效了。

我的成功在于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编辑器在查看主题中定义了哪些作用域以及实际作用域名称方面提供了很大帮助。

我使用ApplySyntax包(可通过package Control获得)根据完整的文件名而不仅仅是扩展名来选择这个新语法。

以下是我通过重新设计一些颜色主题并使用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

最新更新