Comandi per il preprocessore

KDiff3 supporta due opzioni del preprocessore.

Comando per il preprocessore:

Quando un file viene letto viene incanalato come ingresso a questo comando esterno. Verrà visualizzato il risultato del comando invece del file iniziale. Puoi scrivere il tuo preprocessore secondo le tue esigenze specifiche. Usalo per esempio per tagliare parti di file che danno fastidio, per correggere automaticamente il rientro, eccetera.

Comando del preprocessore per confrontare righe:

Quando un file viene letto, esso viene trattato da questo comando esterno. Se viene specificato un comando come preprocessore (vedi sopra), allora l'uscita dal preprocessore è anche l'ingresso del preprocessore che confronta le righe. Il risultato sarà usato durante la fase di analisi delle righe coincidenti. Puoi scrivere un tuo preprocessore personalizzato che risolva le tue esigenze. Ogni riga in ingresso deve avere una riga corrispondente in uscita.

L'idea è quella di permettere la maggior flessibilità possibile nell'impostare il risultato del confronto. Purtroppo ciò richiede l'uso di un programma esterno, e molti utenti non hanno voglia di scriversene uno. La buona notizia è che molto spesso sed o perl sono perfettamente in grado di svolgere il lavoro richiesto.

Esempio. Caso semplice: considera il file a.txt (6 righe):

aa
      ba
      ca
      da
      ea
      fa

e il file b.txt (3 righe):

cg
      dg
      eg

Senza un preprocessore le righe che seguono dovrebbero essere posizionate accanto ad ogni altra:

aa - cg
      ba - dg
      ca - eg
      da
      ea
      fa

Questo probabilmente non è il risultato voluto, dato che è la prima lettera quella che contiene l'informazione realmente interessante. Per aiutare l'algoritmo di corrispondenza a ignorare la seconda lettera, possiamo utilizzare un comando di preprocessore per la concordanza della riga, che sostituisca «g» con «a»:

sed 's/g/a/'

Con questo comando il risultato del confronto sarebbe:

aa
      ba
      ca - cg
      da - dg
      ea - eg
      fa

