Newsgroup: it.comp.os.linux.iniziare
Titolo: "here document": stringa limite contente spazi

EOF
e verr� stampato di seguito il mesaggio poi si ritrover� il
prompt ovviamente.
La srtinga limite dovrebbe essere pi� omeno arbitraria, io ho
scelto per esempio EOF perch� si vede in tantissimi esempi.
Veniamo alla domanda: come si potrebbe usare una stringa limite
contente spazi?
tipo:
cat <<E O F
??????????
A naso mettendo le virgolette
cat << "E O F".
Dal prompt funziona.
mentre il problema lo incontro scrivendo uno script con vim e la
sintassi colorata.  In un punnto volevo mantenere l'indentazione
cos� volevo mettere:
-----------zac---------
bla
bla
if ....
then
   cat<<"    ."
   mEessAggIO
   messaggio messaggio
   messaggio messaggio
   messaggio messaggio
   fine fine fine fine
   .
   altri
   comandi
fi
bla
bla
...
------- zac -----------
Ok, in vim la sintassi colorata, dopo
cat <<"
risulta andata a gonnelle.  :-\
Eppure, lo script poi funziona correttamente.
Quindi � sol un problema di colorazione della sintassi.
Lo ottenete anche voi?
Avete idee per farlo rientrare, a parte "syntax off"???
Grazie in anticipo.

 Avete idee per farlo rientrare, a parte "syntax off"???
Se vuoi mantenere l'indentazione, usa "<<-" (anche questo e' nel man).
if true; then
        cat <<-EOF
        riga1
        riga2
        EOF
        echo "dopo l'here document"
fi
e' importante che per indentare vangano usati i tab, non degli spazi. Se
vuoi mettere degli spazi come nel tuo esempio, allora puoi fare questo:
if true; then
        cat <<-\ \ \ \ ,
        riga1
        riga2
            .
        echo "dopo l'here document"
fi
in tutte le righe (compreso quella finale dell'here document) l'indentazione
e' fatta col tab.
Se vim non gestisce correttamente un here document con spazi (tra le altre
cose), e' un bug di vim.

 e' fatta col tab.
Ok, il trattino sta per "n x TAB", mentre lo spazio v� escapato.
Allora, nel mio caso, non ho impostato ottimalmente Il TAB, nel
senso che rientra troppo per i miei gusti.
Diciamo che preferirei un indentazione di "3 spazi" tanto per
darvi un'idea, cos� per ora uso lo spazio ed indento a mano,
almeno la prima riga, poi le successive iniziano dove iniza la
precedente...insomma spero di essermi spiegato.
Quindi consideriamo solo indentazione con spazi.
if true; then
   cat<<\ \ \ .
   This is
   an
   "HeRe DocuMenT"
   .
   echo "prova visualizzazione dopo here document"
fi
Provando dal prompt funziona, quindi direi che l'utilizzo
dell'here document � corretto.
Tuttavia aprendo il semplice script con vim ottengo una
situazione strana nell'hilighting della sintassi.
In pratica l'here document che nel mio colorscheme dovrebbe
essere tutto bianco, assume la consueta colorazione variabile a
seconda della sintassi riconosciuta.
La colpa � unicamente della "\" successiva al "<<".
Ovvero, prima con <<"   .", che era anche errato e avente un
significato particolare, l'highlighting della sintassi spariva e
diventava tutto bianco.
Ora l'highlighting della sintassi resta invariato anche dentro
l'HERE document.
Se invece usassi solo:
cat<<EOF
allora il messaggio le scrivo in bianco, e quando metto
EOF per terminarlo, le righe successive acquistano nuovamente le
consuete regole per evidenziare la sintassi bash.
Prima di parlare di bug, vi chiederei di fare qualche prova con
"vim". In effetti ci vuole poco, basta avere l'evidenziazione di
sintassi impostata (:syntax on).
Cosa ottenete?


 Cosa ottenete?
Lo stesso che ottieni tu, ma vedi sopra.

 Lo stesso che ottieni tu, ma vedi sopra.
Ok, quindi � un limite di vim.
Pazienza alla fine chissene dell'indentazione.
Al limite imposto meglio la tab.
A questo proposito visto che mi sembri ferrato in materia...
- situazione attuale:
if true
then
        aaa
        bbb
        ccc
fi
- situazione desiderata:
if true
then
   aaa
   bbb
   ccc
fi
Ovvero, adesso ho undentazione di 8 spazi, mentre io ne vorrei
solo 3.
Mi hai consigliato di impostare "set tabstop=3", ma non basta a
quanto pare:  cio� la tab effettivamente mette 3 spazi se la
digito a mano, tuttavia se scrivo per esempio il costrutto if di
cui sopra, ottengo sempre il primo risulatato e non il secondo.
L'impostazione tabstop=3 risolve il problema dell'here document
utilizzando come stringa limite cat<<-EOF.
Tuttavia non � sufficente ad ottenere una identazione pi�
compatta.
Hai idee a portata di mano?

 Hai idee a portata di mano?
Non sono sicuro di capire cosa intendi, ma forse e' perche' non hai salvato
l'impostazione. Metti "set ts=3" nel tuo file ~/.vimrc e riapri il
documento.

 documento.
Fatto.
Ma mentre edito l'indentazione � sempre di "8 caratteri":
se scrivo "if" e d� invio, ottengo il cursore posizionato al nono
carattere della riga successsiva. cos�:
situazione iniziale (il cursore lo rappresento con "|"
if|
ok, ora do invio:
if
        |
Ovvero ottengo una indentazione di 8 caratteri.
Se per� d� TAB:
situazione iniziale
|
ok, ora d� TAB
   |
Cio� il cursore s� spostato di tre posizioni.
Tutto ci� dopo aver editato il file ~/.vimrc aggiungendo
set ts=3.
Secondo me, ma dico a naso, c'� da rimaneggiare anche qualche
altra impostazione, magari legata alle regole d'indentazione
automatica.

 automatica.
Ok, dalle informazioni che dai dovrebbe essere un problema di smartindent.
Prova con "set nosmartindent" (mettilo in ~/.vimrc se lo vuoi permanente) e
vedi se le cose migliorano.

 vuoi permanente) e vedi se le cose migliorano.
Provo anche questo, ma volevo far presente che ho forse gi�
risolto, anche se non so le implicazioni possibili collaterali
che tale settaggio possa portarsi dietro:
set shiftwidth=3
set tabstop=3
Con queste due...non so forse anche solo con la prima,
l'indentazione automatica risulta effettivamente di soli tre
caratteri, dando agli script un maggior ordine (ma questo IMHO e
per i miei gusti).
Ad ogni modo mi aspetto ;-) che possiate eventualmente avvertire
se l'impostazione sopra, porti a qualche effetto collaterale
inaspettato.
Comunque vedr� anche smartindent....
PS.
   Gi� che parliamo di editors, su slackware di default il clone
	di "vi" scelto � "elvis".
	Che da quanto leggo supporta la colorazione della sintassi.
	Per� ho fattopiuttosto fatica trovare informazioni su come
	abilitarla: mentre su vim basta dare ":syntax on", in elvis
	cosa bisogna fare?