USR_44

*usr_44.txt*	Per Vim version 7.0.  Ultima modifica: 2006 Apr 24

		     VIM USER MANUAL - di Bram Moolenaar
	       Traduzione di questo capitolo: Giuliano Bordonaro

		    Evidenziazione della vostra sintassi


Vim nasce con la proprietà di evidenziare circa duecento tipi di file diversi.
Se il file che state modificando non fosse incluso, leggete questo capitolo
per scoprire come ottenere che anche questo tipo di file venga evidenziato.
Guardate anche |:syn-define| nel manuale di riferimento.

|44.1|	Fondamentali comandi della sintassi
|44.2|	Parole chiave
|44.3|	Raffronti
|44.4|	Regioni
|44.5|	Elementi annidati
|44.6|	Seguendo i gruppi
|44.7|	Altri argomenti
|44.8|	Clusters
|44.9|	Inserimento di un altro file di sintassi
|44.10|	Sincronizzazione
|44.11|	Installare un file di sintassi
|44.12|	Aspetto di un file di sintassi portatile

  Capitolo seguente: |usr_45|  Selezionate la vostra lingua
Capitolo precedente: |usr_43|  Utilizzo dei tipi di file
	     Indice: |usr_toc|


*44.1*	Fondamentali comandi della sintassi

Usando un file di sintassi esistente per iniziare risparmierete un sacco di
tempo.  Provateci trovando un file di sintassi entro $VIMRUNTIME/syntax per un
linguaggio che sia simile.  Questi file vi mostreranno l'aspetto normale di
un file di sintassi.  Per capirlo dovete leggere quanto segue.

Cominciamo con gli argomenti fondamentali.  Prima incominciamo definendo una
nuova sintassi, dovete togliere qualsiasi vecchia definizione:

	:syntax clear

Ciò non è necessario con il file di sintassi finale, ma molto utile quando
state sperimentando.

In questo capitolo ci sono ulteriori semplificazioni.  Se scrivese un file di
sintassi che venga usato da altri, leggete comunque tutto sino alla fine per
scoprire i dettagli.


ELENCARE GLI ELEMENTI DEFINITI

Per vedere quali elementi di sintassi siano attualmente definiti usate questo
comando:

	:syntax

Potete usarlo per vedere quali elementi di sintassi siano stati sinora
definiti.  Risulta utile per fare esperimenti con un nuovo file di sintassi.
Mostra anche i colori usati per ciascun elemento, il che aiuta a comprendere
di cosa si tratta.
   Per elencare gli elementi di un gruppo di sintassi specifico usate:

	:syntax list {group-name}

Ciò può anche venire impiegato per elencare dei clusters (spiegati in |44.8|).
Soltanto aggiungendo un @ nel nome.


CONFRONTO DEI CARATTERI

Alcuni linguaggi non sono sensibili al carattere come il Pascal.  Altri,
come il C, sono sensibili al carattere.  Dovete specificare quale sia il tipo
con i seguenti comandi:

	:syntax case match
	:syntax case ignore

L'argomento "match" significa che Vim confronterà il carattere degli elementi
di sintassi.  Perciò "int" è diverso da "Int" ed "INT".  Se l'argomento
"ignore" viene impiegato tutti gli esempi seguenti saranno equivalenti:
"Procedure", "PROCEDURE" e "procedure".
   I comandi ":syntax case" possono apparire dovunque in un file di sintassi e
riferirsi alle definizioni di sintassi che seguono.  Il più delle volte avete
solo un comando ":syntax case" nel vostro file di sintassi; se lavoraste con
un tipo insolito di linguaggio contenente sia elementi sensibili al carattere
che altri che non lo siano, comunque, avete la facoltà di disseminare il
comando ":syntax case" per tutto il file.


*44.2*	Parole chiave

I più diffusi elementi fondamentali della sintassi sono le parole chiave.  Per
definire una parola chiave usate la seguente forma:

	:syntax keyword {group} {keyword} ...

Il {group} è il nome del gruppo di sintassi.  Con il comando ":highlight"
potete assegnare un colore ad un {group}.  L'argomento {keyword} è
precisamente una keyword.  Ecco qualche esempio:

	:syntax keyword xType int long char
	:syntax keyword xStatement if then else endif

