Fisheye/Crucible Kotlin 语法高亮显示
Fisheye/Crucible syntax highlighting for Kotlin
从 Crucible 版本 4.2.1 开始,没有对 Kotlin 文件的内置语法高亮支持。我已经为此填写了feature request。
但是,目前唯一的可能是添加自定义语法配置,如 here 所述。
有没有人做过并且可以分享配置?
我最终自己创建了这个文件。它基于 Java 配置,但使用 Kotlin 关键字。
这个 project 还包含一个生成关键字前缀树的脚本,如果您不喜欢我正在使用的列表。
您可以在下面找到文件的内容:
syntaxdef kotlin {
/\s+/m : ;
#keywords
/(a(bstract|nnotation|s)|break|c(atch|lass|o(mpanion|n(st|tinue))|rossinline)\
|d(ata|elegate|o|ynamic)|e(lse|num|xternal)|f(i(eld|le|nally)|or|un|alse)|get\
|i(f|mport|n(fix|it|line|terface)|s|t)|n(oinline|ull)|o(bject|pe(n|rator)|ut)\
|p(a(ckage|ram)|roperty)|re(ceiver|ified|turn)|s(e(aled|tparam)|u(per|spend))\
|t(ailrec|h(is|row)|r(y|ue)|ype(alias|of))|va(l|rarg)|wh(en|ile))\b/ : {
region {
type=keyword;
index=word;
}
}
/[\p{L}_$][\p{L}\p{N}_$]*/ : {
region {
type=identifier;
index=word;
}
}
#annotation
/@[\p{L}_$][\p{L}\p{N}_$]*/ : {
region {
type=annotation;
index=word;
}
}
# string literals
/"/ : {
context {
/\"/: ;
/\./: ;
/$/m : exit;
"\"" : exit;
}
region ${ALL} {
type=string;
}
}
# char literal
/'/ : {
context {
/\./: ;
/$/m : exit;
"'" : exit;
}
region ${ALL} {
type=char_literal;
}
}
/\/\/.*$/m : {
todo([=10=]);
region {
type=comment;
index=prose;
findlinks=true;
}
}
/\/\*\*(.*?)\*\//s : {
javadoc();
region {
type=comment;
index=prose;
findlinks=true;
}
}
context javadoc {
/(\B@[a-zA-Z0-9-_.]+)\s*([^@\*]*)/ : {
region {
type=commentmeta;
}
}
}
/(0x[0-9a-f][0-9a-f_]*l?)|(0b[0-1][0-1_]*l?)|([0-9][0-9_]*(\.[0-9][0-9_]*)?|\.[0-9][0-9_]+)(e(\+|-)?[0-9][0-9_]*)?(f|l|d)?/i : {
region {
type=numeric;
}
}
/\/\*(.*?)\*\//s : {
todo();
region {
type=comment;
findlinks=true;
}
region {
index=prose;
}
}
context todo {
/(?i)todo\s.*/ : {
region {
type=todo;
}
}
}
}
从 Crucible 版本 4.2.1 开始,没有对 Kotlin 文件的内置语法高亮支持。我已经为此填写了feature request。
但是,目前唯一的可能是添加自定义语法配置,如 here 所述。
有没有人做过并且可以分享配置?
我最终自己创建了这个文件。它基于 Java 配置,但使用 Kotlin 关键字。
这个 project 还包含一个生成关键字前缀树的脚本,如果您不喜欢我正在使用的列表。
您可以在下面找到文件的内容:
syntaxdef kotlin {
/\s+/m : ;
#keywords
/(a(bstract|nnotation|s)|break|c(atch|lass|o(mpanion|n(st|tinue))|rossinline)\
|d(ata|elegate|o|ynamic)|e(lse|num|xternal)|f(i(eld|le|nally)|or|un|alse)|get\
|i(f|mport|n(fix|it|line|terface)|s|t)|n(oinline|ull)|o(bject|pe(n|rator)|ut)\
|p(a(ckage|ram)|roperty)|re(ceiver|ified|turn)|s(e(aled|tparam)|u(per|spend))\
|t(ailrec|h(is|row)|r(y|ue)|ype(alias|of))|va(l|rarg)|wh(en|ile))\b/ : {
region {
type=keyword;
index=word;
}
}
/[\p{L}_$][\p{L}\p{N}_$]*/ : {
region {
type=identifier;
index=word;
}
}
#annotation
/@[\p{L}_$][\p{L}\p{N}_$]*/ : {
region {
type=annotation;
index=word;
}
}
# string literals
/"/ : {
context {
/\"/: ;
/\./: ;
/$/m : exit;
"\"" : exit;
}
region ${ALL} {
type=string;
}
}
# char literal
/'/ : {
context {
/\./: ;
/$/m : exit;
"'" : exit;
}
region ${ALL} {
type=char_literal;
}
}
/\/\/.*$/m : {
todo([=10=]);
region {
type=comment;
index=prose;
findlinks=true;
}
}
/\/\*\*(.*?)\*\//s : {
javadoc();
region {
type=comment;
index=prose;
findlinks=true;
}
}
context javadoc {
/(\B@[a-zA-Z0-9-_.]+)\s*([^@\*]*)/ : {
region {
type=commentmeta;
}
}
}
/(0x[0-9a-f][0-9a-f_]*l?)|(0b[0-1][0-1_]*l?)|([0-9][0-9_]*(\.[0-9][0-9_]*)?|\.[0-9][0-9_]+)(e(\+|-)?[0-9][0-9_]*)?(f|l|d)?/i : {
region {
type=numeric;
}
}
/\/\*(.*?)\*\//s : {
todo();
region {
type=comment;
findlinks=true;
}
region {
index=prose;
}
}
context todo {
/(?i)todo\s.*/ : {
region {
type=todo;
}
}
}
}