Vim autoindent 在 20 行后停止在 bash 中缩进多行数组

Vim autoindent 在 20 行后停止在 bash 中缩进多行数组

鉴于此代码:

#!/bin/bash

_DATABASES=(
        "secretX"
        "secretmin"
        "secretcopyijui"
        "secretcroma"
        "secretdemo"
        "secretdicopy"
        "secretflashcolo"
        "secretmdat"
        "secretneton"
        "secretprintshar"
        "secretrealjet"
        "secretsolumax"
        "secretunicopia"
        "secretworddigit"
        "secretducao"
        "secrette"
        "secrette_app"
        "secretanopecanh"
        "secretx_ead"
        "secretx_site"
        "secretdroppy"
        "secret"
)

当我gg=G在vim上做时,代码是这样的:

#!/bin/bash

_DATABASES=(
        "secretX"
        "secretmin"
        "secretcopyijui"
        "secretcroma"
        "secretdemo"
        "secretdicopy"
        "secretflashcolo"
        "secretmdat"
        "secretneton"
        "secretprintshar"
        "secretrealjet"
        "secretsolumax"
        "secretunicopia"
        "secretworddigit"
        "secretducao"
        "secrette"
        "secrette_app"
        "secretanopecanh"
        "secretx_ead"
        "secretx_site"
"secretdroppy"
"secret"
)

为什么?

对于较小的数组,一切都可以正常工作,但是当它是包含超过 20 个元素的数组时,就会发生这种情况......

使用其他语言(JS、C++、PHP)进行测试,没有发生类似的行为。

信息:

维姆 7.4.52

没有.vimrc

答案1

={motion}运算符可以通过许多设置('equalprg''indentexpr''lisp')来定义,但是当所有这些都未设置时,它会回退到使用C 缩进。这就是这里正在发生的事情。

C 缩进适用于 C 语言,主要根据 C 花括号{ ... }和标识符(例如ifelsewhile等)来确定。

事实证明,其中的很多内容对于 bash(以及许多其他语言)来说是非常熟悉的,所以这在很多时候都很有效。

但在 C 语言中,括号用于在变量赋值或ifwhile语句中将逻辑表达式括起来。 Vim 想要格式化这些(因此它想要跟踪匹配括号的集合),但它想要对其看起来的深度施加一些限制。

由于在 C 语言中,括号用于表达式并且这些表达式通常很短,因此跟踪它们的默认限制是 20 行。

[ 'cinoptions'] 可以控制很多 C 缩进,事实证明它有一个选项可以控制这一点。这)N选项可用于调整括号表达式的行限制。

例如,将其增加到 100 行:

:set cinoptions=)100

(或者要将其减少到 10,请使用:set cinoptions=)10。)

这可以解释正在发生的事情,并且可能是一个可以变成可用解决方法的快速破解......但这里正确的解决方案是设置'indentexpr'适合您正在编写的语言。 (请记住,C 缩进仅在'indentexpr'未设置时生效。)

Vim 实际上提供了一个用于缩进 shell 脚本的插件,也许您只是没有启用它。确保您的中包含此命令.vimrc

filetype indent on

然后确保您的 shell 脚本被识别为类型sh

:set filetype?
filetype=sh

如果不是,请设置它(您可能需要深入研究为什么没有发生):

:setf sh

您可以仔细检查是否'indentexpr'已设置:

:set indentexpr?
indentexpr=GetShIndent()

启用这些设置后,=将在 shell 脚本上按照您的预期工作。

相关内容