Questo esempio usa i nomi di gruppo "xType" e "xStatement".  Per convenzione
ogni nome di gruppo è preceduto dal tipo di file per il linguaggio che viene
definito.  Questo esempio definisce la sintassi per il linguaggio x
(linguaggio di esempio senza un nome particolarmente significativo).  In un
file di sintassi per scripts "csh" potrà essere usato il nome "cshType".  Così
il prefisso è uguale al valore di 'filetype'.
   Questi comandi fanno si che le parole "int", "long" e "char" vengano
evidenziate in un modo e le parole "if", "then", "else" ed "endif" lo siano
diversamente.  Ora dovete collegare i nomi del gruppo x ai nomi standard di
Vim.  Potete farlo con i seguenti comandi:

	:highlight link xType Type
	:highlight link xStatement Statement

Ciò dice a Vim di evidenziare "xType" come "Type" e "xStatement" come
"Statement".  Vedere |group-name| peri nomi standard.


KEYWORDS INSOLITE

I caratteri usati in una parola chiave debbono essere entro l'opzione
'iskeyword'.  Se usate un altro carattere la parola non potrà trovare mai una
corrispondenza.  Vim non fornirà un messaggio per informarvi di ciò.
   Il linguaggio x usa il carattere '-' nelle parole chiave.  Ecco come viene
fatto:

	:setlocal iskeyword+=-
	:syntax keyword xStatement when-not

Il comando ":setlocal" viene usato per cambiare 'iskeyword' soltanto per il
buffer corrente.  Ora cambierà il comportamento di comandi come "w" e "*".  Se
non volete ciò, non definite una parola chiave ma usate un confronto (spiegato
nella prossima sezione).

Il linguaggio x ammette delle abbreviazioni.  Ad esempio "next" può venire
abbreviato in "n", "ne" o "nex".  Potete definirlo usando questo comando:

	:syntax keyword xStatement n[ext]

Questo non corrisponde con "nextone", le parole chiave corrispondono sempre
soltanto con parole intere.


*44.3*	Raffronti

Pensiamo di definire qualcosa di più complesso.  Volete verificare le
corrispondenze di identificatori ordinari.  Per farlo definite un elemento di
confronto per la sintassi.  Questo trova corrispondenza con ogni parola che
consista di soli caratteri minuscoli:

	:syntax match xIdentifier /\<\l\+\>/

	Note:
	Le keywords prevalgono su di ogni altro elemento di sintassi.  Così le
	parole chiave "if", "then", etc., saranno keywords, come definito
	prima dal comando ":syntax keyword", anche se mantengono il modello
	per xIdentifier.

