Jak wyĹ ' Ä ... czyÄ ‡ program do formatowania kodu Eclipse dla niektĂłrych fragmentăłw kodu Javy?

Mam trochę kodu Javy z wyrażeniami SQL zapisanymi jako ciągi Javy (proszę nie LUB / m flamewars, osadzony SQL jest jaki jest - nie moja decyzja).

Złamałem semantycznie instrukcje SQL na kilka połączonych łańcuchów w kilku liniach kodu dla ułatwienia konserwacji. Więc zamiast czegoś takiego:

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

Mam coś takiego:

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

Ten styl sprawia, że SQL jest znacznie łatwiejszy do odczytania i utrzymania (IMHO), szczególnie w przypadku większych zapytań. Na przykład może umieścić mój edytor w trybie "nadpisania" i dość łatwo zmodyfikować tekst na miejscu.

Zauważ, że ten problem uogólnia się poza konkretnym przykładem SQL. Każdy kod napisany przy użyciu formatowania pionowego, szczególnie konstrukcji tabelarycznych, jest podatny na zniszczenie przez ładną drukarkę.

Teraz niektórzy członkowie projektu używają edytora Eclipse i formatowanie semantyczne jest często niszczone, gdy formatują cały plik źródłowy.

Czy jest sposób na polecić Eclipse ignorowanie pewnych linii źródłowych w odniesieniu do formatowania?

Szukam czegoś w rodzaju specjalnego komentarza, który włącza formater Eclipse. W idealnej sytuacji taki komentarz mógłby być konfigurowalny tak, aby był cokolwiek wybierzemy, a inne formatery mogłyby być zaprogramowane tak, aby go respektować: {]}

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

Oczywiście jednym "rozwiązaniem" jest standaryzacja przez członków naszego zespołu jakiegoś zewnętrznego formatera, takiego jak Jalopy lub JIndent, ale to nie jest to, co to pytanie dotyczy (również nie mojej decyzji w sprawie tego projektu): szukam sposobu, aby uniknąć formatowania Eclipse na zasadzie ad-hoc.

Idealnie, rozwiązanie pozwoli mi wstawić instrukcje dla formatera Eclipse bez konieczności używania przez członków zespołu Eclipse rekonfiguracji IDE (poza ewentualnym wyborem polecenia formatera: STOP-ECLIPSE-FORMATTINGSTOP-FORMATTING).

Author: msrd0, 2009-11-30

12 answers

Eclipse 3.6 pozwala wyłączyć formatowanie poprzez umieszczenie specjalnego komentarza, np.

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

Funkcje on/off muszą być włączone "on" w preferencjach Eclipse: Java > Styl kodu > Formatter . Kliknij na Edytuj, off/on Tags, enable Enable off / On tags.

Jest również możliwe, aby zmienić magiczne ciągi w preferencjach - sprawdź Eclipse 3.6 docs tutaj .

Więcej Informacje

Java > Styl Kodu > formatowanie > Edytuj > Off/On Tags

Ta preferencja pozwala na zdefiniowanie jednego znacznika do wyłączenia i jednego znacznika do włączenia formatowania (patrz zakładka off/On Tag W profilu formatowania):

Tutaj wpisz opis obrazka

Należy również włączyć flagi z formatowania Javy

 791
Author: xpmatteo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-04-11 13:06:05

AFAIK z Eclipse 3.5 M4 na formaterze ma opcję "Never Join Lines", która zachowuje podziały linii użytkownika. Może to robi, co chcesz.

Else there is this ugly hack

String query = //
    "SELECT FOO, BAR, BAZ" + //
    "  FROM ABC"           + //
    " WHERE BAR > 4";
 58
Author: jitter,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-11-30 16:48:29

Zamiast wyłączać formatowanie, możesz skonfigurować, aby nie łączyło już zawiniętych linii. Podobnie jak odpowiedź jittera, tutaj dla Eclipse STS:

Właściwości → styl kodu Java → formatowanie → Włącz ustawienia specyficzne dla projektu lub skonfiguruj ustawienia obszaru roboczego → Edycja → owijanie linii (tab) → zaznacz "nigdy nie dołączaj już owiniętych linii"

Zapisz, zastosuj.

Tutaj wpisz opis obrazka

 22
