Як вимкнути формат коду Eclipse для певних розділів коду Java?


488

У мене є якийсь код Java з операторами SQL, написаний у вигляді рядків Java (будь-ласка, не FO / 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 на спеціальній основі.

В ідеалі рішення дозволить мені вставити інструкції для форматора 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, ймовірно, принесе багаторядкові рядки, що зробить це минулим.
Thorbjørn Ravn Andersen

Відповіді:


865

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


7
Варіант "Ніколи не з'єднуються лінії", який згадується в інших місцях на цій сторінці, також дуже корисний.
xpmatteo

89
Функції увімкнення / вимкнення повинні бути включені "увімкнено". У налаштуваннях Eclipse: Java> Style Code> Formatter. Натисніть кнопку "Редагувати", "Вимкнено / Увімкнено теги", виберіть "Увімкнути вимкнено / увімкнено".
Доменік Д.

2
Цей параметр недоступний у налаштуваннях стилю JavaScript Code , де у мене протилежна проблема форматування. :(
Редсандро

11
Команди повинні експортувати копію префіксів (файлу) Eclipse до своєї вікі та вимагати від всіх тих самих. Добре працює для нас. ;)
Йосип Похоть

FYI Мені довелося видалити пробіл між знаком // і @, щоб дозволити цьому працювати.
Roy Truelove

61

AFAIK від Eclipse 3.5 M4 на форматері має опцію "Ніколи не приєднуйтесь до ліній", яка зберігає розриви користувачів. Можливо, це робить те, що ти хочеш.

Ще там є цей некрасивий злом

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

1
Тож крім встановлення параметра "Ніколи не приєднуйтесь до ліній", я також повинен написати ці "фантомні" коментарі? Чи не повинна частина "Never Join Lines" сама по собі працювати?
Грег Маттес

2
Так, звичайно, слід. Зауваження фантома - це альтернативний підхід (якщо його не існує, або ви застрягли з більш ранньою версією тощо).
Кріс

Я використовував цей підхід у тандемі з користувацьким шаблоном форматування в TOAD, щоб дозволити мені зняти старий SQL з коду JAVA, переформатувати його та отримати всі сторонні коментарі, а потім повернути його в JAVA. Це біль, але це дозволяє нам автоматично відформатувати час збереження Java-коду. Дякую за пропозицію!
jnt30

Без перевірки "Ніколи не з'єднувати лінії" макроси вмикання / вимкнення для мене не працюють - дякую!
Крістофер Суп

28

Дивіться цю відповідь на ТАК .

Є ще одне рішення, яке можна використовувати для придушення форматування конкретних блокових коментарів. Використовуйте /*-(зверніть увагу на дефіс) на початку коментаря до блоку, і на форматування це не вплине, якщо ви форматуєте решту файлу.

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

Джерело: Документація в Oracle .


2
Це найкраща відповідь, оскільки це не залежить від конфігурації IDE користувача. Дякую.
Азим

26

Замість того, щоб вимикати форматування, ви можете налаштувати його не приєднуватися до вже завернутих рядків. Подібно до відповіді Джиттера, ось для Eclipse STS:

Властивості → Стиль Java-коду → Форматор → Увімкнути конкретні параметри проекту АБО Налаштування параметрів робочої області → Редагувати → Обертання рядків (вкладка) → встановіть прапорець «Ніколи не приєднуйтесь до вже завернутих рядків»

Збережіть, застосуйте.

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


1
Я думаю, що це допоможе для таких речей, як приклад SQL, але я не впевнений, що цього буде достатньо для загального випадку повністю відключення форматера IDE.
Грег Маттес

2
Це рішення є чудовим при використанні шаблону для побудови, і його актуальність, безумовно, збільшується з впровадженням лямбдів на Java 8.
Jonas Kongslund

16

Ви повинні увімкнути можливість додавання тегів форматера. У меню перейти до:

Windows Preferences Java Code Style Formatter

Натисніть Editкнопку. Виберіть останню вкладку. Помітьте ввімкнення / вимкнення поля та ввімкніть їх прапорець.


14

Якщо ви поставите знак плюс на початку рядка, він форматується інакше:

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

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

Закінчіть кожен із рядків подвійною косою рисою "//". Це дозволить утримати затемнення від переміщення їх усіх на одну лінію.


4

Альтернативний метод: У програмі Eclipse 3.6 під "Обертання рядків", а потім "Загальні налаштування" є опція "Ніколи не приєднуйтесь до вже завернутих рядків". Це означає, що форматник буде обгортати довгі рядки, але не скасовувати жодне обгортання.


4

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

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

Це завадило б це в першу чергу, оскільки ваші колеги переформатують код, який вони насправді не змінили. Це хороша практика для запобігання випадковим випадкам, які роблять різницю у вашому контролі джерела марною (коли весь файл переформатується через незначні відмінності в налаштуваннях формату).

Це також запобіжить переформатування, якщо параметр тегів увімкнення / вимкнення буде вимкнено.


2

Зауваження фантома, додавши, //де вам потрібні нові рядки, чудові!

  1. @Formatter: off додає в редактор посилання з коду. На мій погляд, код не повинен мати таких посилань.

  2. Примітки фантома (//) працюватимуть незалежно від використовуваного інструменту форматування. Незалежно від Eclipse або InteliJ або будь-якого редактора, який ви використовуєте. Це навіть працює з дуже приємним форматом Java Java

  3. Примітки фантома (//) працюватимуть у вашій програмі. Якщо у вас також є Javascript і можливо, використовуйте щось на зразок JSBeautifier . Ви можете мати подібний стиль коду також у Javascript.

  4. Насправді ви, напевно, хочете форматування правильно? Ви хочете видалити змішані пробіли / пробіли та пробіли. Рядки потрібно відступити відповідно до стандарту коду. Чого ти не хочеш - це довга черга. Це, і тільки це, те, що дає коментар фантома!


-3

Цей хак працює:

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

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


8
Не використовувати форматер - лише погана ідея; форматник допомагає вловлювати помилки і підтримує код у послідовному стані.
Френсіс Уптон IV

Цікава пропозиція, але я не бачу, як форматування підказує нам, чи добре код чи ні.
Кріс

2
Я думаю, що він говорить про те, що він вважає, що погано написаний, погано відформатований код повинен зберігатися як такий, а не форматувати його в надії на "покращення". Погано написаний, погано відформатований код повинен якось "стирчати", щоб його можна було легко ідентифікувати. Не зовсім впевнений, що я повністю згоден, але думаю, що це ідея.
Грег Маттес

1
@Francis - Помилки: Як можна автоматично відформатувати код, виявляючи помилки? Послідовність: Послідовність є приємним аргументом, але важливіша загальна якість коду. Ви можете визначити приємний послідовний процес гортання гамбургера, але він ніколи не буде працювати для кухні високої кухні. Приготування їжі може бути досить складною діяльністю або дрібницею, якщо проігнорувати достатньо фактів. Якщо ви думаєте, що розробка програмного забезпечення - це як гортання гамбургерних інструментів, що забезпечують послідовність. Це не аргумент проти форматування напрямних рядків, але якщо розробники не піклуються про ці вказівки, вони не піклуються про інші основні елементи.
Томас Юнг

4
Мій аргумент тут: я пишу хороший код і дотримуюся рядків керівництва щодо форматування. Але я ЛАЗНИЙ. Чому я повинен вставити правильну кількість пробілів і розривів рядків, коли я можу записати свої п’ять рядків неохайного коду, натиснути кнопку форматування і бути щасливим? ПІСЛЯ я відформатував код, використовуючи свій інструмент, який гарантує, що результат буде завжди ідеальним, я настільки ж нацист, як і хтось щодо форматування. Немає жодного аргументу проти дотримування напрямних ліній (крім того, що вони можуть бути особливо поганими), якщо форматування просто зачеплення. Усі учасники проекту мають однакові налаштування форматування коду.
За Вікландер
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.