【问题标题】:How to implement complicated auto-indentation in VScode如何在 VScode 中实现复杂的自动缩进
【发布时间】:2019-11-26 14:11:33
【问题描述】:

我正在为 SAS for VScode 开发语言扩展。我之前曾为 Atom (https://github.com/akanosora/language-sas) 和 Vim(默认 Vim 包的一部分:https://github.com/vim/vim/blob/master/runtime/indent/sas.vim)开发 SAS 语言扩展。

我对 Atom 中的自动缩进实现不是很满意,似乎 VScode 提供了或多或少相同的自动缩进机制。

SAS 代码的正确缩进非常棘手,因为块的关闭并不总是强制性的。 SAS 中的块通常以dataproc 开头并以runquit 结尾,您可以跳过run 将其关闭。例如,以下代码在 SAS 中都可以:

data female; 
    set total;
    where gender = 0;
run;

data male; 
    set total;
    where gender = 1;
run; 

data female; 
    set total;
    where gender = 0;

data male; 
    set total;
    where gender = 1;
run; 

因此,SAS 的正确自动缩进需要比increaseIndentPatterndecreaseIndentPattern 更复杂的规则,因为它们并不总是相互配对。通过比较当前行上方最接近的rundata,我能够在Vim 中实现这一点。如果run 比之前的data 行更接近当前data 行,则不需要缩进。否则,缩进当前的data 行。我想知道在 VScode 中实现它有多可行(可能不依赖indentationRules 设置,而是使用vscode.languages.* API?)我需要一些指导。

【问题讨论】:

  • 尽管 SAS 允许 DATA / PROC 步骤在没有运行/退出的情况下结束,但通常认为使用此功能是一种糟糕的编码风格。如果我正在开发一个语言扩展,我可以编写一个期望每个步骤都被明确关闭的扩展。

标签: visual-studio-code sas indentation vscode-extensions


【解决方案1】:

对于更高级的缩进,您可以考虑使用格式化程序以及基于正则表达式的缩进规则。要添加自定义格式化程序,您的扩展应实现 DocumentRangeFormattingEditProvider,然后通过调用 registerDocumentRangeFormattingEditProvider 向 VS Code 注册

格式化程序通常必须由用户调用。但是,用户也可以通过设置"editor.formatOnType": true 在键入时启用格式设置。对于这种情况,您的扩展还应实现 OnTypeFormattingEditProvider 并通过调用 registerOnTypeFormattingEditProvider 注册 on-type 格式化程序

【讨论】:

    【解决方案2】:

    您可以将dataproc 关键字本身添加到"decreaseIndentPattern" 规则中。这样,这些关键字将用于取消当前行的缩进,并在下一行开始新的缩进块。

    考虑一下,例如:

    "indentationRules": {
        "increaseIndentPattern": "^\\s*(proc|data)\\s+.*;\\s*$",
        "decreaseIndentPattern": "^\\s*(run|((proc|data)\\s+.*))\\s*;"
    }
    

    【讨论】:

      猜你喜欢
      • 2017-03-22
      • 1970-01-01
      • 2020-06-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-28
      • 2021-08-11
      • 1970-01-01
      相关资源
      最近更新 更多