<chapter id="advanced-editing-tools">
<chapterinfo>
<authorgroup>
<author
>&Anders.Lund; &Anders.Lund.mail;</author>
<othercredit role="translator"
> <firstname
>Thomas</firstname
> <surname
>Diehl</surname
> <affiliation
> <address
><email
>thd@kde.org</email
></address
> </affiliation
> <contrib
>GUI-Übersetzung</contrib
></othercredit
> <othercredit role="translator"
> <firstname
>Matthias</firstname
><surname
>Schulz</surname
> <affiliation
> <address
><email
>matthias.schulz@kdemail.net</email
></address
> </affiliation
> <contrib
>Deutsche Übersetzung</contrib
></othercredit
> 
</authorgroup>
</chapterinfo>
<title
>Weitentwickelte Editierwerkzeuge</title>

<sect1 id="comment">

<title
>Kommentar/Kommentar entfernen</title>

<para
>Die Befehle Kommentar und Kommentar entfernen im Menü <guimenu
>Bearbeiten</guimenu
> erlauben das Hinzufügen oder Entfernen von Kommentarzeichen zur Auswahl, oder der aktuellen Textzeile, wenn kein Text markiert wurde. Diese Funktionen stehen nur zur Verfügung, wenn das benutzte Textformat Kommentare unterstützt.</para>

<para
>Die Regeln für Kommentare werden in den Definitionen für die Syntax festgelegt, wenn Hervorhebungen für Syntax nicht benutzt werden, ist die Nutzung der Befehle also nicht möglich.</para>

<para
>Einige Formate nutzen Kommentarzeichen für einzelne Zeilen, manche nutzen Kommentarzeichen für mehrere Zeilen, manche beides. Wenn Kommentarzeichen für mehrere Zeilen nicht verfügbar sind, kann eine Auswahl nicht auskommentiert werden, deren letzte Zeile nicht vollständig in die Auswahl einbezogen ist.</para>

<para
>Wenn Kommentarzeichen für einzelne Zeilen definiert sind, werden diese bevorzugt eingesetzt, dies hilft, Probleme mit eingebetteten Kommentaren zu vermeiden.</para>

<para
>Wenn Sie Kommentarzeichen entfernen, sollte nur kommentierter Text ausgewählt sein. Wenn mehrzeilige Kommentare entfernt werden, werden Leerzeichen und Tabulatoren (whitespaces) außerhalb der Kommentarzeichen ignoriert.</para>

<para
><indexterm
><primary
>Kommentar</primary
></indexterm
> Um Kommentarzeichen einzufügen, wählen Sie im Menü <menuchoice
><guimenu
>Extras</guimenu
><guimenuitem
>Kommentar</guimenuitem
></menuchoice
> oder den Tastaturkurzbefehl, hier standardmäßig <keycombo action="simul"
>&Ctrl;<keycap
>#</keycap
></keycombo
>.</para>

<para
><indexterm
><primary
>Kommentar entfernen</primary
></indexterm
> Zum Entfernen von Kommentarzeichen wählen Sie im Menü <menuchoice
><guimenu
>Bearbeiten</guimenu
><guimenuitem
>Kommentar entfernen</guimenuitem
></menuchoice
> oder den Tastaturkurzbefehl, hier standardmäßig <keycombo action="simul"
>&Strg;&Umschalt;<keycap
>#</keycap
></keycombo
>.</para>

</sect1>

<sect1 id="edit-command">

<title
>Bearbeitungsbefehl...</title>

<para
>Dieses Werkzeug, das Sie vom Eintrag <menuchoice
><guimenu
>Extras</guimenu
><guimenuitem
>Bearbeitungsbefehl... </guimenuitem
></menuchoice
> nutzen können, gibt Ihnen eine kleine Auswahl von <application
>vi</application
>/<application
>vim</application
>-Befehlen zum Editieren von Text.</para>

<para
>Die folgenden Befehle sind verfügbar:</para>

<variablelist>
<varlistentry>
<term
><command
>Zeit</command
></term>

