在 VS Code 中将 JavaScript 的保留关键字设为斜体
Italicize JavaScript's reserved keywords in VS Code
我正在尝试使用 Visual Studio Code's theme settings via TextMate language grammars 创建自定义语法样式。
具体来说,我想将 JavaScript 的所有保留关键字设为斜体。通过以下设置,我已经完成了 98% 的进度(剩下的内容包含评论)。
不幸的是,有一些规则我没能找到:
storage
包含粗箭头符号,我 不想 包含它。我试图更具体一些,如下面的设置所示,但无法找到 constructor
和 const
的更具体设置。此外,"storage.type.function"
是我能找到的最明确的函数设置(需要 function 关键字,但它包括粗箭头)。
keyword
包括逻辑运算符等字符,我再次 不想 包括这些字符。 keyword.operator
对于文本运算符(例如 in
、instanceof
)是必需的,但包括字符运算符。
- 我找不到
eval
(严格禁止)或 package
(未使用的未来关键字)的规则。
有什么想法吗?
const settings = {
"editor.tokenColorCustomizations": {
"textMateRules": [
{
"scope": [
// TODO: missing keywords: package, eval
// all comment types
"comment",
// true, false, null
"constant.language",
// import, from, export, default, return, if, for, break, continue, try, catch, finally,
// throw, default, yield, await
"keyword.control",
// TODO: remove operator symbols
// in, void, delete, instanceof
"keyword.operator",
// debugger
"keyword.other",
// new
"keyword.operator.new",
// enum
"storage.type.enum",
// super, this, arguments
"variable.language",
// attributes in html, jsx, etc.
"entity.other.attribute-name",
// TODO: remove storage.type after finding explicit for constructor, const, let, var
"storage.type",
// static, extends, async, private, public, implements
"storage.modifier",
// TODO: exclude fat arrow
// function
"storage.type.function",
// class
"storage.type.class",
// interface
"storage.type.interface",
],
"settings": {
"fontStyle": "italic"
}
},
]
},
};
事实证明,在 VS Code 中你可以轻松找到你需要的范围。
用ctrl/cmd + shift + p 打开命令搜索并搜索 Developer: Inspect TM scopes
。然后,您可以单击要查找范围的任何 symbol/word 的左侧。
回答我自己的问题:
- 到目前为止,
const
、let
、var
或 function
关键字本身(storage.type.function
包括保留字和箭头)。但是,函数箭头有一个明确的范围:storage.type.function.arrow
。这允许我们包含整个 storage
范围,然后显式排除箭头。
keyword.operator.expression
是仅表示为单词的运算符所需的范围。
eval
和 package
的具体范围尚不可用。您可以用 support.function
定位 eval
,用 variable.other.readwrite
定位 package
,但这些范围很广,将包括许多其他结果。
话虽如此,下面列出了在 VS Code 中将所有 JavaScript 的保留关键字斜体化所需的规则(还包括注释和 jsx
/html
属性):
"editor.tokenColorCustomizations": {
"textMateRules": [
{
"scope": [
// all comment types
"comment",
// true, false, null
"constant.language",
// import, from, export, default, return, if, for, break, continue, try, catch, finally,
// throw, default, yield, await
"keyword.control",
// in, void, delete, instanceof
"keyword.operator.expression",
// debugger
"keyword.other",
// new
"keyword.operator.new",
// super, this, arguments
"variable.language",
// attributes in html, jsx, etc.
"entity.other.attribute-name",
// static, extends, async, private, public, implements
// constructor, const, let, var, enum, class, function, interface
// no explicit scopes for constructor, const, let, var
// also no explicit scope for function without the arrow
// therefore we enable all storage and explictly exclude the arrow in another scope
"storage",
// // no explicit scope for the eval keyword yet
// // can be targeted with the scope below, but scope is too broad
// "support.function",
// // no explicit scope for the package keyword yet
// // can be targeted with the scope below, but scope is too broad
// "variable.other.readwrite",
],
"settings": {
"fontStyle": "italic"
}
},
{
"scope": [
// function keyword does not have an explicit scope without the arrow
// therefore we explictly exclude the function arrow from being italicized
"storage.type.function.arrow",
],
"settings": {
"fontStyle": ""
}
}
]
}
我正在尝试使用 Visual Studio Code's theme settings via TextMate language grammars 创建自定义语法样式。
具体来说,我想将 JavaScript 的所有保留关键字设为斜体。通过以下设置,我已经完成了 98% 的进度(剩下的内容包含评论)。
不幸的是,有一些规则我没能找到:
storage
包含粗箭头符号,我 不想 包含它。我试图更具体一些,如下面的设置所示,但无法找到constructor
和const
的更具体设置。此外,"storage.type.function"
是我能找到的最明确的函数设置(需要 function 关键字,但它包括粗箭头)。keyword
包括逻辑运算符等字符,我再次 不想 包括这些字符。keyword.operator
对于文本运算符(例如in
、instanceof
)是必需的,但包括字符运算符。- 我找不到
eval
(严格禁止)或package
(未使用的未来关键字)的规则。
有什么想法吗?
const settings = {
"editor.tokenColorCustomizations": {
"textMateRules": [
{
"scope": [
// TODO: missing keywords: package, eval
// all comment types
"comment",
// true, false, null
"constant.language",
// import, from, export, default, return, if, for, break, continue, try, catch, finally,
// throw, default, yield, await
"keyword.control",
// TODO: remove operator symbols
// in, void, delete, instanceof
"keyword.operator",
// debugger
"keyword.other",
// new
"keyword.operator.new",
// enum
"storage.type.enum",
// super, this, arguments
"variable.language",
// attributes in html, jsx, etc.
"entity.other.attribute-name",
// TODO: remove storage.type after finding explicit for constructor, const, let, var
"storage.type",
// static, extends, async, private, public, implements
"storage.modifier",
// TODO: exclude fat arrow
// function
"storage.type.function",
// class
"storage.type.class",
// interface
"storage.type.interface",
],
"settings": {
"fontStyle": "italic"
}
},
]
},
};
事实证明,在 VS Code 中你可以轻松找到你需要的范围。
用ctrl/cmd + shift + p 打开命令搜索并搜索 Developer: Inspect TM scopes
。然后,您可以单击要查找范围的任何 symbol/word 的左侧。
回答我自己的问题:
- 到目前为止,
const
、let
、var
或function
关键字本身(storage.type.function
包括保留字和箭头)。但是,函数箭头有一个明确的范围:storage.type.function.arrow
。这允许我们包含整个storage
范围,然后显式排除箭头。 keyword.operator.expression
是仅表示为单词的运算符所需的范围。eval
和package
的具体范围尚不可用。您可以用support.function
定位eval
,用variable.other.readwrite
定位package
,但这些范围很广,将包括许多其他结果。
话虽如此,下面列出了在 VS Code 中将所有 JavaScript 的保留关键字斜体化所需的规则(还包括注释和 jsx
/html
属性):
"editor.tokenColorCustomizations": {
"textMateRules": [
{
"scope": [
// all comment types
"comment",
// true, false, null
"constant.language",
// import, from, export, default, return, if, for, break, continue, try, catch, finally,
// throw, default, yield, await
"keyword.control",
// in, void, delete, instanceof
"keyword.operator.expression",
// debugger
"keyword.other",
// new
"keyword.operator.new",
// super, this, arguments
"variable.language",
// attributes in html, jsx, etc.
"entity.other.attribute-name",
// static, extends, async, private, public, implements
// constructor, const, let, var, enum, class, function, interface
// no explicit scopes for constructor, const, let, var
// also no explicit scope for function without the arrow
// therefore we enable all storage and explictly exclude the arrow in another scope
"storage",
// // no explicit scope for the eval keyword yet
// // can be targeted with the scope below, but scope is too broad
// "support.function",
// // no explicit scope for the package keyword yet
// // can be targeted with the scope below, but scope is too broad
// "variable.other.readwrite",
],
"settings": {
"fontStyle": "italic"
}
},
{
"scope": [
// function keyword does not have an explicit scope without the arrow
// therefore we explictly exclude the function arrow from being italicized
"storage.type.function.arrow",
],
"settings": {
"fontStyle": ""
}
}
]
}