(注意:请仔细阅读,因为我花了一些时间来组织它,确保我处理了我遇到的每个问题,为什么一个提出的解决方案对我来说无效.)
我在vim中使用cind来自动缩进.大部分时间都很好用.然而,cindent在涉及C预处理器指令(以哈希(‘#’)开头的语句)中有三件坏事(在我看来).
如果它是相关的,我使用标签缩进,我的.vimrc包含文件类型缩进.
坏事1
一旦我键入预处理器指令,vim将其放在第1列(它完全不缩小).例如,以下是vim在我键入时对代码的作用:
int main(void) { while(1) { /* normal things */ #ifdef DEBUG printDebugInfo(); #endif /* normal things */ } }
但是,我希望它像这样:
int main(void) { while(1) { /* normal things */ #ifdef DEBUG printDebugInfo(); #endif /* normal things */ } }
换句话说,我喜欢vim像预处理指令一样处理任何其他C/C++语句.
坏事2
当我使用== on(或[movement] = across)一行与预处理器指令时,vim将其放回第1列.(这与Bad Thing 1一致但仍然是一个问题)
坏事3
如果(因为坏事1或2或使用<)预处理器指令在列1中结束,那么它就会“卡在”,不受>>影响.增加缩进的唯一方法是I< Tab>或i< Ctrl-t> ;.然后它变成“未卡住”,我可以用<或>. 失败的解决方案 One solution建议在我的.vimrc中设置cinkeys- = 0#.这修复了坏东西1 – 3,但添加了一个新的:
坏事4(只有cinkeys- = 0#)
列1中的预处理器指令不受==或[movement] =的影响,意味着我仍然无法自动修复其缩进,直到手动缩进>>或通过插入制表符.
题
有没有办法解决坏事1 – 3没有介绍坏事4?我可以强制vim像普通的C语句一样处理以’#’开头的行吗?
(或者我只是以有害的方式使用#ifdefs,这是vim的方式告诉我停止吗?)
我不想修补vim和/或重新编译,但如果我必须,我会.
Vim puts a line in column 1 if:
- It starts with ‘#’ (preprocessor directives),if ‘cinkeys’ contains ‘#’.
- It starts with a label (a keyword followed by ‘:’,other than “case” and “default”) and ‘cinoptions’ does not contain an ‘L’ entry with a
positive value.- Any combination of indentations causes the line to have less than 0 indentation.
所以,从cinkeys中删除0#应该覆盖该默认行为. (这个想法在足够的地方出现on the interwebs.)
set cinkeys=0{,0},0),:,!^F,o,O,e
随着对Cinkeys的改变,这是我得到的,正是你要找的:
int main(void) { while(1) { /* normal things */ #ifdef DEBUG printDebugInfo(); #endif /* normal things */ } }