<listitem>
<para
>Dieser Befehl gibt die aktuelle Uhrzeit Ihres Systems im Format <quote
>HH:MM:SS</quote
> aus.</para>

<para
>Rufen Sie den Dialog Bearbeitungsbefehl... auf und schreiben Sie in das Eingabefeld das Wort <userinput
>time</userinput
></para>
</listitem>
</varlistentry>

<varlistentry>
<term
><command
>Zeichen</command
></term>
<listitem>
<para
>Dieser Befehl erlaubt das Einsetzen von Zeichen in Text durch die Eingabe Ihrer Kodierung in dezimaler, oktaler oder hexadezimaler Form. Rufen Sie den Dialog Bearbeitungsbefehl... auf, schreiben Sie in das Eingabefeld das Wort <userinput
>char:[nummer]</userinput
> und klicken Sie auf <guibutton
>OK</guibutton
>.</para
> 

<example>
<title
>Beispiele zu <command
>char</command
></title>

<para
>Eingabe: <userinput
>char:234</userinput
></para>
<para
>Ausgabe: <computeroutput
>ê</computeroutput
></para>
<para
>Eingabe: <userinput
>char:0x1234</userinput
></para>
<para
>Ausgabe: <computeroutput
>ê</computeroutput
></para>
<para
>Eingabe: <userinput
>char:1232</userinput
></para>
<para
>Ausgabe: <computeroutput
>ê</computeroutput
></para>
</example>

</listitem>

</varlistentry>

<varlistentry>

<term>
<indexterm
><primary
>Ersetzen, sed-Stil</primary>
<secondary
>Suchen, sed-Stil</secondary
></indexterm>
<command
>s///[ig]</command
> <command
>%s///[ig]</command
></term>

<listitem>
<para
>Dieser Befehl führt Suchen/Ersetzen auf der aktuellen Zeile oder in der gesamten Datei aus (<command
>%s///</command
>).</para>

<para
>Kurz gesagt, der Text wird nach dem <emphasis
>Suchtext</emphasis
>, dem regulären Ausdruck zwischen dem ersten und dem zweiten Schrägstrich, durchsucht und wenn der <emphasis
>Suchtext</emphasis
> gefunden wurde, wird der übereinstimmende Teil des Textes durch den Ausdruck zwischen dem mittleren und dem hinterem Schrägstrich ersetzt. Runde Klammern im <emphasis
>Suchtext</emphasis
> erzeugen <emphasis
>Referenzen</emphasis
>, die dann später dazu benutzt werden, die Zeichenketten wiederzuverwenden. Diese Referenzen werden wie folgt aufgerufen: <userinput
>\1</userinput
> für die erste Referenz, <userinput
>\2</userinput
> für die zweite und so weiter.</para>

<para
>Um nach einem Sonderzeichen, <literal
>(</literal
> oder <literal
>)</literal
>, zu suchen, müssen Sie dieses durch einen Rückwärtsschrägstrich kenntlich machen. <userinput
>\(\)</userinput
></para>

<para
>Wenn Sie ein <userinput
>i</userinput
> an das Ende des regulären Ausdrucks setzen, dann wird Groß- und Kleinschreibung bei der Suche ignoriert.</para>

<example>

<title
>Ersetzen von Text in der aktuellen Zeile</title>

<para
>Ihr lieber Computer verweigerte gerade die Ausführung eines Programms, mit der Bemerkung, dass die Klasse <classname
>myClass</classname
>, die in der Zeile 3902 im Quelltext verwendet wird, nicht definiert ist.</para>

<para
>&quot;Natürlich!&quot;, denken Sie, das muss <classname
>MyClass</classname
> heißen. Sie gehen zur Zeile 3092, rufen den Bearbeitungsbefehl auf, geben <userinput
>s/myclass/MyClass/i</userinput
> ein und klicken auf <guibutton
>OK</guibutton
>, Speichern die Datei und kompilieren &ndash; ohne Fehlermeldungen.</para>

</example>

<example>
<title
>Ersetzen von Text in der gesamten Datei</title>

