语言配置指南
contributes.languages 贡献点允许您定义语言配置,以控制以下声明式语言功能:
- 注释切换
- 括号定义
- 自动闭合
- 自动环绕
- 折叠
- 单词模式
- 缩进规则
这是一个 语言配置示例,它配置了 JavaScript 文件的编辑体验。本指南解释了 language-configuration.json 的内容。
注意:如果您的语言配置文件名是或以 language-configuration.json 结尾,您将在 VS Code 中获得自动补全和验证功能。
{
"comments": {
"lineComment": "//",
"blockComment": ["/*", "*/"]
},
"brackets": [
["{", "}"],
["[", "]"],
["(", ")"]
],
"autoClosingPairs": [
{ "open": "{", "close": "}" },
{ "open": "[", "close": "]" },
{ "open": "(", "close": ")" },
{ "open": "'", "close": "'", "notIn": ["string", "comment"] },
{ "open": "\"", "close": "\"", "notIn": ["string"] },
{ "open": "`", "close": "`", "notIn": ["string", "comment"] },
{ "open": "/**", "close": " */", "notIn": ["string"] }
],
"autoCloseBefore": ";:.,=}])>` \n\t",
"surroundingPairs": [
["{", "}"],
["[", "]"],
["(", ")"],
["'", "'"],
["\"", "\""],
["`", "`"]
],
"folding": {
"markers": {
"start": "^\\s*//\\s*#?region\\b",
"end": "^\\s*//\\s*#?endregion\\b"
}
},
"wordPattern": "(-?\\d*\\.\\d\\w*)|([^\\`\\~\\!\\@\\#\\%\\^\\&\\*\\(\\)\\-\\=\\+\\[\\{\\]\\}\\\\\\|\\;\\:\\'\\\"\\,\\.\\<\\>\\/\\?\\s]+)",
"indentationRules": {
"increaseIndentPattern": "^((?!\\/\\/).)*(\\{[^}\"'`]*|\\([^)\"'`]*|\\[[^\\]\"'`]*)$",
"decreaseIndentPattern": "^((?!.*?\\/\\*).*\\*/)?\\s*[\\)\\}\\]].*$"
}
}
注释切换
VS Code 提供了两个用于切换注释的命令:切换行注释 和 切换块注释。您可以指定 comments.blockComment 和 comments.lineComment 来控制 VS Code 如何注释掉行/块。
{
"comments": {
"lineComment": "//",
"blockComment": ["/*", "*/"]
}
}
为了向后兼容,lineComment 属性支持两种格式:
- 用于简单行注释定义的字符串值。
- 用于配置注释行缩进行为的对象值。
{
"comments": {
"lineComment": {
"comment": "//",
"noIndent": true
},
"blockComment": ["/*", "*/"]
}
}
括号定义
当您将光标移动到此处定义的括号时,VS Code 将会高亮显示该括号及其匹配对。
{
"brackets": [
["{", "}"],
["[", "]"],
["(", ")"]
]
}
此外,当您运行 跳转到括号 或 选中到括号 时,VS Code 将使用上述定义来查找最近的括号及其匹配对。
自动闭合
当您输入 ' 时,VS Code 会创建一对单引号并将您的光标置于中间:'|'。本节定义了此类配对。
{
"autoClosingPairs": [
{ "open": "{", "close": "}" },
{ "open": "[", "close": "]" },
{ "open": "(", "close": ")" },
{ "open": "'", "close": "'", "notIn": ["string", "comment"] },
{ "open": "\"", "close": "\"", "notIn": ["string"] },
{ "open": "`", "close": "`", "notIn": ["string", "comment"] },
{ "open": "/**", "close": " */", "notIn": ["string"] }
]
}
notIn 键可在某些代码范围内禁用此功能。例如,当您编写以下代码时:
// ES6's Template String
`ES6's Template String`;
单引号将不会被自动闭合。
不需要 notIn 属性的配对也可以使用更简单的语法:
{
"autoClosingPairs": [
["{", "}"],
["[", "]"]
]
}
用户可以通过 editor.autoClosingQuotes 和 editor.autoClosingBrackets 设置来调整自动闭合行为。
自动闭合之前
默认情况下,VS Code 仅在光标后紧跟空白字符时才会自动闭合配对。因此,当您在以下 JSX 代码中输入 { 时,不会触发自动闭合:
const Component = () =>
<div className={>
^ Does not get autoclosed by default
</div>
然而,此定义会覆盖该行为:
{
"autoCloseBefore": ";:.,=}])>` \n\t"
}
现在,当您在 > 前输入 { 时,VS Code 会自动用 } 将其闭合。
自动环绕
当您在 VS Code 中选择一个范围并输入左括号时,VS Code 会用一对括号环绕选定的内容。此功能称为“自动环绕”,您可以在此处为特定语言定义自动环绕的配对。
{
"surroundingPairs": [
["{", "}"],
["[", "]"],
["(", ")"],
["'", "'"],
["\"", "\""],
["`", "`"]
]
}
用户可以通过 editor.autoSurround 设置来调整自动环绕行为。
折叠
在 VS Code 中,折叠要么基于缩进,要么由贡献的折叠范围提供程序定义。
- 带标记的基于缩进的折叠:如果没有适用于给定语言的折叠范围提供程序,或者用户已将
editor.foldingStrategy设置为indentation,则使用基于缩进的折叠。折叠区域始于一行缩进小于随后一行或多行时,终于缩进相同或更小的行时。空行会被忽略。此外,语言配置可以定义开始和结束标记。这些标记在folding.markers中定义为start和end正则表达式。当找到匹配的行时,会创建该对之间的折叠范围。折叠标记必须是非空的,通常看起来像//#region和//#endregion。
以下 JSON 为 //#region 和 //#endregion 创建了折叠标记。
{
"folding": {
"markers": {
"start": "^\\s*//\\s*#?region\\b",
"end": "^\\s*//\\s*#?endregion\\b"
}
}
}
- 语言服务器折叠:语言服务器响应
textDocument/foldingRange请求并返回折叠范围列表,VS Code 会将这些范围渲染为折叠标记。在程序化语言功能主题中了解有关语言服务器协议中折叠支持的更多信息。
单词模式
wordPattern 定义了编程语言中什么是“单词”。如果设置了 wordPattern,代码建议功能将使用此设置来确定单词边界。请注意,此设置不会影响与单词相关的编辑器命令,后者由编辑器设置 editor.wordSeparators 控制。
{
"wordPattern": "(-?\\d*\\.\\d\\w*)|([^\\`\\~\\!\\@\\#\\%\\^\\&\\*\\(\\)\\-\\=\\+\\[\\{\\]\\}\\\\\\|\\;\\:\\'\\\"\\,\\.\\<\\>\\/\\?\\s]+)"
}
缩进规则
indentationRules 定义了当您输入、粘贴和移动行时,编辑器应如何调整当前行或下一行的缩进。
{
"indentationRules": {
"increaseIndentPattern": "^((?!\\/\\/).)*(\\{[^}\"'`]*|\\([^)\"'`]*|\\[[^\\]\"'`]*)$",
"decreaseIndentPattern": "^((?!.*?\\/\\*).*\\*/)?\\s*[\\)\\}\\]].*$"
}
}
例如,if (true) { 匹配 increaseIndentPattern,因此如果您在左括号 { 后按 Enter 键,编辑器将自动缩进一次,您的代码最终会变成:
if (true) {
console.log();
除了 increaseIndentPattern 和 decreaseIndentPattern 之外,还有两条缩进规则:
indentNextLinePattern- 如果一行匹配此模式,则仅其下一行应缩进一次。unIndentedLinePattern- 如果一行匹配此模式,则其缩进不应更改,且不应根据其他规则进行评估。
如果未为编程语言设置缩进规则,则当行以左括号结尾时,编辑器会缩进;当您输入右括号时,编辑器会反向缩进。此处的括号由 brackets 定义。
注意,editor.formatOnPaste 设置由 DocumentRangeFormattingEditProvider 控制,不受自动缩进的影响。
回车规则 (On Enter Rules)
onEnterRules 定义了一组列表规则,当在编辑器中按下 Enter 键时会评估这些规则。
{
"onEnterRules": [
{
"beforeText": "^\\s*(?:def|class|for|if|elif|else|while|try|with|finally|except|async).*?:\\s*$",
"action": { "indent": "indent" }
}
]
}
当按下 Enter 键时,光标之前、之后或光标上一行的文本将根据以下属性进行检查:
beforeText(必填)。匹配光标之前文本的正则表达式(仅限于当前行)。afterText。匹配光标之后文本的正则表达式(仅限于当前行)。previousLineText。匹配光标上一行文本的正则表达式。
如果所有指定的属性都匹配,则该规则被视为匹配,且不会再评估后续的 onEnterRules。onEnterRule 可以指定以下操作:
indent(必填)。取值为none, indent, outdent, indentOutdent之一。none表示新行将继承当前行的缩进。indent表示新行相对于当前行进行缩进。outdent表示新行相对于当前行进行反向缩进。indentOutdent表示将插入两行,第一行缩进,第二行反向缩进。
appendText。在新行之后且在缩进之后追加的字符串。removeText。从新行缩进中删除的字符数。