Подтвердить что ты не робот

Vim и С++ 11 lambda: авто отступ

Использование vim с С++ 11 лямбда-функций на самом деле невелико. Отступы не работают, и многие скобки обозначены как ошибочные.

Как я знаю, выделение отступов и синтаксиса для c и С++ программируется внутри, а не через файл c [...]. vim. Есть ли возможность настроить vim для С++ 11, особенно для исходного кода с лямбда-функциями? Может кто-то может дать подсказку, как и где добавить лямбда-анализ во внутренней синтаксисе проверки vim?

EDIT: (пример кода в соответствии с запросом комментариев)

Код должен выглядеть следующим образом, но отформатирован в один столбец.

  MyLoop( [](int a, int b){
        {       
            ::i++;
            for (;;)
            {   
                SomeFunc();
            }   
            cout << "Result: " << a*b<<endl;
        }       
    });    

Обновление для vim 7.4: Теперь vim больше не обрабатывал выражение лямбда как ошибку, но он все еще НЕ делал никаких отступов в выражении лямбда, и поэтому он больше не может использоваться для С++: - (

BTW: У кого-нибудь хороший инструмент автоматического форматирования, который можно добавить в среду vim, так что нажатие клавиши внешне делает форматирование?

4b9b3361

Ответ 1

У Vim 7.4 теперь есть jN cinoption для "Анонимных классов отступа Java". (:help java-cinoptions) Это улучшает отступы поведения для С++ 11 lambdas.

С помощью этих опций (введите ~/.vim/after/ftplugin/cpp.vim):

setlocal cindent cino=j1,(0,ws,Ws

И если я переместил вашу скобку для открытия цикла в ту же строку (в противном случае это сумасшествие), тогда vim отменит ваш код следующим образом:

MyLoop( [](int a, int b){
    {       
        ::i++;
        for (;;) {   
            SomeFunc();
        }   
        cout << "Result: " << a*b<<endl;
    }       
});   

Это не дает висячий отступ, который вы хотите. Если вы перенесите начальную открывающую скобу в свою собственную линию, тогда вы получите нужный висячий отступ.

Для всех параметров см. :help cinoptions-values.


Если вы хотите использовать более умную отступы, этот пользователь рекомендует set equalprg=clang-format использовать ClangFormat, поэтому =ip будет отступать от текущего абзаца. Это не приведет к тому, что vim будет правильно отступать по мере ввода (вам нужно настроить indentexpr для этого, и это довольно сложно).

Там также плагин vim, который, похоже, делает то же самое, что и установка equalprg, но с большим количеством кода. Не уверен, что это лучше. Это должно быть альтернативой clang-format.py (из ответа Киприана Герры).

Ответ 2

Использование

:let c_no_curly_error = 1

Вы можете поместить это в свой vimrc, например.

Что касается вашего предположения, это неправильно. Существует синтаксический файл c.vim (в vim runtime). Вы можете увидеть ссылку в :help c.vim и реализацию, посмотрев ее в ваших жизненных циклах vim (:echo &rtp).

Ответ 3

Существует этот проект Майкла Малого. Я еще не пробовал, но, возможно, это то, что вы ищете.

Ответ 4

установить autoindent autoindent

Затем вы вводите код выше в vim, вы получите правильный отступ.

НО, если вы используете gg = G или команды, содержащие "=" для повторного отступа выше кода, отступ по-прежнему не соответствует.

Ответ 5

То, что вы ищете, clang-format.py от парней LLVM или vim-clang-format от Linda_pp aka rhysd (спасибо idbrii для последнего) - оба используют clang, поэтому обе поддерживают все новые структуры С++ 11, и вы можете запустить его следующим образом:

:pyf ~/src/llvm.git/tools/clang/tools/clang-format/clang-format.py

или   : ClangFormat

Последнее кажется лучше, поскольку он (среди других функций) позволяет следовать правилу "один конфигурационный файл для того же поведения в каждой среде", особенно когда вы используете диспетчер надстройки VIM (например, VAM).

Ответ 6

Я просто боролся с этим в течение нескольких дней, похоже, что переключение на smartindent с включенным cindent помогло мне с этим отступом лямбда в С++ 11.

В вашем ~/.vimrc

set cindent
set smartindent

Надеюсь, это поможет заглянуть.