Author: ilinca,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-07-31 14:30:29

Zobacz tę odpowiedź na SO .

Istnieje inne rozwiązanie, które można wykorzystać do tłumienia formatowania określonych komentarzy blokowych. Użyj /*- (zwróć uwagę na myślnik) na początku komentarza blokującego, a formatowanie nie będzie miało wpływu, jeśli sformatujesz resztę pliku.

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

Źródło: dokumentacja w Oracle .

 21
Author: Renaud,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:10:47

Musisz włączyć możliwość dodawania znaczników formatera. Na pasku Menu Przejdź do:

Windows Preferencje Java Styl Kodu formatowanie

Naciśnij przycisk edytuj . Wybierz ostatnią kartę. Zwróć uwagę na pole włączania/wyłączania i włącz je za pomocą pola wyboru.

 16
Author: ZilWerks,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-12-16 00:10:55

Jeśli umieścisz znak plus na początku linii, formatuje on Inaczej:

String query = 
    "SELECT FOO, BAR, BAZ" 
    +    "  FROM ABC"           
    +    " WHERE BAR > 4";
 14
Author: CPerkins,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-12-29 22:35:01

Używam części ciągów o stałej szerokości (wyściełane białymi spacjami), aby uniknąć bałaganu formatera w moim wcięciu ciągów SQL. Daje to mieszane wyniki i nie będzie działać tam, gdzie białe znaki nie są ignorowane, jak to jest w SQL, ale może być pomocne.

    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
Author: Guus,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-07-16 11:17:51

Zakończ każdą z linii podwójnym ukośnikiem"//". To powstrzyma eclipse od przeniesienia ich wszystkich na tę samą linię.

 5
Author: Evvo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-07-23 02:12:17

Alternatywna metoda: w Eclipse 3.6, pod "Line Wrapping" następnie " General Settings "jest opcja" Never join already wrapped lines."Oznacza to, że program formatujący zawija długie linie, ale nie cofnie żadnego owinięcia, które już masz.

 4
Author: kmccoy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-04-16 17:10:48

@xpmatteo ma odpowiedź na wyłączenie części kodu, ale oprócz tego, domyślne ustawienia eclipse powinny być ustawione na formatowanie tylko edytowanych linii kodu zamiast całego pliku.

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

To uniemożliwiłoby to w pierwszej kolejności, ponieważ twoi współpracownicy formatują kod, którego tak naprawdę nie zmienili. Jest to dobra praktyka, aby zapobiec przypadkom, które sprawiają, że diff na kontroli źródła bezużyteczne (gdy cały plik jest sformatowany z powodu drobnych różnice w Ustawieniach formatu).

Uniemożliwiłoby to również formatowanie, jeśli opcja znaczników on/off została wyłączona.

 4
Author: Robin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-08-15 15:02:10

Komentarze phantom, dodawanie // gdzie chcesz nowe wiersze, są świetne!

  1. @formatter: off dodaje odniesienie z kodu do edytora. Kodeks nie powinien, moim zdaniem, mieć takich odniesień.

  2. Komentarze phantom (//) będą działać niezależnie od używanego narzędzia formatowania. Niezależnie od Eclipse, InteliJ czy jakiegokolwiek używanego edytora. Działa to nawet z bardzo ładnym Google Java Format

  3. THE phantom comments (//) będzie działać w całej aplikacji. Jeśli masz również Javascript i być może użyć czegoś w rodzaju JSBeautifier. Możesz mieć podobny styl kodu również w Javascript.

  4. Właściwie, prawdopodobnie chcesz formatowania prawda? Chcesz usunąć mieszane tabulator / spację i spacje końcowe. Chcesz wciąć linie zgodnie ze standardem kodu. To, czego nie chcesz, to długa kolejka. to, i tylko to, jest to, co daje komentarz fantomowy ty!

 1
Author: Tomas Bjerre,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-26 19:18:46

Ten hack działa:

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

Sugerowałbym nie używać formatera. zły kod powinien wyglądać źle, a nie sztucznie dobrze.Dobry kod wymaga czasu. Nie można oszukiwać na jakości. Formatowanie jest częścią jakości kodu źródłowego.

 -3
Author: Thomas Jung,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-11-30 16:55:03