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

У меня есть Java-код с операторами SQL, написанными как строки Java (пожалуйста, нет OR/M flamewars, встроенный 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 ad-hoc.

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

Ответ 1

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

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

Функции включения/выключения должны быть повернуты "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

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

enter image description here

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

Ответ 2

AFAIK от Eclipse 3.5 M4 на форматировании имеет опцию "Never Join Lines", которая сохраняет разрывы пользовательских строк. Возможно, это делает то, что вы хотите.

Иначе есть этот уродливый хак

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

Ответ 3

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

Свойства → Стиль Java-кода → Formatter → Включить специальные настройки проекта ИЛИ Настроить параметры рабочей области → Изменить → Линейная упаковка (вкладка) → установите флажок "Никогда не присоединяйте уже завернутые строки"

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

enter image description here

Ответ 4

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

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

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

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

Ответ 5

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

Windows Preferences Java Code Style Formatter

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

Ответ 6

Если вы положите знак "плюс" в начале строки, он форматирует по-разному:

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

Ответ 7

Я использую строки с фиксированной шириной (дополненные пробелами), чтобы избежать форматирования, помешавшего мой отступ строки 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                          ";

Ответ 8

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

Ответ 9

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

Ответ 10

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

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

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

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

Ответ 11

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

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

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

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

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

Ответ 12

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

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

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