Sublime中的正确批量缩进

时间:2018-02-06 22:44:04

标签: batch-file sublimetext3

我想知道如何在ST3中修复批处理的语法缩进。

目前,它只会像下面的代码一样缩进。

IF %num_args%==3  (
GOTO somewhere
GOTO somewhere_else
) ELSE (
ECHO some text
GOTO END
)

我检查了文件Batch File.sublime-syntax但找不到解决此问题的方法。 也许在这一部分做一些改变?

 parens:
- match: \(
  scope: punctuation.section.group.begin.dosbatch
  push:
    - meta_scope: meta.group.dosbatch
    - match: \)
      scope: punctuation.section.group.end.dosbatch
      pop: true
    - match: ',|;'
      scope: punctuation.separator.dosbatch
    - include: expressions

如果不在哪里/我还能做什么?

1 个答案:

答案 0 :(得分:0)

Sublime中的缩进规则不受提供scope语法之外的语法定义的影响,该语法告诉Sublime在任何给定点应用哪些规则。

此规则通过tmPreferences样式配置文件指定,其中包含以下键:

  • decreaseIndentPattern
  • increaseIndentPattern
  • disableIndentNextLinePattern
  • bracketIndentNextLinePattern

这些键表示正则表达式,指示缩进级别应基于文件内容。这个系统的一个副作用是很难准确拨入你想要的缩进。

也就是说,Sublime附带的Batch File软件包默认不包含任何缩进规则。如果您使用的是用于批量文件支持的软件包,那么这就是为什么它不会缩小您的方式。

如果您正在使用该软件包,则需要创建一个包含相关模式的文件,以便缩进文件。在这种情况下,您可以创建一个适当的tmPreferences文件并将其存储在User包中,因为它是文件中指定的scope,用于确定使用哪组规则

或者,如果您正在使用第三方软件包,它可能会也可能不会包含此类文件,在这种情况下,您可能需要创建一个文件或覆盖现有文件。

创建一个仍然可以像上面一样工作。相反,如果第三方软件包有一些您想要调整的缩进规则,则过程略有不同。

要覆盖该文件,请使用PackageResourceViewer打开相应的包文件。如果您使用此程序包打开文件,则您所做的任何保存都将自动创建一个覆盖,使您的文件优先于程序包中的文件。

如果您需要从头开始创建文件,最好的做法是查看已经执行此操作的现有软件包,以了解它是如何执行的。

最好的做法是找到一个包含尽可能与您正在使用的语言相似的语言的软件包作为基础,但对于批处理文件我不是确定这是否真的可能。

为了便于说明,Indentation.tmPreferences包中包含的Shell Script文件(我第一次错误地回答了这个问题)如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<plist version="1.0">
<dict>
    <key>name</key>
    <string>Indentation</string>
    <key>scope</key>
    <string>source.shell</string>
    <key>settings</key>
    <dict>
        <key>decreaseIndentPattern</key>
        <string>^\s*(\}|(elif|else|fi|esac|done)\b)</string>
        <key>increaseIndentPattern</key>
        <string>(?x)
            ^\s*(elif|else|case)\b
        |   ^.*(\{|\b(do)\b)\s*$
        |   ^.*\bthen\b\s*$
        </string>
        <key>indentNextLinePattern</key>
        <string>^.*[^\\]\\$</string>
        <key>disableIndentNextLinePattern</key>
        <string>^\s*then\s*$</string>
        <key>bracketIndentNextLinePattern</key>
        <string>^\s*if\b.*(?!\bthen\b)$</string>
    </dict>
</dict>
</plist>

出于您的目的,您需要根据需要更改正则表达式,以便提示Sublime缩进应该是什么,以及修改规则适用的scope

forum post上有Sublime Forum,描述了Sublime如何应用缩进规则。

此外,如果您使用附带的Batch File语法,则可能需要在Sublime Packages Issue Tracker上记录问题。 Sublime附带的软件包是开源的,社区有助于维护它们。

因此可以(通过一些讨论)可以更新批处理文件的默认包以直接支持它。