Общая информация
(Примечание. Пожалуйста, прочитайте это до конца, потому что я потратил немного времени на его организацию, убедившись, что я рассматриваю каждую отдельную проблему, с которой сталкиваюсь, и почему одно предлагаемое решение не работает для меня.)
Я использую cindent in vim для автоматического создания отступа. Он отлично работает большую часть времени. Тем не менее, cindent делает три Bad Things (на мой взгляд) с использованием директив C препроцессора (утверждения, начинающиеся с хэша ('#')).
В случае, если это имеет значение, я использую вкладки для отступов, а я мой .vimrc содержит filetype indent on
.
Плохая вещь 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/С++.
Плохая вещь 2
Когда я использую ==
on (или [movement]=
через) строку с директивой препроцессора, vim возвращает ее в столбце 1. (Это соответствует Bad Thing 1, но все еще проблема.)
Плохая вещь 3
Если (из-за Bad Thing 1 или 2 или использования <<
) директива препроцессора заканчивается в столбце 1, она становится "застревает" там и на нее не влияет >>
. Единственный способ увеличить отступ - I<Tab>
или i<Ctrl-t>
. Затем он становится "незакрепленным", и я могу перемещать его с помощью <<
или >>
.
Неудавшиеся решения
Одно из решений предлагает помещать set cinkeys-=0#
в мой .vimrc
. Это исправляет Плохие вещи 1 - 3, , но добавляет новый:
Плохая вещь 4 (только с cinkeys-=0#
)
Директивы препроцессора в столбце 1 не подвержены влиянию ==
или [movement]=
, что означает, что я все еще не могу автоматически исправить их отступ, пока я не откорректировал их вручную с помощью >>
или вставив символ табуляции.
Вопрос
Есть ли способ разрешить Bad Things 1 - 3 без введения Bad Thing 4? Могу ли я заставить vim обрабатывать строки, начинающиеся с '#', как обычные выражения C?
(Или я просто использую #ifdef
вредным образом, и это vim способ сказать мне остановиться?)
Я бы предпочел не исправлять vim и/или перекомпилировать, но я буду, если мне придется.