Come disattivare il formattatore del codice Eclipse per alcune sezioni del codice Java?


489

Ho del codice Java con istruzioni SQL scritte come stringhe Java (per favore niente OR / M flamewars, l'SQL incorporato è quello che è - non la mia decisione).

Ho diviso semanticamente le istruzioni SQL in più stringhe concatenate su più righe di codice per facilità di manutenzione. Quindi invece di qualcosa come:

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

Ho qualcosa del tipo:

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

Questo stile rende l'SQL molto più facile da leggere e gestire (IMHO), specialmente per query più grandi. Ad esempio, posso mettere il mio editor in modalità "sovrascrivi" e modificare il testo sul posto abbastanza facilmente.

Si noti che questo problema si generalizza oltre l'esempio particolare di SQL. Qualsiasi codice scritto con qualsiasi formattazione verticale, in particolare costrutti tabulari, è suscettibile alla distruzione da parte di una bella stampante.

Ora, alcuni membri del progetto usano l'editor Eclipse e la formattazione semantica viene spesso distrutta quando formattano un intero file sorgente.

C'è un modo per istruire Eclipse a ignorare determinate righe di sorgente rispetto alla formattazione?

Sto cercando qualcosa di simile a un commento speciale che commuta il formattatore Eclipse. Idealmente, un tale commento potrebbe essere configurabile per essere quello che scegliamo e altri formattatori potrebbero essere programmati per rispettarlo:

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

Ovviamente, una "soluzione" è quella di far standardizzare i membri del nostro team su alcuni formattatori esterni come Jalopy o JIndent , ma non è questo il problema (anche la mia decisione su questo progetto): sto specificatamente cercando un modo per evitare il formatter di Eclipse su una base ad hoc.

Idealmente, una soluzione mi consentirà di inserire le istruzioni per il formattatore Eclipse senza richiedere ai membri del team che utilizzano Eclipse di eseguire alcuna riconfigurazione IDE (oltre alla possibilità di scegliere un commento al comando agnostico del formatter: STOP-ECLIPSE-FORMATTINGSTOP-FORMATTING).


1
Abbiamo avuto questo problema. Eclipse dovrebbe avere un'opzione per spezzare sempre una linea in un costruttore di String in cui un + è, indipendentemente dal fatto che il prossimo bit di stringa si adatterà alla linea. Ma non lo fa. :-(
JeeBee,

Apparentemente questa funzione è stata aggiunta in Eclipse 3.6M6: bugs.eclipse.org/bugs/show_bug.cgi?id=27079
Guillaume

Nota: se si desidera semplicemente impedire a eclipse di incasinare i propri commenti, è possibile utilizzare // davanti a ciascuna riga. Per commentare un blocco, evidenziare e premere Ctrl + /.
John Henckel,

Si noti che ora 10 anni dopo, Java 14 probabilmente porterà stringhe multilinea che fanno di questo un ricordo del passato.
Thorbjørn Ravn Andersen,

Risposte:


866

Eclipse 3.6 consente di disattivare la formattazione inserendo un commento speciale, ad esempio

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

Le funzioni on / off devono essere impostato su "on" nelle preferenze Eclipse: Java > Code Style > Formatter. Clicca su Edit, Off/On Tags, abilitare Enable Off/On tags.

È anche possibile cambiare le stringhe magiche nelle preferenze - dai un'occhiata ai documenti di Eclipse 3.6 qui .

Maggiori informazioni

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

Questa preferenza consente di definire un tag da disabilitare e un tag per abilitare il formatter (vedere la scheda Off / On Tag nel profilo del formatter):

inserisci qui la descrizione dell'immagine

È inoltre necessario abilitare i flag da Java Formatting


7
Anche l'opzione "Non unire mai le linee" menzionata altrove in questa pagina è molto utile.
xpmatteo,

89
Le funzioni di attivazione / disattivazione devono essere attivate. Nelle preferenze Eclipse: Java> Stile codice> Formatter. Fare clic sul pulsante "Modifica", "Off / On Tag", selezionare "Abilita Off / On tag".
Domenic D.

2
Questo non è disponibile nelle preferenze di stile codice JavaScript , dove ho l'esatto problema opposto con la formattazione. :(
Redsandro,

11
I team dovrebbero esportare una copia delle preferenze (file) di Eclipse nel loro wiki e richiedere a tutti di usare lo stesso. Funziona bene per noi. ;)
Joseph Lust,