La parte finale è un modello, come esso viene usato per la ricerca.  Il //
viene impiegato in aggiunta al modello (come avviene in un comando
":substitute".  Potete utilizzare qualsiasi altro carattere, come un più o le
virgolette.

Adesso definiamo un confronto per un commento.  Nel linguaggio x si tratta
di qualsiasi cosa a partire da # sino alla fine della linea:

	:syntax match xComment /#.*/

Poiché potete usare qualunque modello di ricerca, potete evidenziare cose
molto complicate con un elemento di confronto.  Vedere |pattern| sui modelli
per la ricerca.


*44.4*	Regioni

Nel linguaggio x di esempio le stringhe vengono incluse entro virgolette
doppie (").  Per evidenziare stringhe definite una regione.  Serve una regione
di inizio (double quote) ed una di fine (double quote).  La definizione è come
segue:

	:syntax region xString start=/"/ end=/"/

Le direttive "start" ed "end" definiscono i modelli usati per trovare l'inizio
o la fine della regione.  Ma come fare con stringhe come questa?

	"A string with a double quote (\") in it" 

Ciò crea un problema: Le virgolette doppie nel mezzo della stringa faranno
terminare la regione.  Dovrete dire a Vim di saltare ogni virgoletta doppia
preceduta da \ entro la stringa.  Fatelo con la parola chiave skip:

	:syntax region xString start=/"/ skip=/\\"/ end=/"/

La backslash doppia trova una backslash singola, poiché la backslash è un
carattere speciale nei modelli per la ricerca.

Quando usare una regione in luogo di una verifica di corrispondenza?  La
differenza principale consiste nel fatto che un elemento di confronto è
costituito da un unico modello che deve trovare una corrispondenza esatta.
Una regione inizia dove si trova il modello "start".  Se il modello "end"
viene trovato o no non importa.  Così quando l'elemento dipendesse dalla
corrispondenza con il modello "end" non potreste utilizzare le regioni.
Altrimenti le regioni sono generalmente più facili da definire.  Ed è più
semplice per impiegare elementi annidati, come spiegato nella prossima
sezione.


*44.5*	Elementi annidati

Osservate questo commento:

	%Get input  TODO: Skip white space 

Volete evidenziare TODO in grosse lettere gialle, nonostante si trovi dentro
un commento che viene evidenziato in blu.  Per consentire a Vim di saperlo
definite i seguenti gruppi di sintassi:

	:syntax keyword xTodo TODO contained
	:syntax match xComment /%.*/ contains=xTodo

Nella prima linea l'argomento "contained" dice a Vim che questa keyword può
esistere soltanto entro altri elementi di sintassi.  La linea successiva ha
"contains=xTodo".  Ciò indica che l'elemento di sintassi xTodo è dentro di
essa.  Il risultato è che la linea di commento nel suo insieme viene
riscontrata con "xComment" e viene fatta blu.  La parola TODO entro essa trova
corrispondenza con xTodo ed evidenziata in giallo (L'evidenziazione per xTodo
era stata fatta per questo).


ANNIDAMENTO RICORSIVO

Il linguaggio x definisce blocchi di codice tra parentesi graffe. Ed un blocco
di codice può contenere altri blocchi di codice.  Ciò può venir definito così:

	:syntax region xBlock start=/{/ end=/}/ contains=xBlock

Supponiamo che abbiate questo testo:

	while i < b { 
		if a { 
			b = c; 
		} 
	} 

Inizialmente uno xBlock comincia dalla { nella prima linea.  Nella seconda
linea si trova un'altra {.  Poiché ci troviamo entro un elemento xBlock ed
esso contiene solo se stesso, un elemento annidato xBlock inizierà qui.  Così
la linea "b = c" lè dentro la regione xBlock di secondo livello.  Allora una }
viene trovata nella linea successiva e corrisponde con il modello di fine
della regione.  Ciò termina l'xBlock annidato.  Poiché la } si trova nella
regione annidata, viene nascosta dalla regione del primo xBlock.  Così
all'ultima } termina la regione del primo xBlock.


TROVARE LA FINE

Considerate i seguenti due elementi di sintassi:

	:syntax region xComment start=/%/ end=/$/ contained
	:syntax region xPreProc start=/#/ end=/$/ contains=xComment

Definite un commento come qualsiasi cosa a partire da % sino al termine della
linea.  Una direttiva di preprocessore è qualunque cosa a partire da # sino al
termine della linea.  Poiché potete avere un commento su di una linea di
preprocessore, la definizione di preprocessore include un argomento
"contains=xComment".  Adesso vediamo cosa succede con questo testo:

	#define X = Y  % Comment text 
	int foo = 1; 

Ciò che vedete è che anche la seconda linea viene evidenziata come xPreProc.
La direttiva preprocessore potrebbe terminare alla fine della linea.  Ciò
perché avete usato "end=/$/".  Così cosa è andato male?
   Il problema è il commento contenuto.  Il commento parte con % e finisce
alla fine della linea.  Dopo la fine del commento la sintassi del
preprocessore continua.  Ciò succede dopo che si è vista la fine della linea,
così viene inclusa anche la linea successiva.
   Per evitare questo problema e che un elemento di sintassi contenuto si
mangi la necessaria fine della linea, impiegate l'argomento "keepend".  Ciò si
occuperà del fatto di trovare una doppia fine della linea:

	:syntax region xComment start=/%/ end=/$/ contained
	:syntax region xPreProc start=/#/ end=/$/ contains=xComment keepend


CONTENIMENTO DI MOLTI ELEMENTI

Potete usare l'argomento contains per specificare che tutto può essere
compreso.  Ad esempio:

	:syntax region xList start=/\[/ end=/\]/ contains=ALL

Tutti gli elementi di sintassi verranno compresi entro soltanto questo.  Esso
contiene anche se stesso, ma non alla stessa posizione (che potrebbe causare
un loop senza fine).
   Potete specificare che alcuni gruppi non siano compresi.  Così comprende
tutti i gruppi ma solo quelli che vengono elencati:

	:syntax region xList start=/\[/ end=/\]/ contains=ALLBUT,xString

Con l'elemento "TOP"  potete inserire tutti gli elementi che non abbiano
un argomento "contained".  "CONTAINED" viene usato solo per includere
elementi con un argomento "contained".  Vedere |:syn-contains| per i dettagli.


*44.6*	Seguendo i gruppi

Il linguaggio x comprende dichiarazioni in questa forma:

	if (condition) then 

Volete evidenziare i tre elementi in modo diverso.  Ma "(condition)" e
"then" potrebbero apparire anche altrove, dove sono richieste diverse
evidenziazioni.  Potete fare così:

 :syntax match xIf /if/ nextgroup=xIfCondition skipwhite
 :syntax match xIfCondition /([^)]*)/ contained nextgroup=xThen skipwhite
 :syntax match xThen /then/ contained

L'argomento "nextgroup" specifica quale argomento possa essere il successivo.
Ciò non è necessario.  Se nessuno degli elementi che avete specificato venisse
trovato non succederebbe nulla.  Ad esempio, in questo testo:

	if not (condition) then 

L'"if" corrisponde con xIf.  "not" non trova corrispondenze con la specificata
xIfCondition di nextgroup, così solo l'"if" viene evidenziato.

L'argomento "skipwhite" dice a Vim che gli spazi bianchi (spazi e
tabulazioni) possono apparire tra gli elementi.  Argomenti analoghi sono
"skipnl", che consente un'interruzione di linea tra gli elementi, e
"skipempty", che permette linee vuote.  Notate che "skipnl" non salta una
linea vuota, talvolta trova corrispondenza dopo l'interruzione di linea.


