鉴于此代码:
#!/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 花括号{ ... }
和标识符(例如if
、else
、while
等)来确定。
事实证明,其中的很多内容对于 bash(以及许多其他语言)来说是非常熟悉的,所以这在很多时候都很有效。
但在 C 语言中,括号用于在变量赋值或if
或while
语句中将逻辑表达式括起来。 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 脚本上按照您的预期工作。