Internamente l'algoritmo di concordanza vede i file dopo l'esecuzione del preprocessore di concordanza della riga, ma sullo schermo il file non viene cambiato (normalmente l'esecuzione del preprocessore cambierebbe i dati anche sullo schermo).

Concetti di base del sed

Questa sezione spiega sommariamente alcune funzionalità elementari di sed. Per maggiori informazioni vedi info:/sed o https://www.gnu.org/software/sed/manual/html_mono/sed.html. Puoi trovare una versione di sed precompilata per Windows® a http://unxutils.sourceforge.net. Nota che gli esempi seguenti danno per scontato che sed sia in una cartella compresa nella variabile d'ambiente PATH. Se ciò non fosse, dovrai specificare il percorso completo del comando.

In questo contesto viene utilizzato solo il comando sostitutivo sed:

sed 's/ESPR.REG./SOSTITUZIONE/FLAG'

Prima di usare un nuovo comando all'interno di KDiff3, dovresti prima testarlo in una console. Qui torna utile il comando echo. Esempio:

echo abrakadabra | sed 's/a/o/'
   -> obrakadabra

Questo esempio mostra un comando sed molto semplice che sostituisce la prima occorrenza di «a» con «o». Se volessi sostituire tutte le occorrenze, dovresti invece utilizzare il flag «g»:

echo abrakadabra | sed 's/a/o/g'
   -> obrokodobro

Il simbolo «|» è il comando di incanalamento che trasferisce il risultato del comando precedente all'ingresso del comando successivo. Se vuoi eseguire una prova con un file più lungo, puoi utilizzare cat nei sistemi tipo UNIX® o type in quelli Windows®. sed eseguirà la sostituzione per ciascuna riga.

cat nome_file | sed opzioni

Esempi per l'uso di sed in KDiff3

Ignorare altri tipi commenti

Attualmente KDiff3 riconosce solo commenti C e C++. Se utilizzi l'opzione Preprocessore per il confronto di righe: puoi anche ignorare altri tipi di commenti, convertendoli in commenti C e C++.

Per esempio, per ignorare i commenti che iniziano per «#», potresti convertirli in «//». Tieni presente che devi anche attivare l'opzione Ignora i commenti C e C++ (tratta come spazio) per far funzionare il trucco. Un Preprocessore per il confronto di righe: appropriato potrebbe essere:

sed 's/#/\/\//'

Poiché per sed il carattere «/» ha un significato speciale, è necessario porre un carattere «\» prima di ogni «/» nella stringa del nuovo testo. Spesso il carattere «\» è richiesto per aggiungere o togliere un significato speciale a certi caratteri. Le virgolette semplici (') sono importanti solo quando si eseguono test nella shell dei comandi, dato che in caso contrario tenterà di elaborare alcuni caratteri. KDiff3 non fa questo, eccetto che per le sequenze di escape «\"» e «\\».

Differenze senza distinzione delle maiuscole

Usa questo comando di Preprocessore per il confronto di righe: per convertire tutto in maiuscolo:

sed 's/\(.*\)/\U\1/'

«.*» è un'espressione regolare corrispondente a qualsiasi stringa, e, in questo caso, a tutti i caratteri della riga. Il «\1» nella stringa di sostituzione rappresenta il testo trovato nel contenuto della prima coppia di parentesi tonde «\(» e «\)». La «\U» converte in maiuscolo il testo inserito.

Ignorare le parole chiave del controllo di versione

CVS e altri sistemi per il controllo di versione usano molte parole chiave per inserire stringhe generate automaticamente (vedi la pagina Info di CVS). Tutte queste seguono lo schema $KEYWORD testo generato$. A questo punto serve un comando di preprocessore che rimuova solo il testo generato:

sed 's/\$\(Revision\|Author\|Log\|Header\|Date\).*\$/\$\1\$/'

I «\|» separano le possibili parole chiave. Puoi modificare questa lista secondo le tue esigenze. Il «\» prima di «$» è necessario, altrimenti «$» corrisponderebbe alla fine della riga.

Nel provare sed potrai incominciare a capire ed apprezzare queste strane espressioni regolari. Sono molto utili perché ci sono molti altri programmi che supportano cose molto simili.

Ignorare i numeri

Per ignorare i numeri, in realtà, c'è un'opzione interna. Però, come ulteriore esempio, ecco come apparirebbe come comando di preprocessore per trovare una riga corrispondente.

sed 's/[0123456789.-]//g'

Ogni carattere compreso tra le parentesi quadre «[» e «]» verrà riconosciuto e rimosso (sostituito con nulla).

Ignorare alcune colonne

A volte un testo è formattato molto rigorosamente, e contiene delle colonne da ignorare sempre, mentre ci sono altre colonne da tenere e analizzare. Nell'esempio seguente, le prime cinque colonne (cioè caratteri) saranno ignorate, le dieci successive sono salvate, ne vengono ignorate altre cinque, il resto della riga viene tenuto.

sed 's/.....\(..........\).....\(.*\)/\1\2/'

Ogni punto «.» corrisponde a un qualsiasi carattere singolo. «\1» e «\2» nella stringa di sostituzione si riferiscono al contenuto della prima e seconda coppia di parentesi tonde «\(» e «\)», indicanti il testo da tenere.

Combinare più sostituzioni

A volte, potresti voler applicare più sostituzioni in una volta. In tal caso si può usare un punto e virgola «;» per separarle l'una dall'altra. Ad esempio:

echo abracadabra | sed 's/a/o/g;s/\(.*\)/\U\1/'
   OBROCODOBRO

Usare perl invece di sed

Invece di sed potresti voler utilizzare un altro comando, ad esempio perl.

perl -p -e 's/ESPR.REG./SOSTITUZIONE/FLAG'

Alcuni dettagli sono però diversi in perl. Nota che mentre sed necessita delle parentesi tonde come «\(» e «\)», in perl servono le più semplici «(» e «)», senza farle precedere da «\». Per esempio:

   sed 's/\(.*\)/\U\1/'
   perl -p -e 's/(.*)/\U\1/'

Ordine di esecuzione del preprocessore

I dati sono incanalati attraverso tutti i preprocessori interni ed esterni nel seguente ordine:

  • Preprocessore normale,

  • Preprocessore per il confronto di righe,

  • Ignora le lettere maiuscole (tratta come spazio) (conversione in maiuscolo),

  • Rilevamento dei commenti C e C++:

  • Ignora i numeri (tratta come spazio),

  • Ignora gli spazi

I dati, dopo essere passati dal preprocessore normale, saranno tenuti per la visualizzazione e la fusione. Le altre operazioni modificano solo i dati visti dall'algoritmo che rileva le differenze tra le righe corrispondenti.

Nei rari casi in cui si usa il preprocessore normale, bisogna tener presente che il preprocessore di corrispondenza delle righe vede l'uscita del preprocessore normale come proprio ingresso.

Attenzione

I comandi di preprocesso sono spesso utilissimi, ma, come per ogni opzione che modifichi il testo o che nasconda automaticamente certe differenze, possono far sfuggire certe differenze, o nel peggiore dei casi distruggere dati importanti.

Per questa ragione, se durante una fusione è in funzione un comando del preprocessore normale, KDiff3 te lo dirà e ti chiederà se vuoi disattivarlo. Però non ti avviserà se è attiva l'opzione Preprocessore per il confronto di righe:. La fusione non sarà completata finché non saranno risolti tutti i conflitti. Se hai disabilitato l'elemento di menu Vista di confrontoMostra spazi, anche le differenze che sono state rimosse con l'opzione Preprocessore per il confronto di righe: saranno invisibili. Se il pulsante Salva resta disattivato durante una fusione (perché sussistono dei conflitti), assicurati di attivare l'elemento di menu Vista di confrontoMostra spazi. Se non vuoi fondere manualmente queste differenze meno importanti, puoi selezionare l'elemento di menu FondiScegli [A|B|C] per tutti i conflitti di spazi non risolti.