语言配置指南

贡献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.blockCommentcomments.lineComment控制 VS Code 如何注释行/块。

{
  "comments": {
    "lineComment": "//",
    "blockComment": ["/*", "*/"]
  }
}

括号定义

当您将光标移动到此处定义的括号时,VS Code 将突出显示该括号及其匹配对。

{
  "brackets": [
    ["{", "}"],
    ["[", "]"],
    ["(", ")"]
  ]
}

此外,当您运行Go to BracketSelect to Bracket时,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.foldingStrategyindentation则使用基于缩进的折叠。当一行的缩进小于后面的一行或多行时,折叠区域开始;当有一行具有相同或更小的缩进时,折叠区域结束。空行将被忽略。此外,语言配置可以定义开始和结束标记。这些在 中定义为start和正则表达式。当找到匹配的行时,会在该对内创建折叠范围。折叠标记必须非空,通常看起来像和。endfolding.markers//#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) {matches increaseIndentPattern,那么如果您在左括号后按Enter{,编辑器将自动缩进一次,您的代码将最终为:

if (true) {
  console.log();

除了increaseIndentPattern和之外decreaseIndentPatter,还有另外两个缩进规则:

  • indentNextLinePattern- 如果一行与此模式匹配,则仅应将其后的下一行缩进一次。
  • unIndentedLinePattern- 如果一行与此模式匹配,则不应更改其缩进,也不应根据其他规则对其进行评估。

如果没有为编程语言设置缩进规则,则编辑器将以左括号结束行时缩进,并在键入右括号时减少缩进。这里的括号由 定义brackets

请注意,editor.formatOnPaste设置受自动缩进控制DocumentRangeFormattingEditProvider,不受自动缩进影响。

输入规则时

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评估。AnonEnterRule可以指定以下操作:

  • indent(强制的)。其中之一none, indent, outdent, indentOutdent
    • none意味着新行将继承当前行的缩进。
    • indent意味着新行将相对于当前行缩进。
    • outdent意味着新行相对于当前行将不缩进。
    • indentOutdent意味着将插入两行新行,第一行缩进,第二行减少缩进。
  • appendText。将附加在新行和缩进之后的字符串。
  • removeText。要从新行缩进中删除的字符数。