Как отключить форматирование кода 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}

В этом же окне обновите вкладку:

  • Tick Обновить ресурсы после завершения.

  • Отметьте "Выбранный ресурс"

То же окно, общая вкладка:

  • Отображение в меню избранного, Отметьте "Внешние инструменты"

Ответ 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, и это продукт с открытым исходным кодом, возможно, вы можете переносить логику на форматировщик С++.

Вы также можете избежать форматирования всего файла и вместо этого форматировать только путем выбора.