*44.7*	Altri argomenti

MATCHGROUP

Quando definite una regione l'intera regione viene evidenziata secondo il nome
di gruppo specificato.  Per evidenziare il testo incluso tra parentesi () con
il gruppo xInside, ad esempio, usate il comando seguente:

	:syntax region xInside start=/(/ end=/)/

Immaginiamo che vogliate evidenziare le parentesi in modo diverso.  Potete
farlo con molte contorte dichiarazioni di regione, o potete usare l'argomento
"matchgroup".  Ciò dice a Vim di evidenziare l'inizio e la fine di una regione
con un diverso gruppo di evidenziazione (in questo caso, il gruppo xParen):

	:syntax region xInside matchgroup=xParen start=/(/ end=/)/

L'argomento "matchgroup" viene applicato alla corrispondenza di start e di
end che lo seguono.  Nell'esempio precedente sia start che end vengono
evidenziati con xParen.  Per evidenziare end con xParenEnd:

	:syntax region xInside matchgroup=xParen start=/(/
		\ matchgroup=xParenEnd end=/)/

Un effetto collaterale dell'uso di "matchgroup" è che gli elementi contenuti
non trovino corrispondenza all'inizio od alla fine della regione.  L'esempio
per "transparent" usa ciò.


TRANSPARENT

In un file in linguaggio C vorreste evidenziare il testo () dopo un "while" in
modo differente dal testo tra parentesi dopo un "for".  In entrambi i casi
potrebbero esservi annidati degli elementi (), che dovrebbero essere
evidenziati allo stesso modo.  Dovete essere certi che l'evidenziazione di ()
cessi con la corrispondenza).  Ecco un modo per farlo:

	:syntax region cWhile matchgroup=cWhile start=/while\s*(/ end=/)/
		\ contains=cCondNest
	:syntax region cFor matchgroup=cFor start=/for\s*(/ end=/)/
		\ contains=cCondNest
	:syntax region cCondNest start=/(/ end=/)/ contained transparent

Ora potete dare con cWhile e cFor diverse evidenziazioni.  L'elemento
cCondNest può apparire in uno di essi, ma escludere l'evidenziazione
dell'elemento che è contenuto.  L'argomento "transparent" causa ciò.
   Notare che l'argomento "matchgroup" ha lo stesso gruppo che l'elemento
