鉴于此代码:
#!/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
={motion}
运算符可以由许多设置(,'equalprg'
,'indentexpr'
)定义'lisp'
,但是当所有这些都未设置时,它会回退到使用C 缩进。这就是这里发生的事情。C 缩进是为 C 语言设计的,主要是在 C 大括号
{ ... }
和标识符(如if
,else
,while
等)上得到提示。事实证明,这对于 bash(以及许多其他语言)来说非常熟悉,因此在很多情况下都可以很好地工作。
但是,在 C 中,括号用于将逻辑表达式括在变量赋值或
if
或while
语句中。Vim 想要格式化这些(所以它想要跟踪匹配括号的集合),但它想要对它的外观设置一些限制。由于在 C 语言中,括号用于表达式并且通常很短,因此跟踪它们的默认限制是 20 行。
[
'cinoptions'
] 可以控制很多 C 缩进,事实证明它有一个选项来控制它。该)N
选项可用于调整括号表达式的行限制。例如,要将其提高到 100 行:
(或者要将其减少到 10,请使用
:set cinoptions=)10
。)这可以解释正在发生的事情,它可能是一个快速破解,可以变成一个可用的解决方法......但这里正确的解决方案是为
'indentexpr'
您正在编写的语言进行适当的设置。(请记住,C 缩进仅在'indentexpr'
未设置时才开始。)Vim 实际上提供了一个缩进 shell 脚本的插件,也许你只是没有启用它。确保你有这个命令在你的
.vimrc
:然后确保您的 shell 脚本被识别为 type
sh
:如果不是,请设置它(您可能需要深入研究为什么没有发生):
您可以仔细检查
'indentexpr'
已设置:启用这些设置后,
=
将在 shell 脚本上按预期工作。