<chapter id="advanced-editing-tools">
<chapterinfo>
<authorgroup>
<author
>&Anders.Lund; &Anders.Lund.mail;</author>
<othercredit role="translator"
><firstname
>Nicola</firstname
> <surname
>Ruggero</surname
> <affiliation
><address
><email
>nixprog.adsl@tiscali.it</email
></address
></affiliation
><contrib
>Traduzione della documentazione.</contrib
></othercredit
> 
</authorgroup>
</chapterinfo>
<title
>Strumenti avanzati di modifica</title>

<sect1 id="comment">

<title
>Commenta/Decommenta</title>

<para
>I comandi Commenta e Decommenta, disponibili nel menu <guimenu
>Strumenti</guimenu
> ti permettono di aggiungere o rimuovere marcatori di commento alla selezione, o alla corrente riga di testo se non hai selezionato niente. In base alla sintassi del tipo di file che stai scrivendo o modificando il programma commenterà o meno il testo nella maniera adeguata.</para>

<para
>Le regole su come è applicato il commento sono definite in base alla sintassi del testo che stai scrivendo, quindi se non hai selezionato una modalità di evidenziazione, non potrai usare Commenta/Decommenta.</para>

<para
>Alcuni formati usano marcatori di commento su ciascuna riga commentata (marcatori monolinea), altri usano marcatori all'inizio e alla fine di un blocco di testo commentato (marcatori multilinea) ed altri ancora entrambi i sistemi. Se i marcatori multilinea non sono disponibili, commentare una selezione che non comprenda completamente la sua ultima riga non è possibile.</para>

<para
>Se sono disponibili i marcatori monolinea sarebbe meglio utilizzarli sempre dove è possibile, questo aiuterebbe a evitare molti problemi con i commenti nidificati.</para>

<para
>Quando rimuovi i commenti devi fare attenzione a selezionare solo del testo commentato. Quando rimuovi i commenti multilinea da una selezione, ogni spazio vuoto fuori dai marcatori di commento verrà ignorato.</para>

<para
><indexterm
><primary
>commenta</primary
></indexterm
> Per inserire i marcatori di commento, usa il comando <menuchoice
><guimenu
>Strumenti</guimenu
><guimenuitem
>Commenta</guimenuitem
></menuchoice
> oppure la relativa scorciatoria da tastiera, la scorciatoia di default è <keycombo action="simul"
>&Ctrl;<keycap
>#</keycap
> </keycombo
>.</para>

<para
><indexterm
><primary
>decommenta</primary
></indexterm
> Per rimuovere i marcatori di commento, usa il comando <menuchoice
><guimenu
>Strumenti</guimenu
><guimenuitem
>Decommenta</guimenuitem
></menuchoice
> oppure la relativa scorciatoia da tastiera, la scorciatoia di default è <keycombo action="simul"
>&Ctrl;&Shift; <keycap
> #</keycap
></keycombo
>.</para>

</sect1>

<sect1 id="edit-command">

<title
>Comando di modifica</title>

<para
>Questo strumento, disponibile dal menu <menuchoice
><guimenu
>Strumenti</guimenu
><guimenuitem
>Comando di modifica</guimenuitem
></menuchoice
>, fornisce l'accesso a una piccola serie di comandi di modifica testo simili al <application
>vi</application
> o al <application
>vim</application
>. È uno strumento molto utilizzato dagli utenti esperti, ma non ti spaventare! Prova le sue incredibili potenzialità!</para>

<para
>Attualmente, sono disponibili i seguenti comandi:</para>

<variablelist>
<varlistentry>
<term
><command
>time</command
></term>

<listitem>
<para
>Questo comando inserirà l'orario corrente in formato <quote
>HH:MM:SS</quote
></para>

<para
>Per usarlo, apri la finestra di dialogo Comando di modifica e inserisci nel campo di testo la parola <userinput
>time</userinput
></para>
</listitem>
</varlistentry>

<varlistentry>
<term
><command
>char</command
></term>
<listitem>
<para
>Questo comando ti permette di inserire caratteri indicando il loro identificativo numerico, in decimale, ottale o esadecimale. Per usarlo apri la finestra di dialogo Comando di modifica e digita <userinput
>char: [numero]</userinput
> nel campo di inserimento, quindi clicca su <guibutton
>OK</guibutton
>.</para
> 

<example>
<title
>Esempi con il comando <command
>char</command
></title>

<para
>Inserisci: <userinput
>char:234</userinput
></para>
<para
>Ottieni: <computeroutput
>ê</computeroutput
></para>
<para
>Inserisci: <userinput
>char:0x1234</userinput
></para>
<para
>Ottieni: <computeroutput
>ê</computeroutput
></para>
<para
>Inserisci: <userinput
>char:1232</userinput
></para>
<para
>Ottieni: <computeroutput
>ê</computeroutput
></para>
</example>

</listitem>

</varlistentry>

<varlistentry>

<term>
<indexterm
><primary
>sostituisci, come in sed</primary>
<secondary
>cerca, come in sed</secondary
></indexterm>
<command
>s///[ig]</command
> <command
>%s///[ig]</command
></term>

<listitem>
<para
>Questo comando fa una ricerca/sostituzione nella riga di testo corrente o in tutto il file ( <command
>%s///</command
>) in maniera del tutto simile a sed.</para>