itself.  Perché definirlo allora?  Bene, l'effetto collaterale di usare
matchgroup is che elementi contenuti non vengono trovati allora con l'elemento
start.  Ciò evita che il gruppo cCondNest trovi la ( appena dopo il "while" od
il "for".  Se ciò avvenisse potrebbe accoppiare tutto il testo sino alla
corrispondenza con ) e la regione continuerebbe dopo di esso.  Adesso
cCondNest trova la corrispondenza solo con il modello start, dopo la prima (.


OFFSETS

Poniamo che vogliate definire una regione per il testo tra ( e ) dopo un "if".
Ma non volete includere l'"if" o le ( e ).  Potete fare questo specificando
gli offsets per i modelli.  Esempio:

	:syntax region xCond start=/if\s*(/ms=e+1 end=/)/me=s-1

L'offset per il modello di start è "ms=e+1".  "ms" sta per Match Start.  Ciò
definisce un offset per l'inizio della corrispondenza.  Normalmente la
verifica parte dal modello di ricerca.  "e+1" significa che la verifica adesso
partirà al termine del modello di ricerca e precisamente da un carattere dopo.
   L'offset per il modello end è "me=s-1".  "me" sta per Match End.
"s-1" significa l'inizio dal modello di ricerca ed allora un carattere prima.
Il risultato è che in questo testo:

	if (foo == bar) 

Soltanto il testo "foo == bar" verrà evidenziato come xCond.

Altro sugli offsets qui: |:syn-pattern-offset|.


ONELINE

L'argomento "oneline" indica che la regione non attraversa il limite di una
linea.  Ad esempio:

	:syntax region xIfThen start=/if/ end=/then/ oneline

Ciò definisce una regione che inizia dall'"if" e termina al "then".  Ma se non
ci fosse un "then" dopo l'"if", la regione non corrisponderebbe.

	Note:
	Usando "oneline" la regione non inizia se il modello end non si trova
	nella stessa linea.  Senza "oneline" Vim non potrà trovare una
	corrispondenza per il modello di end pattern.  La regione inizia lo
	stesso quando il modello di end non venisse trovato nel resto del
	file.


LINEE CHE VANNO A CAPO E COME EVITARLE

Adesso le cose diventano un po' più complesse.  Definiamo una linea di
preprocessor.  Questa inizia con un # nella prima colonna e continua sino alla
fine della linea.  Una linea che finisca con \ rende la linea successiva una
linea di continuazione.  Il modo per gestire ciò è consentire che un elemento
di sintassi contenga un modello di continuazione:

	:syntax region xPreProc start=/^#/ end=/$/ contains=xLineContinue
	:syntax match xLineContinue "\\$" contained

In questo caso sebbene xPreProc verifichi normalmente una sola linea, il
gruppo in essa contenuto (vale a dire xLineContinue) gli consente di procedere
per più di una sola linea.  Ad esempio, verificherà entrambe queste linee:

	#define SPAM  spam spam spam \ 
			bacon and spam 

In questo caso è quanto volevate.  Se non fosse così potreste imporre alla
regione di essere su di una sola linea aggiungendo "excludenl" al modello
contenuto.  Ad esempio, volete evidenziare "end" in xPreProc, ma soltanto alla
fine della linea.  Per evitare che xPreProc continui anche sulla linea
successiva, come fa xLineContinue, usate "excludenl" in questa maniera:

	:syntax region xPreProc start=/^#/ end=/$/
		\ contains=xLineContinue,xPreProcEnd
	:syntax match xPreProcEnd excludenl /end$/ contained
	:syntax match xLineContinue "\\$" contained

"excludenl" deve essere posto prima del modello.  Se c'è "xLineContinue" non
si può usare "excludenl", una corrispondenza con esso estenderebbe xPreProc
alla prossima linea come prima.


*44.8*	Clusters

Una delle cose che dovete sapere quando iniziate a scrivere un file di
sintassi è che state per generare molti gruppi di sintassi.  Vim vi consente
di definire una collezione di gruppi di sintassi che viene chiamata cluster.
   Immaginate di avere un linguaggio che contenga cicli di for, dichiarazioni
if, cicli while e funzioni.  Ognuno di essi contiene gli stessi elementi di
sintassi: numeri ed identificatori.  Potete definirli così:

	:syntax match xFor /^for.*/ contains=xNumber,xIdent
	:syntax match xIf /^if.*/ contains=xNumber,xIdent
	:syntax match xWhile /^while.*/ contains=xNumber,xIdent

Vi tocca ripetere lo stesso "contains=" ogni volta.  Se volete aggiungere un
altro elemento contenuto, dovete aggiungerlo tre volte.  I clusters di
sintassi semplificano queste definizioni consentendovi di avere un solo
cluster che stia per molti gruppi di sintassi.
   Per definire un cluster per i due elementi che i tre gruppi contengono
usate il seguente comando:

	:syntax cluster xState contains=xNumber,xIdent

I cluster vengono usati entro altri elementi di sintassi proprio come ogni
gruppo di sintassi.  Il loro nome inizia con @.  Potete definire i tre gruppi
in questo modo:

	:syntax match xFor /^for.*/ contains=@xState
	:syntax match xIf /^if.*/ contains=@xState
	:syntax match xWhile /^while.*/ contains=@xState

Potete aggiungere nuovi nomi di gruppo a questo cluster con l'argomento
"add":

	:syntax cluster xState add=xString

Potete togliere dei gruppi di sintassi da questo elenco altrettanto
facilmente:

	:syntax cluster xState remove=xNumber


*44.9*	Inserimento di un altro file di sintassi

La sintassi del linguaggio C++ è un superset del linguaggio C.  Poiché non
volete scrivere due file di sintassi potrete fare leggere il file di sintassi
per C++ entro uno per C usando il comando seguente:

	:runtime! syntax/c.vim

Il comando ":runtime!" cerca 'runtimepath' per tutti i file "syntax/c.vim".
Ciò fa si che la sintassi C venga definita come per i file C.  Se aveste
sostituito il file di sintassi c.vim, od aggiunto elementi con un altro file,
questo verrebbe caricato lo stesso correttamente.
   Dopo aver caricato gli elementi di sintassi C gli elementi specifici per
C++ potranno essere definiti.  Ad esempio, aggiungere keywords che non vengono
usate in C:

	:syntax keyword cppStatement	new delete this friend using

Funzionerà esattamente come in ogni altro file di sintassi.

Adesso consideriamo il linguaggio Perl.  Consiste di due parti distinte: una
sezione di documentazione in formato POD, ed un programma scritto nello stesso
Perl.  La sezione POD comincia con "=head" e finisce con "=cut".
   Volete definire la sintassi POD in un solo file ed usarlo dal file di
sintassi di Perl.  Il comando ":syntax include" legge in un file di sintassi
ed immagazzina gli elementi che questo ha definito in un cluster di sintassi.
Per Perl le dichiarazioni sono come segue:

	:syntax include @Pod <sfile>:p:h/pod.vim
	:syntax region perlPOD start=/^=head/ end=/^=cut/ contains=@Pod

Quando in un file Perl viene trovato "=head", la regione perlPOD inizia.  In
questa regione è contenuto il cluster @Pod.  Tutti gli elementi definiti come
elementi di massimo livello nei file di sintassi pod.vim si troveranno qui.
Quando verrà trovato "=cut", la regione finirà e ritorneremo agli elementi
definiti nel file di Perl.
   Il comando ":syntax include" è abbastanza intelligente da ignorare un
comando ":syntax clear" nel file incluso.  Ed un argomento come "contains=ALL"
conterrà solo elementi definiti nel file in esso incluso, non nel file che lo
include.
   La parte "<sfile>:p:h/" usa il nome del file corrente (<sfile>), lo espande
al suo path completo (:p) ed allora prende l'intestazione (:h).  Ciò risulta
nel nome della directory del file.  Ciò causa che il file pod.vim venga
incluso nella directory stessa.


*44.10*	Sincronizzazione

I compilatori la fanno semplice.  Partono dall'inizio del file e lo
interpretano direttamente.  Vim non fa ciò così facilmente.  Deve partire
dal mezzo, dove si è iniziato a lavorare.  Come fare a dirgli dove si trova?
   Il segreto sta nel comando ":syntax sync".  Spiega a Vim come capire dove
si trovi.  Ad esempio, il comando che segue dice a Vim di cercare all'indietro
l'inizio o la fine di un commento in stile C ed iniziare da li a colorare la
sintassi:

	:syntax sync ccomment

Potete affinare questo processo con qualche argomento.  L'argomento "minlines"
dice a Vim il minimo numero di linee da vedere all'indietro, e "maxlines" dice
all'editor il massimo numero di linee da scandire.
   Ad esempio, il comando seguente dice a Vim di osservare almeno 10 linee
prima della cima dello schermo:

	:syntax sync ccomment minlines=10 maxlines=500

Se non riesce a capire dove si trovi entro questo spazio comincerà a guardare
sempre più distante sino a riuscirvi.  Ma non guarderà indietro più di 500
linee.  (Un grosso "maxlines" rallenta il processo.  Uno piccolo potrebbe
causare il fallimento di sincronizzazione.)
   Per sincronizzare un po' più rapidamente dite a Vim quali elementi di
sintassi possono essere saltati.  Tutte le corrispondenze e le regioni che
richiedono solo di essere usate mentre viene mostrato il testo possono essere
date con l'argomento "display".
   Di default, il commento che deve essere trovato verrà colorato come parte
del gruppo Comment syntax.  Se voleste colorare le cose in altro modo potete
specificare un gruppo di sintassi differente:

	:syntax sync ccomment xAltComment

Se il vostro linguaggio di programmazione non prevede commenti in stile C
potete provare un altro metodo di sincronizzazione.  Il modo più semplice
consiste nel dire a Vim di spaziare all'indietro di un certo numero di linee e
tentare di riuscire a capire le cose da li.  Il comando seguente dice a Vim di
andare indietro di 150 linee ed iniziare ad interpretare da lì:

	:syntax sync minlines=150

Un valore grosso di "minlines" può rendere Vim più lento, specialmente
scorrendo il file all'indietro.
   In ultimo, potete specificare un gruppo di sintassi per cercare usando
questo comando:

	:syntax sync match {sync-group-name}
		\ grouphere {group-name} {pattern}

Esso dice a Vim che quando vede {pattern} il gruppo di sintassi chiamato
{group-name} comincia subito dopo il modello dato.  Il {sync-group-name} viene
usato per dare un nome a questa specifica di sincronizzazione.  Ad esempio il
linguaggio di scripting sh comincia una dichiarazione if con "if" e lo finisce
con "fi":

	if [ --f file.txt ] ; then 
		echo "File exists" 
	fi 

Per definire una direttiva "grouphere" per questa sintassi usate il seguente
comando:

	:syntax sync match shIfSync grouphere shIf "\<if\>"

L'argomento "groupthere" dice a Vim che il modello finisce un gruppo.  Ad
esempio, la fine del gruppo if/fi è come segue:

	:syntax sync match shIfSync groupthere NONE "\<fi\>"

In questo esempio il NONE dice a Vim che non siete entro una regione di
sintassi speciale.  Particolarmente non vi trovate entro un blocco if.

Potete anche definire corrispondenze e regioni che siano senza "grouphere"
od argomenti di "groupthere".  Questi gruppi sono per gruppi di sintassi
saltati durante la sincronizzazione.  Ad esempio quanto segue salta ogni cosa
entro {}, anche se corrisponderebbe normalmente con altri metodi di
sincronizzazione:

	:syntax sync match xSpecial /{.*}/

Di più circa la sincronizzazione nel manuale di riferimento : |:syn-sync|.


*44.11*	Installare un file di sintassi

Quando il vostro nuovo file di sintassi è pronto per essere usato mettetelo
entro una directory chiamandola "syntax", nel 'runtimepath'.  Per Unix
potrebbe essere "~/.vim/syntax".
  Il nome del file di sintassi deve essere uguale al tipo di file con aggiunto
".vim".  Così per il linguaggio x il path completo potrebbe essere:

	~/.vim/syntax/x.vim 

Dovete anche far sì che il tipo di file venga riconosciuto.  Vedere |43.2|.

Se il vostro file lavora bene potreste desiderare di renderlo disponibile
per altri utenti di Vim.  Prima leggete la prossima sezione per essere certi
che il vostro file funzioni bene per altri.  Allora inviate un messaggio
e-mail al manutentore di Vim: <maintainer@vim.org>.  Così spiegate come il
tipo di file può essere riconosciuto.  Con un po' di fortuna il vostro file
verrà incluso nella prossima versione di Vim!


AGGIUNGERE AD UN FILE DI SINTASSI ESISTENTE

Stiamo immaginando che stiate aggiungendo un file di sintassi completamente
nuovo.  Quando un file di sintassi esistente funziona, ma sono stati persi
alcuni elementi, potete aggiungere degli elementi in un file separato.  Ciò
evita di cambiare i file di sintassi distribuiti che possono andare perduti
installando una nuova versione di Vim.
   Scrivete comandi di sintassi nel vostro file possibilmente usando nomi di
gruppo dalla sintassi esistente.  Ad esempio per aggiungere nuovi tipi di
variabile al file di sintassi di C:

	:syntax keyword cType off_t uint

Scrivete il file con lo stesso nome del file di sintassi originale.  In questo
caso "c.vim".  Piazzatelo entro una directory vicino alla fine di
'runtimepath'.  Ciò fa si che venga caricato dopo il file di sintassi
originale. Per Unix potrebbe essere:

	~/.vim/after/syntax/c.vim 


*44.12*	Aspetto di un file di sintassi portatile

Non sarebbe bello se tutti gli utenti di Vim si scambiassero i file di
sintassi?  Per renderlo possibile il file di sintassi deve seguire poche linee
guida.

Cominciate con un header che spieghi a cosa serve il file di sintassi, chi
lo mantiene e quale sia l'ultimo aggiornamento.  Non includete troppe
informazioni circa la storia delle modifiche, poca gente lo leggerà. Esempio:

	" Vim syntax file
	" Language:	C
	" Maintainer:	Bram Moolenaar <Bram@vim.org>
	" Last Change:	2001 Jun 18
	" Remark:	Included by the C++ syntax.

Usate lo stesso aspetto degli altri file di sintassi.  Usando un file di
sintassi esistente come esempio risparmierete un mucchio di tempo.

Scegliete un buono, descrittivo nome per il vostro file di sintassi.  Usate
lettere minuscole e cifre.  Non fatelo troppo lungo, viene usato in molti
posti: Il nome del file di sintassi "nome.vim", 'filetype', b:current_syntax
l'inizio di ogni gruppo di sintassi (nameType, nameStatement, nameString,
etc).

