Сделать директоры препроцессора c отступами vim такими же, как в других заявлениях - программирование
Подтвердить что ты не робот

Сделать директоры препроцессора c отступами vim такими же, как в других заявлениях

Общая информация

(Примечание. Пожалуйста, прочитайте это до конца, потому что я потратил немного времени на его организацию, убедившись, что я рассматриваю каждую отдельную проблему, с которой сталкиваюсь, и почему одно предлагаемое решение не работает для меня.)

Я использую 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 и/или перекомпилировать, но я буду, если мне придется.

4b9b3361

Ответ 1

Из документации Vim в разделе cinoptions:

Vim помещает строку в столбец 1, если:

  • Он начинается с '#' (директивы препроцессора), если 'cinkeys' содержит '#'.
  • Он начинается с метки (ключевое слово, за которым следует ":", кроме "case" и "default" ), а "cinoptions" не содержит запись "L" с положительное значение.
  • Любая комбинация отступов приводит к тому, что строка имеет меньше нуля.

Итак, удаление 0# из cinkeys должно переопределить это поведение по умолчанию. (Эта идея появляется в достаточном количестве на веб-сайтах.)

set cinkeys=0{,0},0),:,!^F,o,O,e

С этим изменением на cinkeys, вот что я получил, именно то, что вы ищете:

int main(void)
{
    while(1) {
        /* normal things */
        #ifdef DEBUG
        printDebugInfo();
        #endif
        /* normal things */
    }
}

Ответ 2

Решение для Bad Thing 4

set cinoptions+=#1s

Если вы используете == или [movement]=, это будет отступать на 1 смену. Сочетание его с опцией cinkeys-=0# работало для меня.