<chapter id="advanced-editing-tools">
<chapterinfo>
<authorgroup>
<author
>&Anders.Lund; &Anders.Lund.mail;</author>
<othercredit role="translator"
> <firstname
>Johan</firstname
> <surname
>Thelmén</surname
> <affiliation
><address
><email
>jth@home.se</email
></address
></affiliation
> <contrib
>Översättare</contrib
></othercredit
> 
</authorgroup>
</chapterinfo>
<title
>Avancerade redigeringsverktyg</title>

<sect1 id="comment">

<title
>Kommentera/avkommentera</title>

<para
>Kommandona kommentera och avkommentera, som är tillgängliga i menyn <guimenu
>Verktyg</guimenu
>, låter dig lägga till eller ta bort kommentarmarkeringar i den markerade texten, eller den nuvarande raden, om ingen text är markerad, om kommentarer stöds av textformatet som du redigerar.</para>

<para
>Reglerna för hur kommentarer ser ut definieras av syntaxdefinitionerna, så om syntaxfärgläggning inte används, så är det inte möjligt att kommentera eller avkommentera.</para>

<para
>Vissa format definierar kommentarmarkeringar för enstaka rader, vissa för flera rader och vissa både ock. Om kommentarmarkeringar för flera rader inte är tillgängliga, så är det inte möjligt att kommentera en markering där den sista raden inte ingår helt och hållet.</para>

<para
>Om det finns en kommentarmarkering för enstaka rader, så föredras kommentarer för enstaka rader när det är möjligt, eftersom detta hjälper till att undvika problem med nästlade kommentarer.</para>

<para
>När kommentarmarkeringar tas bort, så ska inte någon okommenterad text markeras. När kommentarmarkeringar för flera rader tas bort från en markering, så ignoreras eventuella blanktecken utanför kommentarmarkeringen.</para>

<para
><indexterm
><primary
>kommentar</primary
></indexterm
> För att lägga till kommentarmarkeringar, använd menyalternativet <menuchoice
><guimenu
>Verktyg</guimenu
><guimenuitem
>Kommentera</guimenuitem
></menuchoice
> eller motsvarande snabbtangent, som normalt är <keycombo action="simul"
>&Ctrl;<keycap
>#</keycap
></keycombo
>.</para>

<para
><indexterm
><primary
>avkommentera</primary
></indexterm
> För att ta bort kommentarmarkeringar, använd menyalternativet <menuchoice
><guimenu
>Verktyg</guimenu
><guimenuitem
>Avkommentera</guimenuitem
></menuchoice
> eller motsvarande snabbtangent, som normalt är <keycombo action="simul"
>&Ctrl; <keycap
>Skift</keycap
> <keycap
>#</keycap
></keycombo
>.</para>

</sect1>

<sect1 id="edit-command">

<title
>Redigeringskommando</title>

<para
>Det här verktyget, som är tillgängligt via menyalternativet <menuchoice
><guimenu
>Verktyg</guimenu
><guimenuitem
>Redigeringskommando</guimenuitem
></menuchoice
>, ger tillgång till en liten uppsättning med kommandon som liknar <application
>vi</application
>/<application
>vim</application
>, för att redigera texten. Det är ett verktyg utan finesser för avancerade eller erfarna användare, men låt inte detta stoppa dig från att utnyttja dess kraft!</para>

<para
>För närvarande är följande kommandon tillgängliga:</para>

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

<listitem>
<para
>Det här kommandot skriver ut den nuvarande tiden som är känd av datorn med formatet <quote
>TT:MM:SS</quote
>.</para>

<para
>För att använda det, starta dialogrutan för redigeringskommand och skriv in ordet <userinput
>time</userinput
></para>
</listitem>
</varlistentry>

<varlistentry>
<term
><command
>char</command
></term>
<listitem>
<para
>Det här kommandot låter dig infoga enskilda tecken med deras numeriska kod, på decimal, oktal eller hexadecimal form. För att använda det, starta dialogrutan för redigeringskommandot och skriv <userinput
>char: [nummer]</userinput
> i inmatningsrutan, och tryck sedan på <guibutton
>Ok</guibutton
>.</para
> 

<example>
<title
>Exempel på användning av <command
>char</command
></title>

<para
>Inmatning: <userinput
>char:234</userinput
></para>
<para
>Utmatning: <computeroutput
>ê</computeroutput
></para>
<para
>Inmatning: <userinput
>char:0x1234</userinput
></para>
<para
>Utmatning: <computeroutput
>ê</computeroutput
></para>
<para
>Inmatning: <userinput
>char:1232</userinput
></para>
<para
>Utmatning: <computeroutput
>ê</computeroutput
></para>
</example>

</listitem>

</varlistentry>

<varlistentry>

<term>
<indexterm
><primary
>ersätt, sed-stil</primary>
<secondary
>sök, sed-stil</secondary
></indexterm>
<command
>s///[ig]</command
> <command
>%s///[ig]</command
></term>

<listitem>
<para
>Det här kommandot söker och ersätter på ett sätt som liknar sed, för den nuvarande raden, eller för hela filen (<command
>%s///</command
>).</para>

