Как отключить форматирование кода Eclipse для определенных разделов кода Java?

489

У меня есть некоторый код Java с инструкциями SQL, написанными в виде строк Java (пожалуйста, не используйте пламя войны OR / M, встроенный SQL - это не мое решение).

Я семантически разбил операторы SQL на несколько объединенных строк в несколько строк кода для простоты обслуживания. Так что вместо чего-то вроде:

String query = "SELECT FOO, BAR, BAZ FROM ABC WHERE BAR > 4";

У меня есть что-то вроде:

String query =
    "SELECT FOO, BAR, BAZ" +
    "  FROM ABC          " +
    " WHERE BAR > 4      ";

Этот стиль значительно упрощает чтение и поддержку SQL (IMHO), особенно для больших запросов. Например, я могу перевести мой редактор в режим «перезаписи» и довольно легко изменить текст на месте.

Обратите внимание, что эта проблема обобщается за пределы конкретного примера SQL. Любой код, который написан с любым вертикальным форматированием, особенно табличными конструкциями, может быть уничтожен симпатичным принтером.

Теперь некоторые участники проекта используют редактор Eclipse, и семантическое форматирование часто разрушается при форматировании всего исходного файла.

Есть ли способ проинструктировать Eclipse игнорировать определенные строки исходного текста в отношении форматирования?

Я ищу что-то вроде специального комментария, который переключает форматировщик Eclipse. В идеале, такой комментарий может быть настраиваемым, чтобы быть любым, что мы выбираем, и другие средства форматирования могут быть запрограммированы, чтобы уважать его:

// STOP-ECLIPSE-FORMATTING
String query =
    "SELECT FOO, BAR, BAZ" +
    "  FROM ABC          " +
    " WHERE BAR > 4      ";
// START-ECLIPSE-FORMATTING

Очевидно, что одно «решение» состоит в том, чтобы члены нашей команды стандартизировали какой-то внешний форматировщик, такой как Jalopy или JIndent , но это не тот вопрос, о котором идет речь (также не мое решение по этому проекту): я специально ищу способ избегайте форматирования Eclipse на разовой основе.

В идеале решение позволит мне вставить инструкции для форматера Eclipse, не требуя от членов команды, использующих Eclipse, каких-либо реконфигураций IDE (кроме возможности выбора комментария к команде, не зависящей от форматера: STOP-ECLIPSE-FORMATTINGSTOP-FORMATTING).

