你能自定义代码折叠吗?

Can you customize code folding?

是否可以在 Visual Studio 代码中自定义代码折叠的工作方式?

我使用一种通用模式来定义跨各种不同文档类型的代码区域。

完整 Visual Studio(不是 VS Code),我有一个自定义扩展,它可以侦听跨文档类型的模式,并基于此创建折叠,从而允许我创建整洁的自定义文档大纲。我想在 Visual Studio 代码中使用相同的模式。是否可以创建一个自定义的 VS 代码扩展来检测这些评论模式,并以某种方式根据这些模式标记折叠?

很遗憾,目前还没有。这个主题有一个 open issue in github

FoldingRangeProvider 如果您希望在扩展中贡献自定义折叠逻辑,则可以使用。

请务必将 package.json 中的 engines 中的 VS Code 版本设置为 1.23,即引入此功能的版本。

以下是您的使用方法。

export function activate(context: ExtensionContext) {
    languages.registerFoldingRangeProvider({ scheme: 'file', language: 'markdown' }, new MyFoldingRangeProvider());
}

class MyFoldingRangeProvider implements FoldingRangeProvider {
    provideFoldingRanges(document: TextDocument, context: FoldingContext, token: CancellationToken): FoldingRange[] {
        return detectRanges().map(({ lineStart, lineEnd }) => new FoldingRange(lineStart, lineEnd));
    }
}

在VSCode扩展中实现自定义折叠的方式有3种。

  1. 您可以在 [language-name].configuration.json 文件中将正则表达式定义为折叠标记。 (但是,我们对这种方法没有太多的定制)

{
  "folding": {
    "markers": {
      "start": "starting regex",
      "end": "ending regex"
    }
  }
}

  1. 您可以从扩展中定义 FoldingRangeProvider,如 vscode[中的 . FoldingRange 中所述=41=] 包支持折叠定制,包括startLine、endLine和foldingKind。

  2. 您可以通过 textDocument/foldingRange 使用语言服务器支持。 vscode-languageserver-protocol中的FoldingRange支持使用startLine、endLine、startCharacter、endCharacter和foldingKind进行折叠自定义。

查看 this 了解更多详情。