Dr *_*tty 18 c vim indentation preprocessor-directive
(注意:请一直阅读,因为我花了一些时间来组织它,确保我解决了我遇到的每个问题以及为什么一个提议的解决方案对我不起作用.)
我在vim中使用cindent来自动进行缩进.它大部分时间都很好用.但是,cindent做了三个坏事(在我看来)涉及C预处理器指令(以哈希('#')开头的语句).
如果它是相关的,我使用标签进行缩进,我的.vimrc包含filetype indent on.
只要我输入一个预处理器指令,vim就会将它放在第1列(它完全取消缩进).例如,这是我输入代码时vim对我的代码所做的事情:
int main(void)
{
while(1) {
/* normal things */
#ifdef DEBUG
printDebugInfo();
#endif
/* normal things */
}
}
Run Code Online (Sandbox Code Playgroud)
但是,我希望它看起来像这样:
int main(void)
{
while(1) {
/* normal things */
#ifdef DEBUG
printDebugInfo();
#endif
/* normal things */
}
}
Run Code Online (Sandbox Code Playgroud)
换句话说,我更喜欢vim像任何其他C/C++语句一样处理预处理程序指令.
当我使用预处理器指令使用==(或[movement]=跨越)一行时,vim将其放回第1列.(这与Bad Thing 1一致,但仍然存在问题.)
如果(由于Bad Thing 1或2或使用<<)预处理程序指令最终在第1列中,它会在那里"卡住"并且不受影响>>.增加缩进的唯一方法是I<Tab>或i<Ctrl-t>.它然后变得"没有卡住",我可以用<<或移动它>>.
一个解决方案建议投入set cinkeys-=0#我的.vimrc.这修复了坏事1 - 3,但添加了一个新的:
cinkeys-=0#)第1列中的预处理程序指令不受==或影响[movement]=,这意味着在我使用>>或通过插入制表符手动缩进它们之前,我仍然无法自动修复它们的缩进.
有没有办法在不引入Bad Thing 4的情况下解决Bad Things 1 - 3?我可以强制vim处理以'#'开头的行,就像普通的C语句一样吗?
(或者我只是#ifdef以有害的方式使用s,这是vim告诉我停止的方式?)
我宁愿不修补vim和/或重新编译,但如果必须,我会.
从Vim文档中,在cinoptions下:
如果出现以下情况,Vim会在第1列添加一行
- 如果'cinkeys'包含'#',它以'#'(预处理程序指令)开头.
- 它以标签开头(关键字后跟':',除了"case"和"default"),'cinoptions'不包含带有正值的'L'条目.
- 任何压痕组合都会导致该行的缩进小于0.
因此,除去0#从cinkeys应覆盖该默认行为.(这个想法出现在互联网上足够的地方.)
set cinkeys=0{,0},0),:,!^F,o,O,e
Run Code Online (Sandbox Code Playgroud)
随着对cinkeys的改变,这就是我得到的,正是你正在寻找的:
int main(void)
{
while(1) {
/* normal things */
#ifdef DEBUG
printDebugInfo();
#endif
/* normal things */
}
}
Run Code Online (Sandbox Code Playgroud)