vim 的自定义 'smartindent' 脚本
custom 'smartindent' script for vim
我目前正在投入一个缩进样式有点特殊的新项目。基本规则是使用 'keyword+blank' 个空格来缩进下一行。
例如:
if () {
// indent 3 spaces here
}
while () {
// indent 6 spaces here
}
有一些(或很多)例外情况:
- else if: 使用与 if (3) 相同的空格数
- switch/case 中的大小写(2 个空格)
- ...
1) 是否已经有可用的插件可以帮我做到这一点?根据其中一位开发人员的说法,这称为 'smart identation'。不幸的是 VIM 的 smartindent 做了一些不同的事情。
2) 如果1的答案是否定的。有没有一种简单的方法来配置 vim 以遵守这些规则?
我不知道有任何这样的插件,恕我直言,这个方案一点也不聪明。
但是,完全可以编写自定义 indent 插件 来实现您的确切要求。参见:help 'indentexpr'
;此外,Vim 在 $VIMRUNTIME/indent/*.vim
中附带了几个缩进插件,可以作为灵感。
基本上,算法是这样的:
- 检查前一行是否有一个关键字(
if
、while
,依此类推)。
- 如果匹配,计算偏移量并将其添加到上一行的缩进中(
indent(v:lnum - 1)
);否则,按原样使用上一行的缩进。
- 如果该行包含
}
,找到匹配 {
的行,并使用该行的缩进。
我目前正在投入一个缩进样式有点特殊的新项目。基本规则是使用 'keyword+blank' 个空格来缩进下一行。
例如:
if () {
// indent 3 spaces here
}
while () {
// indent 6 spaces here
}
有一些(或很多)例外情况:
- else if: 使用与 if (3) 相同的空格数
- switch/case 中的大小写(2 个空格)
- ...
1) 是否已经有可用的插件可以帮我做到这一点?根据其中一位开发人员的说法,这称为 'smart identation'。不幸的是 VIM 的 smartindent 做了一些不同的事情。
2) 如果1的答案是否定的。有没有一种简单的方法来配置 vim 以遵守这些规则?
我不知道有任何这样的插件,恕我直言,这个方案一点也不聪明。
但是,完全可以编写自定义 indent 插件 来实现您的确切要求。参见:help 'indentexpr'
;此外,Vim 在 $VIMRUNTIME/indent/*.vim
中附带了几个缩进插件,可以作为灵感。
基本上,算法是这样的:
- 检查前一行是否有一个关键字(
if
、while
,依此类推)。 - 如果匹配,计算偏移量并将其添加到上一行的缩进中(
indent(v:lnum - 1)
);否则,按原样使用上一行的缩进。 - 如果该行包含
}
,找到匹配{
的行,并使用该行的缩进。