Newsgroup: it.comp.os.linux.software
Titolo: vim e le regex

Sto cercando di ridefinirmi un file di sintassi per l'highlighting di
sorgenti cobol, visto che ho da mettere le mani su un mainframe con un
cobol non standard e mi fa comodo usare Gvim per avere una sintassi
gradevole e intuitiva a colpo d'occhio per la stesura dei sorgenti.
Mi sono però incastrato su un problema apparentemente insolubile.
Per la definizione delle label (o markers, o identificatori di riga, o
chiamateli come volete voi) uso un bellissimo blu su sfondo cyan. Nel
cobol.vim ho impostato:
syn match cobolMarker "^\s\{,10}[A-Za-z0-9\-]\{1,28}\.$"
Funziona tutto benissimo finché la label è a inizio riga, così:
150-inizio-procedura.
Se però voglio indentare la label, funziona ancora tutto, ma mi
restano gli spazi bianchi evidenziati in cyan da inizio riga, cioè:
    150-inizio-procedura-b.
^^^^^^^^^^^^^^^^^^^^^^^^^^^
(tutto questo è evidenziato in cyan)
Io invece vorrei ottenere un effetto di questo tipo:
    150-inizio-procedura-b.
    ^^^^^^^^^^^^^^^^^^^^^^^
    (solo questo è evidenziato)
Il problema è che se tolgo l'impostazione \s\{,10} a inizio pattern,
dopo evidenzia *solo* se è a inizio riga, cioè:
150-inizio-procedura.
mentre viene considerato testo normale se è indentato.
Eliminare l'imposizione che sia a inizio riga peggiora le cose,
infatti verrebbe riconosciuta nel pattern anche una variabile:
  move 'abc' to stringa-valori.
e mi troverei "stringa-valori." evidenziata...
Ho tentato perfino di aggiungere un match agli spazi bianchi a inizio
riga, del tipo:
syn match blank "^\s\+"
e definire come highlight un normal, ma ottengo risultati "strani" e
mi sballa un po' tutto.
Domanda: qualcuno ha già affrontato questo problema? Grazie.
-- 
Massimo Bacilieri AKA Crononauta
"Se tieni il pugno chiuso, non potrai mai prendere niente. Solo se tendi
il palmo aperto, potrai possedere il mondo." (da "La Tigre e il Dragone")

 syn match cobolMarker "^\s\{,10}[A-Za-z0-9\-]\{1,28}\.$"
Prova con:
"\s\{,10}[A-Za-z0-9\-]\{1,28}\.$"
Cioe` senza il caret iniziale.
Massimiliano
-- 
The Practical Penguin's Notebook - 
http://practicaltux.sourceforge.net
Guide per newbie pratiche al 100%: configurazione della posta
(Postfix, Fetchmail e Procmail), tutorial da zero su Mutt ed Emacs.

 Cioe` senza il caret iniziale.
Ti ringrazio... ma se faccio così dopo mi intercetta una stringa anche a
metà frase, sul tipo:
if xyz > 15 then move 3 to var-prova.
mi trovo evidenziato come una label anche le variabili, perché se ci
pensi, così la regex ha un match perfetto per " var-prova.".
Lo so che basterebbe usare un altro colore e non un reverse e tutto
funzionerebbe, ma ormai è questione di principio!!! ;-)
Mumble mumble...
-- 
Massimo Bacilieri AKA Crononauta 
mailto:
ulib...@libero.it
 ; ICQ:4005815
+++ antispam: l'indirizzo mittente è alterato; usare quello qui 
    sopra indicato se mi si vuole rispondere in posta.

 if xyz > 15 then move 3 to var-prova.
Capisco.  Lungi da me il definire qualcosa impossibile, ma il problema
qui e` che devi fare un match di [A-Za-z0-9\-]{1,28}\.$
*assicurandoti* che tra questo e l'inizio della riga ci siano solo
spazi o nulla.  E, indovina un po'?  Nel momento stesso in cui te ne
sei assicurato, la tua regex ha fatto il match pure degli spazi...
Ma ViM non supporta backreference e regex estese?  Perche' in quel
caso e` semplice:
"^(?:\s\{0,10})([A-Za-z0-9\-]\{1,28})\.$"
Con questo programmino di prova:
RE = /^(?:\s{0,10})([A-Za-z0-9\-]{1,28})\.$/
a = "if xyz > 15 then move 3 to var-prova." 
b = "150-inizio-procedura."
c = "     150-inizio-procedura."
a =~ RE; p $1
b =~ RE; p $1
c =~ RE; p $1
Ottengo:
nil
"150-inizio-procedura"
"150-inizio-procedura"


 "^(?:\s\{0,10})([A-Za-z0-9\-]\{1,28})\.$"
ho provato ma non funziona. Però scartabellando tra l'help, ho trovato
qualcosa riguardo alle funzioni \zs o \@= , solo che non riesco a far
funzionare nemmeno quelle :-(((
Vabbé, al limite mi tengo anche gli spazi evidenziati, amen!
Grazie dell'interessamento!
