Vim и C ++ 11 лямбда: авто отступ - PullRequest
16 голосов
/ 09 ноября 2011

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

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

РЕДАКТИРОВАТЬ: (пример кода в соответствии с просьбой из комментариев)

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

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

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

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

Ответы [ 6 ]

17 голосов
/ 30 октября 2014

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

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

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

И если я перенесу открывающую скобку для цикла for на ту же строку (в противном случае это сумасшествие), то 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 (из ответа Киприана Герры).

1 голос
/ 09 ноября 2011

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

1 голос
/ 09 ноября 2011

Используйте

:let c_no_curly_error = 1

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

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

0 голосов
/ 01 августа 2014

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

В вашем ~ / .vimrc

set cindent
set smartindent

Надеюсь, это поможет.

0 голосов
/ 04 мая 2014

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

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

или: ClangFormat

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

0 голосов
/ 29 марта 2013

set smartindent autoindent

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...