Cordiali saluti, ho dovuto rimuovere lo spazio tra il // e il segno @ per farlo funzionare.
Roy Truelove,

61

AFAIK di Eclipse 3.5 M4 sul formatter ha un'opzione "Never Join Lines" che preserva le interruzioni delle linee dell'utente. Forse fa quello che vuoi.

Altrimenti c'è questo brutto hack

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

1
Quindi, oltre a impostare l'opzione "Non unire mai le righe", devo anche scrivere questi commenti "fantasma"? La parte "Never Join Lines" non dovrebbe funzionare da sola?
Greg Mattes,

2
Sì, certo che dovrebbe. I commenti fantasma sono un approccio alternativo (nel caso in cui non esista, o sei bloccato con una versione precedente, ecc.).
Chris,

Ho usato questo approccio in tandem con un modello di formattazione personalizzato in TOAD per consentirmi di rimuovere il vecchio SQL dal codice JAVA, riformattarlo e ottenere tutti i commenti estranei e poi rimetterlo in JAVA. È una seccatura, ma ci ha permesso di formattare automaticamente per salvare il nostro codice Java ora. Grazie per il suggerimento!
jnt30

Senza controllare "Non unire mai le linee" le macro on / off non funzionano per me - grazie!
Christoffer Soop,

28

Vedi questa risposta su SO .

Esiste un'altra soluzione che è possibile utilizzare per sopprimere la formattazione di commenti di blocco specifici. Utilizzare /*-(notare il trattino) all'inizio del commento sul blocco e la formattazione non sarà influenzata se si formatta il resto del file.

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

Fonte: documentazione su Oracle .


2
Questa è la risposta migliore poiché non dipende dalla configurazione dell'IDE dell'utente. Grazie.
Azim,

26

Invece di disattivare la formattazione, è possibile configurarlo per non unire le linee già tratteggiate. Simile alla risposta di Jitter, ecco Eclipse STS:

Proprietà → Stile codice Java → Formatter → Abilita impostazioni specifiche del progetto OPPURE Configura impostazioni dell'area di lavoro → Modifica → A capo (scheda) → seleziona "Non unire mai le linee già tratteggiate"

Salva, applica.

inserisci qui la descrizione dell'immagine


1
Penso che questo aiuterebbe per cose come l'esempio SQL, ma non sono sicuro che sarebbe sufficiente per il caso generale di disabilitare completamente il formattatore IDE.
Greg Mattes,

2
Questa soluzione è eccellente quando si utilizza il modello del costruttore e la sua rilevanza è sicuramente aumentata con l'introduzione di lambdas in Java 8.
Jonas Kongslund

16

Devi attivare la possibilità di aggiungere i tag formatter. Nella barra dei menu vai a:

Windows Preferences Java Code Style Formatter

Premi il Editpulsante. Scegli l'ultima scheda. Notare la casella On / Off e abilitarli con una casella di controllo.


14

Se metti il ​​segno più all'inizio della riga, formatta diversamente:

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

1
Questo potrebbe essere un compromesso interessante. In generale, vorrei astenermi dal cambiare troppo la formattazione del codice a causa di un comportamento indesiderato di uno strumento. In questo caso, gli operatori di concatenazione di stringhe sono più un incidente piuttosto che l'essenza di ciò che sta succedendo con SQL. Ecco perché preferisco scriverli alla fine di ogni riga. Sento che l'SQL dovrebbe essere enfatizzato come l'inizio della linea. Ma questo può essere un buon modo di procedere in assenza di una soluzione che mi consenta di conservare la formattazione desiderata. Grazie!
Greg Mattes,

8
Prego. In realtà, ho messo i miei + segni in prima linea per decenni, e non per ingannare il formatter. Li preferisco all'inizio, perché mi rende più chiaro ciò che sta accadendo: ciò che alla fine di una riga a volte si perde. Era lo standard del progetto da qualche parte quando usavamo i compilatori a legna, ed è bloccato con me.
CPerkins,

5

Sto usando parti di stringa a larghezza fissa (riempite con spazi bianchi) per evitare che il formatter rovini il mio rientro di stringa SQL. Questo ti dà risultati contrastanti e non funzionerà dove gli spazi bianchi non vengono ignorati come in SQL, ma possono essere utili.

    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

Termina ciascuna riga con una doppia barra "//". Ciò impedirà all'eclissi di spostarli tutti sulla stessa linea.