<para
>In breve, la ricerca viene effettuata in base a un <emphasis
>pattern di ricerca</emphasis
>, a una espressione regolare compresa tra la prima e la seconda barra rovescia. Quando viene trovata una corrispondenza la parte che corrisponde viene sostituita con la espressione compresa tra la metà e l'ultima parte della stringa. Le parentesi nel pattern di ricerca creano dei <emphasis
>riferimenti all'indietro</emphasis
>, vale a dire che il comando ricorda quali parti della stringa di ricerca tra parentesi hanno trovato corrispondenza; queste stringhe possono essere riutilizzate per sostituire pattern riferiti a <userinput
>\1</userinput
> per il primo gruppo di parentesi, <userinput
>\2</userinput
> per il secondo e così via.</para>

<para
>Per cercare precisamente il simbolo di parentesi <literal
>(</literal
> o <literal
>)</literal
>, devi <emphasis
>evitare</emphasis
> il problema usando la barra rovescia in questo modo: <userinput
>\(\)</userinput
></para>

<para
>Se metti una <userinput
>i</userinput
> alla fine dell'espressione, la ricerca non terrà conto della distinzione tra maiuscole e minuscole.</para>

<example>

<title
>Sostituire del testo nella riga corrente</title>

<para
>Il tuo caro vecchio compilatore ha appena finito di bloccarsi dicendoti che la classe <classname
>myClass</classname
> che compare nella riga 3902 del tuo file sorgente non è definita.</para>

<para
>&quot;Naturale!&quot; pensi, sai benissimo che si scrive <classname
>MyClass</classname
>. Vai alla riga 3902 e, invece di provare a cercare la parola nel testo, apri la finestra di dialogo Comando di modifica, inserisci <userinput
>s/myclass/MyClass/i</userinput
>, premi <guibutton
>OK</guibutton
>, salvi il file e lo compili &ndash; consuccesso senza errori.</para>

</example>

<example>
<title
>Sostituire del testo nell'intero file</title>

<para
>Immagina di avere un file, nel quale nomini <quote
>Miss Jensen</quote
> parecchie volte e arriva qualcuno che ti dice che si è appena sposata con <quote
>Mr Jones</quote
>. Naturalmente tu vuoi sostituire tutti i <quote
>Miss Jensen</quote
> con <quote
>Ms Jones</quote
>.</para>

<para
>Lancia la finestra di dialogo Comando di modifica, digita nell'apposito campo <userinput
> %s/Miss Jensen/Ms JOnes/</userinput
> e premi invio... il gioco è fatto!</para>

</example>

<example>
<title
>Esempi più avanzati</title>

<para
>Questo esempio usa i <emphasis
>riferimenti all'indietro</emphasis
> così come la <emphasis
>word class</emphasis
> (se non sai cosa cos'è, per favore leggiti la relativa documentazione citata più in basso).</para>

<para
>Immagina di avere la seguente riga: <programlisting
>void MyClass::DoStringOps( String      &amp;foo, String &amp;bar String *p, int  &amp;a, int &amp;b )</programlisting>
</para>
<para
>Ora ti rendi conto che non è proprio carino il codice scritto così e decidi di usare la parola chiave <constant
>const</constant
> per tutti gli argomenti <quote
>address of</quote
>, che sono caratterizzati dall'operatore &amp; posto davanti al nome dell'argomento. A te inoltre piacerebbe semplificare lo spazio vuoto in modo tale che ci sia solo 1 spazio tra ogni parola.</para>

<para
>Apri la finestra di dialogo Comando di modifica e inserisci: <userinput
>s/\s+(\w+)\s+(&amp;)/ const \1 \2/g</userinput
> e premi il bottone <guibutton
>OK</guibutton
>. La <userinput
>g</userinput
> che si trova alla fine dell'espressione fa in modo che si ricompili un'espressione regolare, per ogni corrispondenza, da essere poi salvata come<emphasis
>riferimento all'indietro</emphasis
>.</para>

<para
>Ottieni: <computeroutput
>void MyClass::DoStringOps( const String &amp;foo, const String &amp;bar String *p, const int &amp;a, const int &amp;b )</computeroutput
></para>

<para
>Missione compiuta! Ora cos'è successo? Abbiamo cercato alcuni spazi vuoti (<literal
>\s+</literal
>) seguiti da alcuni caratteri alfabetici (<literal
>\w+</literal
>), seguiti da altri spazi vuoti (<literal
>\s+</literal
>), seguiti da una e commerciale e la porzione alfabetica con la e commerciale salvati nel processo per essere usati nell'operazione di sostituzione. Quindi abbiamo sostituito la parte corrispondente della nostra riga con uno spazio vuoto seguito da <quote
>const</quote
>, seguito da un'altro spazio vuoto, seguito dalla porzione alfabetica (<literal
>\1</literal
>), seguito da uno spazio vuoto e infine seguito dalla e commerciale salvata (<literal
>\2</literal
>)</para>

<para
>Ora, in alcuni casi la porzione alfabetica era una <quote
>String</quote
>. in altri <quote
>int</quote
>, quindi se usi <literal
>\w</literal
> e il quantificatore <literal
>+</literal
> sarà meglio.</para>

</example>

</listitem>
</varlistentry>

</variablelist>

<warning>
<para
>Questo è estremamente potente e sebbene le azioni possano essere annullate richiamando il comando <menuchoice
><guimenuitem
>Annulla</guimenuitem
></menuchoice
> parecchie volte (quelle che ti servono), ti consiglio di fare un po' di pratica prima di usare questo comando per fare dell'editing serio, soprattutto se non hai familiarità con le espressioni regolari di <application
>sed</application
> o del perl.</para>
</warning>

</sect1>

</chapter>