Грег Маттес
источник
1
У нас была эта проблема. Eclipse должен иметь возможность всегда разрывать строку в конструкторе String, где находится +, независимо от того, поместится ли следующий бит строки в строку. Но это не так. :-(
JeeBee
Очевидно, эта функция была добавлена ​​в Eclipse 3.6M6: bugs.eclipse.org/bugs/show_bug.cgi?id=27079
Гийом
Примечание. Если вы просто хотите, чтобы затмение не испортило ваши комментарии, то вы можете использовать // перед каждой строкой. Чтобы закомментировать блок, выделите и нажмите Ctrl + /.
Джон Хенкель
Обратите внимание, что теперь, спустя 10 лет, в Java 14, вероятно, появятся многострочные строки, которые уйдут в прошлое.
Турбьерн Равн Андерсен

Ответы:

866

Eclipse 3.6 позволяет отключить форматирование, поместив специальный комментарий, например

// @formatter:off
...
// @formatter:on

Особенности включения / выключения должны быть включены «на» в настройках Eclipse: Java > Code Style > Formatter. Нажмите на Edit, Off/On Tagsвключите Enable Off/On tags.

Также можно изменить магические строки в настройках - ознакомьтесь с документацией по Eclipse 3.6 здесь .

Больше информации

Java > Code Style > Formatter > Edit > Off/On Tags

Это предпочтение позволяет вам определить один тег для отключения и один тег для включения средства форматирования (см. Вкладку «Выкл. / Вкл. Теги» в вашем профиле форматера):

введите описание изображения здесь

Вам также нужно включить флаги из Java Formatting

xpmatteo
источник
7
Опция «Никогда не соединять линии», которая упоминается в других разделах этой страницы, также очень полезна.
xpmatteo
89
Функции включения / выключения должны быть включены. В настройках Eclipse: Java> Стиль кода> Форматер. Нажмите кнопку «Редактировать», «Выкл. / Вкл. Теги», отметьте «Включить теги Выкл. / Вкл.».
Доменик Д.
2
Это недоступно в настройках стиля кода JavaScript , где у меня возникла совершенно противоположная проблема с форматированием. :(
Redsandro
11
Команды должны экспортировать копию префикса (файла) Eclipse в свою вики и требовать, чтобы все использовали один и тот же. Хорошо работает для нас. ;)
Джозеф Ласт
К вашему сведению, мне пришлось убрать пробел между // и знаком @, чтобы заставить это работать.
Рой Truelove
61

AFAIK из Eclipse 3.5 M4 в формататоре имеет опцию «Никогда не объединять строки», которая сохраняет разрывы пользовательских строк. Может быть, это то, что вы хотите.

Еще есть этот уродливый хак

String query = //
    "SELECT FOO, BAR, BAZ" + //
    "  FROM ABC"           + //
    " WHERE BAR > 4";
дрожание
источник
1
Так что в дополнение к настройке опции «Никогда не присоединяться к линиям» я также должен написать эти «фантомные» комментарии? Разве часть «Никогда не соединяй линии» не должна работать сама по себе?
Грег Мэттес
2
Да, конечно, это должно быть. Фантомные комментарии - это альтернативный подход (в случае, если он не существует, или вы застряли с более ранней версией и т. Д.).
Крис
Я использовал этот подход в тандеме с пользовательским шаблоном форматирования в TOAD, чтобы позволить мне убрать старый SQL из кода JAVA, переформатировать его, получить все посторонние комментарии и затем выбросить его обратно в JAVA. Это больно, но теперь мы можем автоматически форматировать при сохранении нашего Java-кода. Спасибо за предложение!
jnt30
Без проверки «Никогда не соединять строки» макросы включения / выключения у меня не работают - спасибо!
Кристоффер Соуп 10.12.14
28

Смотрите этот ответ на SO .

Есть еще одно решение, которое вы можете использовать для подавления форматирования комментариев конкретного блока. Используйте /*-(обратите внимание на дефис) в начале комментария блока, и форматирование не будет затронуто, если вы отформатируете остальную часть файла.

/*-
 * Here is a block comment with some very special
 * formatting that I want indent(1) to ignore.
 *
 *    one
 *        two
 *            three
 */

Источник: документация в Oracle .

Renaud
источник
2
Это лучший ответ, так как он не зависит от конфигурации IDE пользователя. Спасибо.
Азим
26

Вместо того, чтобы отключить форматирование, вы можете настроить его так, чтобы он не объединял уже перенесенные строки. Аналогично ответу Джиттера, вот для Eclipse STS:

Свойства → Стиль кода Java → Форматер → Включить специфические настройки проекта ИЛИ Настроить параметры рабочего пространства → Редактировать → Перенос строк (вкладка) → установить флажок «Никогда не объединять уже перенесенные строки»

Сохранить, применить.

введите описание изображения здесь

Илинка
источник
1
Я думаю, что это поможет для таких вещей, как пример SQL, но я не уверен, что этого будет достаточно для общего случая полного отключения средства форматирования IDE.
Грег Мэттес
2
Это решение отлично подходит для использования шаблона компоновщика, и его актуальность, безусловно, возрастает с введением лямбд в Java 8.
Йонас Конгслунд
16

Вы должны включить возможность добавлять теги форматера. В меню выберите:

Windows Preferences Java Code Style Formatter

Нажмите Editкнопку Выберите последнюю вкладку. Обратите внимание на поле «Вкл / Выкл» и включите их с помощью флажка.

ZilWerks
источник
14

Если поставить знак плюс в начале строки, он форматируется иначе:

String query = 
    "SELECT FOO, BAR, BAZ" 
    +    "  FROM ABC"           
    +    " WHERE BAR > 4";
CPerkins
источник
1
Это может быть интересным компромиссом. В целом, я хотел бы воздержаться от слишком большого изменения форматирования кода из-за нежелательного поведения одного инструмента. В этом случае операторы конкатенации строк являются скорее случайностью, а не сущностью того, что происходит с SQL. Вот почему я предпочитаю писать их в конце каждой строки. Я чувствую, что SQL следует подчеркнуть как начало строки. Но это может быть хорошим путем, если нет решения, позволяющего мне сохранить желаемое форматирование. Спасибо!
Грег Мэттес
8
Пожалуйста. На самом деле, я десятилетиями ставил свои знаки + на передний план, чтобы не обманывать средство форматирования. Я предпочитаю их на фронте, потому что мне становится понятнее, что происходит в конце строки, иногда теряется. Когда-то, когда мы использовали дровяные компиляторы, это был стандарт проекта, и он застрял у меня.
CPerkins
5

Я использую строковые части фиксированной ширины (дополненные пробелами), чтобы форматер не испортил мой отступ строки SQL. Это дает смешанные результаты и не будет работать, когда пробелы не игнорируются, как в SQL, но могут быть полезны.

    final String sql = "SELECT v.value FROM properties p               "
            + "JOIN property_values v ON p.property_id = v.property_id "
            + "WHERE p.product_id = ?                                  "
            + "AND v.value        IS NOT NULL                          ";
Гус
источник
5

Завершите каждую строку двойной косой чертой "//". Это не даст затмению переместить их всех в одну линию.

Evvo
источник
4

Альтернативный метод: в Eclipse 3.6 в разделе «Перенос строк», а затем «Общие параметры» есть опция «Никогда не объединять уже перенесенные строки». Это означает, что средство форматирования будет переносить длинные строки, но не отменять любое, которое у вас уже есть.

kmccoy
источник
4

У @xpmatteo есть ответ на отключение частей кода, но в дополнение к этому, настройки затмения по умолчанию должны быть установлены для форматирования только отредактированных строк кода вместо всего файла.

Preferences->Java->Editor->Save Actions->Format Source Code->Format Edited Lines

Это предотвратило бы это в первую очередь, поскольку ваши коллеги переформатировали код, который они на самом деле не изменили. Это хорошая практика для предотвращения ошибок, которые делают diff на вашем контроле исходного кода бесполезным (когда весь файл переформатируется из-за незначительных различий в настройках формата).

Это также предотвратит переформатирование, если опция включения / выключения тегов была отключена.

Робин
источник
2

Фантомные комментарии, добавляющие, //где вы хотите новые строки, великолепны!

  1. @Formatter: off добавляет ссылку из кода в редактор. Код, по моему мнению, никогда не должен иметь таких ссылок.

  2. Фантомные комментарии (//) будут работать независимо от используемого инструмента форматирования. Независимо от Eclipse, InteliJ или любого другого редактора, который вы используете. Это даже работает с очень хорошим форматом Google Java

  3. Фантомные комментарии (//) будут работать во всем приложении. Если у вас также есть Javascript и, возможно, используется что-то вроде JSBeautifier . Вы можете иметь подобный стиль кода также в Javascript.

  4. На самом деле, вы, вероятно, хотите форматирования правильно? Вы хотите удалить смешанные табуляцию / пробел и конечные пробелы. Вы хотите сделать отступ в соответствии со стандартом кода. То, что вы не хотите, это длинная очередь. Это, и только это, то, что дает вам призрачный комментарий!

Томас Бьерре
источник
-3

Этот хак работает:

String x = "s" + //Formatter Hack
    "a" + //
    "c" + //
    "d";

Я бы предложил не использовать форматтер. Плохой код должен выглядеть плохо, а не искусственно. Хороший код требует времени. Вы не можете обмануть качество. Форматирование является частью качества исходного кода.

Томас Юнг
источник
8
Не использовать форматтер - это просто плохая идея; средство форматирования помогает отлавливать ошибки и поддерживает код в согласованном состоянии.
Фрэнсис Аптон IV
Интересное предложение, но я не вижу, как форматирование говорит нам, хорош ли код или нет.
Крис
2
Я думаю, что он говорит о том, что он считает, что плохо написанный, плохо отформатированный код следует сохранять как есть, а не форматировать его в надежде на «его улучшение». Плохо написанный, плохо отформатированный код должен как-то «торчать», чтобы его можно было легко идентифицировать. Не совсем уверен, что я полностью согласен, но я думаю, что это идея.
Грег Мэттес
1
@Francis - Ошибки: Как автоматически отформатированный код находит ошибки? Согласованность. Согласованность - хороший аргумент, но в целом качество кода более важно. Вы можете определить хороший последовательный процесс для переворачивания гамбургера, но он никогда не будет работать для высокой кухни. Приготовление пищи может быть достаточно сложным или тривиальным делом, если вы игнорируете достаточно фактов. Если вы думаете, что разработка программного обеспечения подобна инструментам для переворота гамбургеров, обеспечивающих согласованность, для вас. Это не аргумент против форматирования руководящих строк, но если разработчики не заботятся об этих рекомендациях, они не будут заботиться о других элементах.
Томас Юнг
4
Мой аргумент здесь: я пишу хороший код и придерживаюсь руководств по форматированию. Но я ленивый. Почему я должен вставлять правильное количество пробелов и разрывов строк, когда я могу написать свои пять строк небрежного кода, нажать кнопку форматирования и быть счастливым? ПОСЛЕ ТОГО, КАК Я отформатировал код, используя мой инструмент, который гарантирует, что результат всегда идеален, я такой же нацистский, как и все остальные, относительно форматирования. Нет никакого аргумента против прилипания к направляющим линиям (кроме того, что они могут быть особенно плохими), если форматирование находится всего в нескольких шагах. Все участники проекта имеют одинаковые настройки форматирования кода.
За Wiklander