<para
>Stellen Sie sich vor, Sie hätten eine Datei, in der eine <quote
>Miss Jensen</quote
> einige Male erwähnt wird. Jemand kommt zur Tür herein und erzählt Ihnen, dass sie gerade <quote
>Mr Jones</quote
> geheiratet hat. Sie stehen nun vor der Aufgabe, jedes <quote
>Miss Jensen</quote
> durch <quote
>Ms Jones</quote
> zu ersetzen.</para>

<para
>Rufen Sie den Bearbeitungsbefehl auf, geben Sie <userinput
>%s/Miss Jensen/Ms Jones/</userinput
> ein und klicken Sie auf <guibutton
>OK</guibutton
> - fertig.</para>

</example>

<example>
<title
>Ein etwas komplizierteres Beispiel</title>

<para
>Dieses Beispiel benutzt <emphasis
>Referenzen</emphasis
> und auch eine <emphasis
>Wortklasse</emphasis
> (wenn Sie nicht wissen, was das bedeutet, sehen Sie bitte in der unten angegebenen Dokumentation nach).</para>

<para
>Stellen Sie sich vor, Sie hätten folgende Zeile: <programlisting
>void MyClass::DoStringOps( String      &amp;foo, String &amp;bar String *p, int  &amp;a, int &amp;b )</programlisting>
</para>
<para
>Sie erkennen, dass nicht gut lesbar ist und entscheiden, das Schlüsselwort <constant
>const</constant
> für alle <quote
>address of</quote
>-Argumente zu verwenden (diese sind durch den vorangestellten Operator &amp; gekennzeichnet). Außerdem wollen Sie die Zwischenräume vereinfachen, so dass nur noch ein Leerzeichen zwischen den Wörtern steht.</para>

<para
>Rufen Sie den Bearbeitungsbefehl auf, geben Sie <userinput
>s/\s+(\w+)\s+(&amp;)/ const \1 \2/g</userinput
> und klicken Sie auf <guibutton
>OK</guibutton
>. Das <userinput
>g</userinput
> am Ende des regulären Ausdrucks bewirkt, dass der reguläre Ausdruck jedesmal neu kompiliert wird, um die <emphasis
>Referenz</emphasis
> zu sichern.</para>

<para
>Ausgabe: <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
>Erledigt! Was passierte hier? Es wurde nach Leerzeichen (<literal
>\s+</literal
>) gefolgt von einem oder mehreren alphanumerischen Zeichen (<literal
>\w+</literal
>) gefolgt von einem oder mehreren Leerzeichen (<literal
>\s+</literal
>) gefolgt von einem Ampersand (&amp;) gesucht und dabei der alphanumerische Abschnitt und das Ampersand (&amp;) gesichert, um diese beim Ersetzen wiederzuverwenden. Dann haben wir den übereinstimmenden Teil der Zeile ersetzt durch ein Leerzeichen gefolgt von <quote
>const</quote
> gefolgt von einem Leerzeichen gefolgt vom gesicherten Abschnitt (<literal
>\1</literal
>) gefolgt von einem Leerzeichen gefolgt vom gesicherten Ampersand (&amp;) (<literal
>\2</literal
>).</para>

<para
>In einigen Fällen war war der gesicherte Abschnitt <quote
>String</quote
>, in einigen <quote
>int</quote
>, so dass das Benutzen der Wortklasse <literal
>\w</literal
> und des <literal
>+</literal
>-Zeichens zum Angeben von <quote
>ein oder mehrere</quote
> sich als wertvoll erwies.</para>

</example>

</listitem>
</varlistentry>

</variablelist>

<warning>
<para
>Diese Befehle sind extrem vielseitig, aber obwohl sich deren Ausführung <menuchoice
><guimenuitem
>Rückgängig</guimenuitem
></menuchoice
> machen lassen, empfehlen wir ein wenig zu üben, bevor Sie diese Befehle für ernsthafte Arbeit einsetzen. Wenn Sie geübt im Umgang mit regulären Ausdrücken in Perl oder mit <application
>sed</application
> sind, ist dies sehr hilfreich dabei.</para>
</warning>

</sect1>

</chapter>
