如何为 Sublime Text 3 创建新的语法语言定义?
How can I create a new syntax language definition for Sublime Text 3?
我想为具有特定格式的日志文件设置新的语言定义。我一直在互联网上搜索实际有效的教程,但我还没有找到。我已经尝试创建 sublime-syntax
文件、AAAPackageDev
文件(JSON 和 YAML),以及另一个我不记得名称的语法包 -- none其中一些似乎有效,其中一些遗漏了重要的细节,比如保存文件的位置、如何让语法定义作为一个选项出现(我怀疑这与保存位置有关),或者 keyword.other.joelog
范围与 keyword.other
主题颜色相关(您是否只删除最后一位?最后一位是否必须与 header 中设置的范围相匹配?)。一直很郁闷。
最简单的,我想获取以下文件并突出显示它:
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
最终我想要类似于以下的语法定义:
- LOG 行应该是 "normal" text
- DEBUG 行应完全视为注释
- 错误行应该被视为其他东西(例如变量)
- INFO 行正常,除了 INFO 一词应突出显示为某些内容(例如关键字)
- WARNING 类似于 ERROR 或 INFO
- 具有
[[ some string ]]
格式的嵌入字符串,无论其所在的行类型如何,都突出显示为字符串
<<PASS>>
和 <<FAIL>>
以不同的颜色突出显示,无论它们所在的线路类型如何
我很高兴在手动选择模式时让其中的任何一个工作,如果我可以根据完整文件名选择模式(它将根据前缀选择,而不仅仅是选择),我会特别高兴后缀,例如 joelog-20151126-110719.log 关闭 'joelog' 前缀和 'log' 后缀)。
这可以吗?我可以用 JSON、YAML、XML、火星语来写——任何语言或风格定义都可以,只要我知道规则。
编辑: 抱歉,我想包括我试图关注的页面:
- http://docs.sublimetext.info/en/latest/extensibility/syntaxdefs.html
- http://www.sublimetext.com/docs/3/syntax.html
- https://github.com/SublimeText/AAAPackageDev
- 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 Editor 对查看我的主题中定义了哪些范围以及实际范围名称是什么有很大帮助。
我使用 ApplySyntax 包(可通过包控制获得)来 select 这个基于完整文件名的新语法,而不仅仅是扩展名。
这是我通过重新设计一些颜色主题并使用您对 TmThemeEditor 的帮助 link 编制的常用范围列表:
# 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
我想为具有特定格式的日志文件设置新的语言定义。我一直在互联网上搜索实际有效的教程,但我还没有找到。我已经尝试创建 sublime-syntax
文件、AAAPackageDev
文件(JSON 和 YAML),以及另一个我不记得名称的语法包 -- none其中一些似乎有效,其中一些遗漏了重要的细节,比如保存文件的位置、如何让语法定义作为一个选项出现(我怀疑这与保存位置有关),或者 keyword.other.joelog
范围与 keyword.other
主题颜色相关(您是否只删除最后一位?最后一位是否必须与 header 中设置的范围相匹配?)。一直很郁闷。
最简单的,我想获取以下文件并突出显示它:
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
最终我想要类似于以下的语法定义:
- LOG 行应该是 "normal" text
- DEBUG 行应完全视为注释
- 错误行应该被视为其他东西(例如变量)
- INFO 行正常,除了 INFO 一词应突出显示为某些内容(例如关键字)
- WARNING 类似于 ERROR 或 INFO
- 具有
[[ some string ]]
格式的嵌入字符串,无论其所在的行类型如何,都突出显示为字符串 <<PASS>>
和<<FAIL>>
以不同的颜色突出显示,无论它们所在的线路类型如何
我很高兴在手动选择模式时让其中的任何一个工作,如果我可以根据完整文件名选择模式(它将根据前缀选择,而不仅仅是选择),我会特别高兴后缀,例如 joelog-20151126-110719.log 关闭 'joelog' 前缀和 'log' 后缀)。
这可以吗?我可以用 JSON、YAML、XML、火星语来写——任何语言或风格定义都可以,只要我知道规则。
编辑: 抱歉,我想包括我试图关注的页面:
- http://docs.sublimetext.info/en/latest/extensibility/syntaxdefs.html
- http://www.sublimetext.com/docs/3/syntax.html
- https://github.com/SublimeText/AAAPackageDev
- 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 Editor 对查看我的主题中定义了哪些范围以及实际范围名称是什么有很大帮助。
我使用 ApplySyntax 包(可通过包控制获得)来 select 这个基于完整文件名的新语法,而不仅仅是扩展名。
这是我通过重新设计一些颜色主题并使用您对 TmThemeEditor 的帮助 link 编制的常用范围列表:
# 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