<para
>I kortet, så söks texten igenom efter en text som matchar <emphasis
>sökmönstret</emphasis
>, det reguljära uttrycket mellan det första och andra snedstrecket, och vid en träff så ersätts texten med uttrycket mellan mitten och sista delen av strängen. Parenteser i sökmönstret skapar <emphasis
>bakåtreferenser</emphasis
>, det vill säga kommandot kommer ihåg vilken del av texten som matchade inom parenteserna. De här strängarna kan återanvändas i ersättningsmönstret, med referenserna <userinput
>\1</userinput
>, för första paret parenteser, <userinput
>\2</userinput
> för det andra, och så vidare.</para>

<para
>För att söka efter tecknen <literal
>(</literal
> eller <literal
>)</literal
>, måste du <emphasis
>undanta</emphasis
> dem med ett bakstreckstecken <userinput
>\(\)</userinput
>.</para>

<para
>Om du skriver in ett <userinput
>i</userinput
> i slutet på uttrycket, görs matchningen utan att bry sig om skiftläget.</para>

<example>

<title
>Ersätta text på den nuvarande raden</title>

<para
>Din vänliga kompilator stannade just, och talade om för dig att klassen <literal
>minKlass</literal
> som nämns på rad 3902 i din källkodsfil inte är definierad.</para>

<para
>&quot;Tusan också!&quot; tänker du. Det ska förstås vara <literal
>MinKlass</literal
>. Du går till rad 3902, och istället för att försöka hitta ordet i texten, så startar du dialogrutan för redigeringskommandot, och skriver in <userinput
>s/minklass/MinKlass/i</userinput
>, trycker på knappen <guibutton
>Ok</guibutton
>, sparar filen och kompilerar &ndash; utan problem med felet borta.</para>

</example>

<example>
<title
>Ersätta text i hela filen</title>

<para
>Antag att du har en fil där du nämner namnet <quote
>Anna Johansson</quote
> flera gånger, och någon kommer in och talar om för dig att hon precis har gift sig och bytt namn till <quote
>Anna Svensson</quote
>. Du vill, förstås, byta ut alla förekomster av <quote
>Anna Johansson</quote
> mot <quote
>Anna Svensson</quote
>.</para>

<para
>Starta dialogrutan för redigeringskommandot, och skriv in följande i inmatningsrutan: <userinput
>%s/Anna Johansson/Anna Svensson/</userinput
>, tryck på returtangenten och du är klar.</para>

</example>

<example>
<title
>Ett mer avancerat exempel</title>

<para
>Det här exemplet använder <emphasis
>bakåtreferenser</emphasis
> samt <emphasis
>ordklasser</emphasis
> (om du inte vet vad det är, se tillhörande dokumentation som nämns nedan).</para>

<para
>Antag att du har följande rad: <programlisting
>void MinKlass::StrOperation( String      &amp;x, String &amp;y String *p, int  &amp;a, int &amp;b )</programlisting>
</para>
<para
>Nu inser du att det inte är bra kod, och bestämmer dig för att du vill använda nyckelordet <constant
>const</constant
> för alla <quote
>adress</quote
>- parametrar, de som markeras med operatorn &amp; framför argumentets namn. Du skulle också vilja förenkla blanktecknen, så att det bara finns ett blanktecken mellan varje ord.</para>

<para
>Starta dialogrutan för redigeringskommandot, skriv in: <userinput
>s/\s+(\w+)\s+(&amp;)/ const \1 \2/g</userinput
> och tryck sedan på knappen <guibutton
>Ok</guibutton
>. Tecknet <userinput
>g</userinput
> i slutet på raden gör att det reguljära uttrycket görs om för varje träff, så att  <emphasis
>bakåtreferenserna</emphasis
> sparas.</para>

<para
>Utmatning: <computeroutput
>void MinKlass::StrOperation( const String &amp;x, const String &amp;y String *p, const int &amp;a, const int &amp;b )</computeroutput
></para>

<para
>Åtgärden utförd! Vad hände nu egentligen? Ja, vi letade efter blanktecken (<literal
>\s+</literal
>), följt av en eller flera bokstäver (<literal
>\w+</literal
>), följt av ytterligare blanktecken (<literal
>\s+</literal
>), följt av ett och-tecken, och sparade bokstäverna samt och-tecknet för att återanvända i ersättningsoperationen. Därefter ersatta vi den matchande delen av vår rad, med ett blanktecken följt av <quote
>const</quote
>, följt av ett blanktecken, följt av våra sparade bokstäver (<literal
>\1</literal
>), följt av vårt sparade och-tecken (<literal
>\2</literal
>)</para>

<para
>I vissa fall var bokstäverna <quote
>String</quote
>, i andra <quote
>int</quote
>, så att använda teckenklassen <literal
>\w</literal
> och tecknet <literal
>+</literal
> visade sig vara en värdefull tillgång.</para>

</example>

</listitem>
</varlistentry>

</variablelist>

<warning>
<para
>Det här är mycket kraftfullt, och även om åtgärderna kan ångras genom att upprepa kommandot <menuchoice
><guimenuitem
>Ångra</guimenuitem
></menuchoice
> flera gånger (om nödvändigt) så rekommenderar jag att du övar lite grand innan du använder det här kommandot för att redigera på allvar, om du inte är bekant med reguljära uttryck i <application
>sed</application
> eller Perl.</para>
</warning>

</sect1>

</chapter>