Iniziate con una prova per "b:current_syntax".  Se è definito, qualche altro
file di sintassi, trovato prima in 'runtimepath' era già stato caricato.

	if exists("b:current_syntax")
	  finish
	endif

Per mantenere la compatibilità con Vim 5.8 usate:

	if version < 600
	  syntax clear
	elseif exists("b:current_syntax")
	  finish
	endif

Mettete "b:current_syntax" al nome della sintassi alla fine.  Non dimenticate
che i file inclusi fanno ciò anche, potreste dover resettare
"b:current_syntax" se includete due file.

Se volete che il vostro file di sintassi funzioni con Vim 5.x, aggiungete una
prova per v:version.  Vedere yacc.vim per un esempio.

Non includete alcunchè sia una preferenza dell'utente.  Non impostate
'tabstop', 'expandtab', etc.  Ciò appartiene al plugin di un filename.

Non includete mappature od abbreviazioni.  Aggiungete soltanto l'impostazione
'iskeyword' se è realmente necessario per riconoscere le keywords.

Per consentire agli utenti di scegliere i propri colori preferiti, definite un
nome di gruppo differente per ogni tipo di elemento evidenziato.  Poi
collegate ognuno di essi ad uno dei gruppi di evidenziazione standard.  Ciò
ne renderà possibile il funzionamento con ogni schema di colore.  Se scegliete
dei colori specifici, potrebbero risultare sgradevoli con alcuni schemi di
colore.  E non dimenticate che alcuni usano un differente colore di fondo,
oppure hanno a disposizione solo otto colori.

Per il collegamento usate "hi def link", in modo che l'utente possa scegliere
evidenziazioni diverse prima che il vostro file di sintassi sia caricato.
Esempio:

	  hi def link nameString	String
	  hi def link nameNumber	Number
	  hi def link nameCommand	Statement
  	  ... etc ...

Aggiungete l'argomento "display" agli elementi che non si usano quando si
effettua una sincronizzazione, per velocizzare lo scorrimento all'indietro
e CTRL-L.


Capitolo seguente: |usr_45|  Selezionate la vostra lingua

Copyright: vedere |manual-copyright|  vim:tw=78:ts=8:ft=help:norl:

Segnalare refusi a Bartolomeo Ravera - E-mail: barrav at libero.it
           oppure ad Antonio Colombo - E-mail: azc100 at gmail.com

Generated by vim2html on dom set 3 00:06:08 CEST 2006