我正在尝试制作一个崇高的文本插件,用于语法高亮一种名为" e验证语言的编程语言": https://en.wikipedia.org/wiki/E_%28verification_language%29
这种语言的函数定义:
function_name (name_1: type_1, name_2: type_2, ...) : return_type is {
function body
}
例如:
function_name(num1: int, num2: real) : int is { ...
输入参数和返回值是可选的。
没有输入参数,没有返回值,没有两者:
function_name() : int is { ...
function_name(num1: int, num2: real) is { ...
function_name() is { ...
我想为功能名称着色,并且如果需要的话,还要保持行中其他关键字的颜色(" int"" real"是类型,"是& #34;是一个语法关键字,":"如果存在,也应该着色。
我尝试使用"捕获"在插件tmLanguage文件中阻止。成功着色函数名称,但因为""正在识别该行?最后,两者之间的所有内容都没有突出显示。 我正在捕捉4行内容:功能名称,"(",")","是"
使用的代码:
<dict>
<key>captures</key>
<dict>
<key>1</key>
<dict>
<key>name</key>
<string>entity.name.function</string>
</dict>
<key>2</key>
<dict>
<key>name</key>
<string>keyword.language</string>
</dict>
<key>3</key>
<dict>
<key>name</key>
<string>keyword.language</string>
</dict>
<key>4</key>
<dict>
<key>name</key>
<string>keyword.language</string>
</dict>
</dict>
<key>match</key>
<string>^\s*(\b[^\s]+)\s*(\()\s*.*\s*(\))\s*:*\s*.*\s+(is)\b</string>
</dict>
我用我的捕获块(蓝色功能名称)添加功能照片,没有(白色名称,绿色&#34; int&#34;和&#34;真实&#34;)。有什么方法可以结合起来,以便所有需要的东西都会被着色吗?
谢谢。答案 0 :(得分:3)
您需要使用repository
我鼓励您使用.YAML-tmLanguage文件(更易于阅读),您可以使用PackageDev轻松转换为.tmLanguage
以下是C语言的剥离文件(在Packages / User中将其命名为myc.YAML-tmLanguage
):
fileTypes: [myc, myh]
scopeName: source.myc
name: myc
patterns:
- match: \b(for|if)\b
name: keyword.control.c
- match: \b(int)\b
name: storage.type.c
- include: '#block'
- begin: "(?x)\n \t\t(?: ^ # begin-of-line\n \
\ \t\t |\n \t\t (?: (?= \\s ) (?<!else|new|return) (?<=\\\
w) # or word + space before name\n \t\t | (?= \\s*[A-Za-z_] ) (?<!&&)\
\ (?<=[*&>]) # or type modifier before name\n \t\t )\n \t\t\
)\n \t\t(\\s*) (?!(while|for|do|if|else|switch|catch|enumerate|return|r?iterate)\\\
s*\\()\n \t\t(\n \t\t\t(?: [A-Za-z_][A-Za-z0-9_]*+ | :: )++ | \
\ # actual name\n \t\t\t(?: (?<=operator) (?: [-*&<>=+!]+ | \\(\\) |\
\ \\[\\] ) ) # if it is a C++ operator\n \t\t)\n \t\t \\s*(?=\\()"
beginCaptures:
'1':
name: punctuation.whitespace.function.leading.c
'3':
name: entity.name.function.c
'4':
name: punctuation.definition.parameters.c
end: (?<=\})|(?=#)|(;)
name: meta.function.c
patterns:
- include: '#parens'
- include: '#block'
repository:
block:
begin: \{
end: \}
name: meta.block.c
patterns:
- include: '#block_innards'
parens:
begin: \(
end: \)
name: meta.parens.c
patterns:
- include: $self
block_innards:
patterns:
- include: '#block'
- include: $self
- captures:
'1':
name: punctuation.whitespace.function-call.leading.c
'2':
name: support.function.any-method.c
'3':
name: punctuation.definition.parameters.c
match: "(?x) (?: (?= \\s ) (?:(?<=else|new|return) | (?<!\\w)) (\\s+))?\n\t\
\t\t(\\b\n\t\t\t\t(?!(while|for|do|if|else|switch|catch|enumerate|return|r?iterate)\\\
s*\\()(?:(?!NS)[A-Za-z_][A-Za-z0-9_]*+\\b | :: )++ # actual\
\ name\n\t\t\t)\n\t\t\t \\s*(\\()"
name: meta.function-call.c
安装PackageDev后,您现在可以将其转换为PLIST语法(Ctrl + Shift + P&gt; YAML到PLIST)并将其保存在myc.tmLanguage
下。
以下是使用块中的调用和您请求的函数结构func(int&lt; ...&gt;,int&lt; ...&gt;)的示例test.myc
文件:
int prime(int n, int n);
int main()
{
for(i=2; i<=n/2; ++i)
{
if (prime(i)!=0)
{
test(int k, int n);
if ( prime(n-i)!=0)
{
printf("%d = %d + %d\n", n, i, n-i);
flag=1;
}
}
}
}
在这里你有syntax highlighting in ST3。希望你能用e(验证语言)...