Главная информация
(Примечание: пожалуйста, прочтите это до конца, потому что я потратил немного времени на его организацию, убедившись, что я рассмотрел каждую отдельную проблему, с которой я столкнулся, и почему одно предложенное решение не работает для меня.)
Я использую cindent в vim, чтобы автоматически делать отступы. В большинстве случаев он отлично работает. Однако cindent совершает три плохих дела (на мой взгляд), связанных с директивами препроцессора 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 / C ++.
Плохая вещь 2
Когда я использую ==
на (или [movement]=
поперек) строке с директивой препроцессора, vim помещает ее обратно в столбец 1. (Это соответствует Bad Thing 1, но все еще является проблемой.)
Плохая вещь 3
Если (из-за Плохой вещи 1 или 2 или использования <<
) директива препроцессора попадает в столбец 1, она застревает там, и >>
на нее не влияет. Единственный способ увеличить отступ - I<Tab>
или i<Ctrl-t>
. Затем он отключается, и я могу переместить его с помощью <<
или >>
.
Неудачные решения
Одно решение предлагает поместить set cinkeys-=0#
в мой .vimrc
. Это исправляет плохие вещи 1–3, но добавляет новый:
Bad Thing 4 (только с cinkeys-=0#
)
Директивы препроцессора в столбце 1 не зависят от ==
или [movement]=
, что означает, что я все еще не могу автоматически исправить их отступ, пока я вручную не сделаю отступ с помощью >>
или путем вставки символа табуляции.
Вопрос
Есть ли способ разрешить Плохие вещи 1–3, не вводя Плохие вещи 4? Могу ли я заставить vim обрабатывать строки, начинающиеся с '#', как обычные операторы C?
(Или я просто использую #ifdef
s во вред, и это способ vim говорит мне остановиться?)
Я бы предпочел не патчить vim и / или перекомпилировать, но сделаю это, если потребуется.
xyz was not declared in this scope
, и это буквально выглядит как встроенный инопланетный код, пытающийся что-то изобразить , как Витрувианский человек Давинчи - person puk   schedule 29.11.2013cinkeys=0{,0},0),:,!^F,o,O,e
, это то, что рекомендуется в решении, но иногда такое случается. Это случается даже после того, как яset nocindent
- person Theo Belaire   schedule 10.02.2014#ifdef
, поэтому в случае, еслиgetchar
может быть макросом, вы также должны выровнять это выравнивание с левым столбцом. - person Kaz   schedule 12.04.2021