4

Metodo alternativo: in Eclipse 3.6, in "Disposizione linea", quindi in "Impostazioni generali" è disponibile l'opzione "Non unire mai le linee già tratteggiate". Ciò significa che il formatter avvolgerà le linee lunghe ma non annullerà alcun avvolgimento che hai già.


4

@xpmatteo ha la risposta alla disabilitazione di porzioni di codice, ma in aggiunta a ciò, le impostazioni di eclissi predefinite dovrebbero essere impostate per formattare solo le righe di codice modificate anziché l'intero file.

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

Ciò avrebbe impedito che ciò accadesse in primo luogo poiché i tuoi colleghi stanno riformattando il codice che non hanno effettivamente cambiato. Questa è una buona pratica per evitare svantaggi che rendono inutile la diff sul controllo del codice sorgente (quando un intero file viene riformattato a causa di differenze minori nelle impostazioni del formato).

Impedirebbe anche la riformattazione se l'opzione tag on / off fosse disattivata.


2

I commenti fantasma, aggiungendo //dove vuoi nuove righe, sono fantastici!

  1. @Formatter: off aggiunge un riferimento dal codice all'editor. A mio avviso, il codice non dovrebbe mai avere tali riferimenti.

  2. I commenti fantasma (//) funzioneranno indipendentemente dallo strumento di formattazione utilizzato. Indipendentemente da Eclipse o InteliJ o qualsiasi editor tu usi. Funziona anche con il bellissimo formato Java di Google

  3. I commenti fantasma (//) funzioneranno su tutta l'applicazione. Se hai anche Javascript e forse usi qualcosa come JSBeautifier . Puoi avere uno stile di codice simile anche nel Javascript.

  4. In realtà, probabilmente vuoi la formattazione giusta? Vuoi rimuovere tab / spazio misto e spazi finali. Vuoi rientrare le righe in base allo standard del codice. Quello che NON vuoi è una lunga fila. Questo, e solo quello, è ciò che ti dà il commento fantasma!


-3

Questo hack funziona:

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

Suggerirei di non usare il formatter. Il codice errato dovrebbe apparire non buono artificialmente. Un buon codice richiede tempo. Non puoi tradire la qualità. La formattazione fa parte della qualità del codice sorgente.


8
Non usare il formatter è solo una cattiva idea; il formatter aiuta a rilevare gli errori e mantiene il codice in uno stato coerente.
Francis Upton IV,

Un suggerimento interessante, ma non vedo come la formattazione ci dice se il codice è buono o no.
Chris,

2
Penso che quello che sta dicendo sia che sente che il codice scritto male e formattato male dovrebbe essere mantenuto così com'è piuttosto che formattarlo nella speranza di "migliorarlo". Il codice mal scritto e mal formattato dovrebbe "sporgere" in qualche modo in modo che possa essere facilmente identificato. Non sono sicuro di essere totalmente d'accordo, ma penso che sia l'idea.
Greg Mattes,

1
@Francis - Bug: in che modo il codice auto-formattato può trovare bug? Coerenza: la coerenza è un argomento valido, ma la qualità complessiva del codice è più importante. È possibile definire un processo coerente per il lancio di hamburger ma non funzionerà mai per l'alta cucina. Cucinare a può essere un'attività abbastanza complicata o banale se si ignorano abbastanza fatti. Se pensate che lo sviluppo del software sia come gli strumenti per lanciare hamburger che fanno rispettare la coerenza fanno per voi. Questo non è un argomento contro la formattazione delle linee guida, ma se gli sviluppatori non si preoccupano di queste linee guida non se ne occuperanno di altri elementi essenziali.
Thomas Jung,

4
Il mio argomento qui: scrivo un buon codice e mi attengo alle linee guida di formattazione. Ma sono pigrizia. Perché dovrei inserire la giusta quantità di spazi e interruzioni di riga quando posso scrivere le mie cinque righe di codice sciatto, premere il pulsante di formattazione ed essere felice? Dopo che ho formattato il codice, usando il mio strumento che assicura che il risultato sia sempre perfetto, sono nazista come chiunque altro sulla formattazione. Non vi è alcun argomento contro l'adesione alle linee guida (a parte il fatto che potrebbero essere particolarmente dannose) se la formattazione è solo un kestroke di distanza. Tutti i membri del progetto condividono le stesse impostazioni di formattazione del codice.
Per Wiklander,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.