Как отключить форматирование кода Eclipse CDT для кодового блока
Форматировщик кода CDT имеет довольно приличный выбор параметров, но, похоже, он не имеет функции, позволяющей игнорировать блок кода. Эта функция существует в форматировании кода Java:
// @formatter:off
... // code that should not be formatted
// @formatter:on
Есть ли эта особенность, и я просто не знаю об этом, или кто-нибудь знает о каких-либо достойных условиях работы?
В моем конкретном случае я пытаюсь определить структуры данных (типы перечислений и массивы строк), которые я хочу иметь определенные макеты.
Ответы
Ответ 1
Использовать форматировщик Astyle (Artistic Style), он намного превосходит встроенный форматировщик Eclipse CDT и имеет требуемую функцию:
http://astyle.sourceforge.net/astyle.html#_Disable_Formatting
Пример:
#include <iostream>
int main(int argc, char** argv)
{
// *INDENT-OFF*
std::cout<<"hello world"<<'\n';
// *INDENT-ON*
}
Форматирование этого с помощью астиля не будет отступать от кода между //INDENT -OFF и//INDENT-ON, но также отключит любые другие функции форматирования astyle, например, расстояние между инструкциями в этом случае.
Я использую его самостоятельно как внешний инструмент.
Единственная проблема: внешние инструменты не имеют горячих клавиш, но есть одна горячая клавиша "Запустить последний запущенный внешний инструмент", и если вы используете только один внешний инструмент, он работает так же.
Подробнее о конфигурации (linux):
Astyle:
Вы можете легко получить его из своих репозиториев или через официальный сайт.
Чтобы настроить файл конфигурации с настройками форматирования:
http://astyle.sourceforge.net/astyle.html#_Options_File
Я использую вариант домашней папки, просто создаю .astylerc в $HOME, моя содержит:
--suffix=none
--style=allman
--indent=tab=4
--max-code-length=70
--close-templates
--keep-one-line-blocks
--break-elseifs
--break-closing-brackets
--align-reference=type
--align-pointer=type
--indent-classes
--indent-modifiers
--indent-switches
--indent-cases
--indent-labels
--indent-col1-comments
--min-conditional-indent=0
--pad-oper
--pad-header
--unpad-paren
Eclipse:
Меню "Выполнить" → Внешние инструменты → Внешние инструменты Конфигурации... Добавьте новую "Программу" и в окно конфигурации:
-
Местоположение:/usr/bin/astyle (используйте whereis или найдите, чтобы проверить это)
-
Рабочий каталог: ${project_loc}
-
Аргументы: ${selected_resource_loc}
В этом же окне обновите вкладку:
То же окно, общая вкладка:
- Отображение в меню избранного, Отметьте "Внешние инструменты"
Ответ 2
Если вы используете OS X или Linux (я не проверял Windows, но он может поддерживаться), вы можете использовать clang-format
и CppStyle
.
clang-format
- это утилита форматирования, которая снабжена Clang
, и она поддерживает комментарии on/off // clang-format on
и // clang-format off
в коде C/С++/ObjC. Введение в сборку Clang
и ее утилиты можно найти здесь.
http://clang.llvm.org/get_started.html
Вам не нужно устанавливать целые файлы Clang
и LLVM
в вашей системе. Поскольку clang-format
- автономная программа, которая работает без Clang
. Комментарии вкл/выкл не поддерживаются в старых версиях, поэтому, пожалуйста, используйте ver 3.7 (доступно с SVN по состоянию на февраль 2015 г.).
CppStyle
- это плагин Eclipse, который позволяет нам использовать clang-format
из Eclipse CDT.
https://github.com/wangzw/cppstyle
FYI. Вот тот же запрос функции в CDT Bugzilla. Функциональность может быть официально поддержана в будущем, но использование clang-format
или Astyle
представляется лучшим решением на данный момент. https://bugs.eclipse.org/bugs/show_bug.cgi?id=453926
Ответ 3
Я думаю, я мог бы использовать их в файле с расширением, игнорируемым форматированием, и включать этот файл там, где это необходимо. Я пробовал это, и он работает - структура данных получает подхватчик индексатора (то есть работает автозаполнение). Тем не менее, было бы неплохо иметь эквивалент синтаксиса Java "@formatter:...".
Ответ 4
Насколько я знаю, ответ просто нет, такой функции не существует. Возможно, вы сможете реализовать такую функцию, используя SDK. Помните, что по моему опыту документация очень неполная, и очень сложно найти разработчика Eclipse, который был бы готов помочь вам заполнить отверстия. Но поскольку функция существует в форматировщике Java, и это продукт с открытым исходным кодом, возможно, вы можете переносить логику на форматировщик С++.
Вы также можете избежать форматирования всего файла и вместо этого форматировать только путем выбора.