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, так что нажатие клавиши внешне делает форматирование?
Ответы
Ответ 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
Надеюсь, это поможет заглянуть.