Durchblick im Quellcode dank Syntax-Highlighting

Aus LinuxUser 04/2013

Durchblick im Quellcode dank Syntax-Highlighting

© Andrewatla, sxc.hu

Alles bunt

Quellcode liest sich oft schwer. Eine Syntaxhervorhebung macht klar, worauf es ankommt.

In Vorträgen, Kursen oder bei der Dokumentation kommen viele Hilfsmittel zum Darstellen von Quellcode zum Einsatz, fast immer mit einer Syntaxhervorhebung. Seien es Screenshots von Editoren, eingescannte Ausdrucke von Code-Schnipseln, in denen der Autor per Textmarker die wesentlichen Teile hervorgehoben hat, oder sogar handkolorierte Meisterwerke aus der Office-Umgebung: Sie alle verursachen viel Arbeit und bereitet dem Leser aufgrund uneinheitlicher Darstellung gleicher Schlüsselwörter oft Mühe.

Ausweg Enscript

Aus diesem Dilemma gibt es einen einfachen Ausweg: Mittels Enscript [1] erzeugen Sie aus kompletten Quelltexten entsprechende Ausgaben für den Druck oder Bildschirm.

Damit das Programm allerdings zufriedenstellende Ergebnisse auswirft, gilt es auf den Zeichensatz der Eingabedatei zu achten. Files mit der heute weit verbreiteten Kodierung UTF-8 verarbeitet das Programm nicht richtig. Am besten konvertieren Sie diese nach ISO-8859-15 (Westeuropa, mit Eurozeichen). Gut ausgestattete Editoren wie Kate (Abbildung 1) ermöglichen dies ebenso wie die Kommandozeilentools Recode [2] und Iconv.

Abbildung 1: Kate bietet die Möglichkeit, Dateien mit einer anderen Zeichenkodierung abzuspeichern.

Abbildung 1: Kate bietet die Möglichkeit, Dateien mit einer anderen Zeichenkodierung abzuspeichern.

Den Konverter Recode benötigen Sie vor allem beim automatisierten Verarbeiten. Wenn Sie erfahren wollen, welche Zeichensätze das Programm bearbeiten kann, geben Sie in einem Terminal den Befehl recode --list ein.

Selbst uralte COBOL-Listings aus den Zeiten der BS-1000-Großrechner bereiten Sie damit auf, unter anderem für Enscript. Legen Sie eine Kopie der Quelltextdatei an, da das Tool die Datei selbst ändert. Für das Konvertieren geben Sie bei Recode die Ausgangs- und Zielkodierung an, getrennt durch zwei Punkte (..):

$ recode UTF-8..ISO-8859-15 p3.sh

Wissen Sie nicht, mit welchem Zeichensatz die Ausgangsdatei kodiert ist, fragen Sie das auf der Shell mit dem Kommando file ab. Sie benötigen die Option -i, da Sie sonst nicht alle Informationen erhalten (Listing 1).

Listing 1

$ file -i *.sh
p1.sh: text/x-shellscript; charset=utf-8
p2.sh: text/x-shellscript; charset=ISO-8859-1
p3.sh: text/x-shellscript; charset=ISO-8859-15

Im Einsatz

Die Datei mit dem richtigen Zeichensatz verarbeiten Sie nun mit Enscript. Für die Ausgabe haben Sie dabei die Wahl zwischen Postscript, HTML oder RTF; alternativ steuern Sie direkt einen Drucker an. Möchten Sie einen kompletten Quelltext für Dokumentationszwecke in das PDF-Format verwandeln, benötigen Sie hierfür noch geeignetes Werkzeug im Nachlauf.

Dazu eignet sich unter anderem Ps2pdf14, das bei vielen Distributionen zum Paket ghostscript gehört. Es stellt einen PDF-Pseudodrucker bereit. Das folgende Kommando wandelt die Ausgabe in PDF um:

$ ps2pdf14 Postscript-Datei

Die Tabelle “Enscript-Optionen” zeigt die wichtigsten allgemeinen Optionen. Die wichtigsten Programmier- und Skriptsprachen und deren Kürzel finden Sie in Tabelle “Auswahl Sprachen”.

Enscript-Optionen

Option Aktion Hinweis
-EKürzel Angabe der Programmier- oder Skriptsprache alternativ: --highlight=Kürzel
--help-pretty-print Anzeige aller unterstützten Programmier- und Skriptsprachen alternativ: --help-highlight
-wFormat Angabe des Ausgabeformates, falls von Postscript abweichend mögliche Werte: html, rtf
--color Syntax zusätzlich durch Farben hervorheben
--mark-wrapped-lines=Stil Kennzeichnung automatisch umbrochener Zeilen mögliche Werte: plus, box, arrow (nur bei PS-Ausgabe)
-C Zeilennummern verwenden
-fFontname Font und Ausgabegröße angeben Beispiel: -fCourier8 (nur bei PS-Ausgabe)
-Hn nur jede n+1te Zeile ausgeben Beispiel: -H1 für jede zweite Zeile (nur bei PS-Ausgabe)
--highlight-bar-gray=Wert Angabe zur Farbstärke 0.9 (schwach) bis 0.1 (fast schwarz)
-bZeilenanweisung eigene Kopfzeile verwenden Beispiel: -b'$n| %W | Seite $% von $='
-B Kopfzeile ausblenden
-u'Text' Wasserzeichen einblenden
-oDateiname Name der Ausgabedatei
-PDrucker Drucker für die direkte Ausgabe definieren
-r Ausgabe im Querformat nur bei PS-Ausgabe
-R Ausgabe im Hochformat nur bei PS-Ausgabe

Auswahl Sprachen

Sprache Kürzel
Assembler asm
AWK-Skripte awk
Bash-Shell bash
C c
C++ cpp
Delphi delphi
HTML html
Java java
Javascript javascript
Lua lua
M4 m4
E-Mail mail
Makefiles makefile
Matlab matlab
Pascal pascal
Perl perl
Python python
RFCs rfc
Ruby ruby
Shell sh
SQL sql
Visual Basic vba
Z-Shell zsh

Die zentrale Konfigurationsdatei von enscript.cfg finden Sie im Verzeichnis /etc. Darüber hinaus besteht die Möglichkeit, eine Kopie davon zu bearbeiten und im Home-Verzeichnis als .enscriptrc abzulegen. Unter /usr/share/enscript finden Sie weitere Ressourcen, wie die Muster der Kopfzeilen oder das Verzeichnis (hl) mit den Stilen für die jeweilige Syntax.

Um eine eigene Stil-Datei anzulegen, kopieren Sie eine bestehende Datei mit dem Suffix st und ändern diese für Ihre Zwecke ab. Mit enscript.st steht Ihnen ein Muster mit kleiner Anleitung bereit. Vergeben Sie für Ihre Stildatei einen Namen, der noch nicht in Gebrauch ist.

Haben Sie für /usr/share/enscript kein Schreibrecht, speichern Sie Ihre Datei anschließend im Verzeichnis .enscript im Home-Verzeichnis. Hier liegen alle von Ihnen selbst erstellten zusätzlichen Ressourcen. Diese stehen aber nur für Sie selbst bereit.

Listing 2 zeigt einige beispielhafte Aufrufe für Enscript. Dabei kommen einfache Optionen für die Kopfzeile oder komplexe Anweisungen zum Ausdruck der Datei zum Einsatz.

Listing 2

enscript -Ebash -C -o script1.ps script.sh
enscript -b'$n| %W | Seite $% von $=' --highlight=sh -fCourier12 -u"ENTWURF"  -C --mark-wrapped-lines=arrow -o script2.ps script2.sh
enscript --highlight-bar-gray=.8 --highlight=sh -fCourier10  -C -H1 -o script1.ps script.sh
enscript  --highlight=sh  -C -wrtf --color -o script1.rtf script.sh
enscript  --highlight=sh  -C -whtml --color -o script1.html script.sh

Das Kommando aus Zeile 1 erzeugt eine Postscript-Ausgabe in schwarzweiß mit Zeilennummern und einer Standard-Kopfzeile, wobei Enscript nach Schlüsselworten der Bash fahndet (Abbildung 2).

Abbildung 2: Schon mit wenigen Optionen erzeugen Sie dank Enscript eine Ausgabe, die den Blick auf die wichtigen Schlüsselwörter lenkt und das Navigieren im Text durch automatische Zeilennummern erleichtert.

Abbildung 2: Schon mit wenigen Optionen erzeugen Sie dank Enscript eine Ausgabe, die den Blick auf die wichtigen Schlüsselwörter lenkt und das Navigieren im Text durch automatische Zeilennummern erleichtert.

In Zeile 2 kommt ein wesentlich komplexerer Befehl zum Einsatz. Das Pipe-Zeichen bei der Kopf-Option teilt die Zeile in eine linke, mittlere und rechte Spalte ein. Die Option -f gibt hier neben dem Font zusätzlich dessen Größe an. Ein Wasserzeichen Entwurf prangt quer über die Seite. Beachten Sie, dass das Programm den Umbruch der überlangen Zeile mit einem Pfeil markiert hat (Abbildung 3).

Abbildung 3: Wasserzeichen und individuelle Kopfzeilen ermöglichen es, Ausgaben ohne große zusätzliche Kommentare zu versenden.

Abbildung 3: Wasserzeichen und individuelle Kopfzeilen ermöglichen es, Ausgaben ohne große zusätzliche Kommentare zu versenden.

Mit einer wechselweisen Unterlegung der Zeilen heben Sie die Abfolge des Quellcodes noch besser hervor. Zeile 3 in Listing 2 zeigt, wie Sie das bewerkstelligen, Abbildung 4 veranschaulicht das Ergebnis.

Abbildung 4: Das Listing erinnert an alte Computerausdrucke, stammt aber von einem modernen Linux-PC mit Enscript.

Abbildung 4: Das Listing erinnert an alte Computerausdrucke, stammt aber von einem modernen Linux-PC mit Enscript.

Zeile 4 erzeugt eine farbige Ausgabe im RTF-Format. Vergessen Sie nicht, beim Weiterverarbeiten mit einem Office-Paket eine dicktengleiche Schrift zu verwenden, wie etwa Courier. Proportionalschriften, wie die beliebte Times, führen dazu, dass der Quellcode unübersichtlich erscheint. Die gedachten Spalten im Text liegen nicht mehr unbedingt übereinander.

Abbildung 5: Achten Sie beim Weiterverarbeiten der RTF-Ausgabe im Office-Paket der Wahl darauf, dass Sie für den Text eine dicktengleiche Schrift wie Courier auswählen.

Abbildung 5: Achten Sie beim Weiterverarbeiten der RTF-Ausgabe im Office-Paket der Wahl darauf, dass Sie für den Text eine dicktengleiche Schrift wie Courier auswählen.

Falls Sie das Quellcode-Fragment in eine Website integrieren möchten, bietet sich die direkte Ausgabe in HTML an. Das umfasst auch den Einsatz von Farben (Abbildung 6).

Abbildung 6: Die HTML-Ausgabe zum integrieren in eine Website bringt zudem Farbe in den Quellcode.

Abbildung 6: Die HTML-Ausgabe zum integrieren in eine Website bringt zudem Farbe in den Quellcode.

LaTeX-Dokumente

Mit dem Paket listings haben Sie die Möglichkeit, Quelltexte in einem LaTeX-Dokument zu verschönern [3]. Dabei bietet Ihnen diese Erweiterung viel Freiheit beim Gestalten, bei Bedarf sogar durch eigene Vorgaben für die Syntax. Zumindest dazu benötigen Sie jedoch Grundkenntnisse im Umgang mit LaTeX. Um das Paket zu integrieren, fügen Sie zunächst in der Präambel des LaTeX-Dokumentes die Zeilen aus Listing 3 ein.

Listing 3

%Diese Pakete werden zusätzlich benötigt
\usepackage{listings}
\usepackage{color}

An der entsprechenden Stelle legen Sie die Eigenschaften des Listings wie Farbe, Sprache, Zeilennummern und weitere Angaben fest. Die Tabelle “Wichtige Einstellungen” zeigt eine Auswahl von Möglichkeiten beim Konfigurieren.

Wichtige Einstellungen

Einstellung Variable Hinweis
Schriftfamilie basicstyle=\Schrift
Programmiersprache language=Sprache
Hintergrundfarbe backgroundcolor=\Farbe
Weißraum (Leerschritt, Tabulator) innerhalb von Strings showstringspaces=true
Hervorhebungen
Schlüsselwörter keywordstyle=\Farbe\Schrift\Auszeichnung
Kommentare commentstyle=\Farbe\Schrift\Auszeichnung
Strings stringstyle=\Farbe\Schrift\Auszeichnung
Zeilennummerierung
Position auf der Seite numbers=Position links: left, rechts: right
Stil numberstyle=\stil hier ist \tiny gebräuchlich
Schrittweite stepnumber=Schrittweite 1 für jede Zeile
Leere Zeilen numberblanklines=true false für Leerzeilen ohne Nummerierung
Beginn Nummerierung firstnumber=Anweisung auto: gleichnamige Listings zusammenhängend nummerieren, Zahl: Zählung beginnt ab genanntem Wert, last: Zählung vom vorhergehenden Listing fortführen
Abstand numbersep=Abstand Angabe des Abstandes in pt, mm, cm. Die Einheit ist obligatorisch.

Die Einstellungen tragen Sie in der Form \lstset{Einstellung, Einstellung} ins Dokument ein. Dabei trennen Sie die Einstellungen durch Kommas voneinander. Das Listing selbst kapseln Sie zwischen die Anweisungen \begin{lstlisting} und \end{lstlisting}. Optional ergänzen Sie die Anweisung \begin um einen Namen für das Listing:

\begin{lstlisting}[name=Listingname]

Je nach Einsatzgebiet kommen zum Auszeichnen des Quelltextes Grauabstufungen oder Farbwerte in Frage. Im ersten Beispiel markieren zwei verschiedene Graustufen die Kommentare und Strings, wohingegen die Schlüsselwörter zwar schwarz erscheinen, aber zum besseren Erkennen unterstrichen sind. Diese Variante macht zudem den Weißraum in Strings deutlich und nummeriert die Zeilen. Zur besseren Erkennung unterstreichen wir Schlüsselwörter zusätzlich zum Fettdruck (Listing 4).

Listing 4

%Hier werden die Farben definiert
\definecolor{grau}{gray}{0.50}
\definecolor{grau2}{gray}{0.30}
\definecolor{weis}{gray}{1.0}
...
\lstset{
basicstyle=\ttfamily,
language=bash,
keywordstyle=\color{black}\bfseries\underbar,
commentstyle=\color{grau},
stringstyle=\color{grau2}\ttfamily,
showstringspaces=true,
numbers=left,
numberstyle=\tiny,
stepnumber=1,
numberblanklines= true,
numbersep=5pt}
\begin{lstlisting}
#! /bin/sh
echo -n "Ihre Eingabe: ";read a
if [ -z $a ];
  then
    echo "Variable leer"
  else
    echo "Variableninhalt: $a"
fi
\end{lstlisting}

Abbildung 7: Schon ein paar sehr dezente Effekte, mit Hilfe des Pakets <code srcset=

listings erzeugt, sorgen für mehr Durchblick im Quelltext.” width=”300″ height=”184″ /> Abbildung 7: Schon ein paar sehr dezente Effekte, mit Hilfe des Pakets listings erzeugt, sorgen für mehr Durchblick im Quelltext.

In Farbe

Das alternative Beispiel aus Listing 5 zeigt einen hellgelben Hintergrund für den Quellcode. Die Farbe definieren Sie in der Anweisung \definecolor nach dem Farbmodell RGB. Die Zeilennummern zieht sich durchgängig durch die verschiedenen Teile des Quellcodes (Listing 5).

Listing 5

\definecolor{hellgelb}{rgb}{0.96,0.89,0.59}
\lstset{
basicstyle=\ttfamily,
language=bash,
backgroundcolor=\color{hellgelb},
keywordstyle=\color{red}\bfseries,
commentstyle=\color{green}\normalfont,
stringstyle=\color{blue}\ttfamily,
showstringspaces=false,
numbers=left,
numberstyle=\tiny,
stepnumber=1,
numberblanklines= true,
firstnumber=last,
numbersep=5pt}
\begin{lstlisting}
#! /bin/sh
echo -n "Ihre Eingabe: ";read a
if [ -z $a ];
  then
    echo "Variable leer"
  else
    echo "Variableninhalt: $a"
fi
\end{lstlisting}
\begin{lstlisting}
#! /bin/sh
for i in `ls -1 *.ps`;
do
    ps2pdf14 $i
done
\end{lstlisting}

Für Fortgeschrittene

Wer bei der Auswahl der unterstützen Sprachen nicht das Passende findet, dem steht die Möglichkeit offen, eigene Regeln für die Syntax zu erstellen. Die Definition stellen Sie vor dem Abschnitt \lstset ein. Die eigentliche Definition folgt der Form aus Listing 6.

Listing 6

\lstdefinelanguage{Sprache}{
 keywords={Schlüsselwort,Schlüsselwort},
 sensitive=true,
 comment=[1]{Kommentarzeichen}
 }

Bei vielen Programmier- und Skriptsprachen leiten Sie Kommentare aber durch zwei Zeichen ein. Anstelle comment benutzen Sie daher morecomment und geben die entsprechenden Zeichen an. Schlagen Sie zu diesem Thema im Handbuch [4] nach – es gibt einige interessante Varianten. Mit dem Einsatz von sensitive=true achtet LaTeX auf Groß- und Kleinschreibung eines Schlüsselwortes.

Eigene Farben legen Sie mit der Anweisung \definecolor fest. Die Farbwerte erhalten Sie, indem Sie mit einem Bildbearbeitungsprogramm zunächst die Wunschfarbe festlegen (Abbildung 9) und die angegebenen RGB-Werte durch 255 teilen. Die Farbdefinition mit den Werten aus Abbildung 9 lautet damit:

\definecolor{rot1}{rgb}{0.76,0.08,0.08}
Abbildung 9: Die Farbpalette von Gimp verrät Ihnen die Zahlenwerte für die Farben Rot, Grün und Blau.

Abbildung 9: Die Farbpalette von Gimp verrät Ihnen die Zahlenwerte für die Farben Rot, Grün und Blau.

Falls Sie Ihre Dokumentation oder Präsentation mit einem Office-Programm schreiben, müssen Sie die Postscriptdatei noch konvertieren. Dazu verwenden Sie ps2eps PS-Datei. Verwenden Sie als Ausgangsmaterial eine PDF-Datei, stellen Sie stattdessen mit pdf2svg PDF-DateiSVG-Datei eine Bilddatei zur weiteren Verwendung her.

Fazit

Uneinheitliche Quelltext-Ausgaben oder komplexe Verrenkungen mit einem Office-Paket gehören der Vergangenheit an, wenn Sie die richtigen Tools einsetzen. Sowohl mit Enscript als auch mit LaTeX zaubern Sie optisch ansprechende Ausgaben von Quelltexten und Code-Schnipseln. Einige Schritte lassen sich dabei sogar in Shell-Skripte packen und somit automatisieren. 

Der Autor

Harald Zisler beschäftigt sich seit den frühen 90er Jahren mit FreeBSD und Linux. Zu Technik- und EDV-Themen verfasst er Bücher und Beiträge für Zeitschriften. Aktuell ist sein Werk “Computer-Netzwerke” bei Galileo Press erschienen.

DIESEN ARTIKEL ALS PDF KAUFEN
EXPRESS-KAUF ALS PDF
LinuxUser 04/2013 KAUFEN
EINZELNE AUSGABE
ABONNEMENTS
TABLET & SMARTPHONE APPS
E-Mail Benachrichtigung
Benachrichtige mich zu:

Hinweis: Dieser Artikel ist älter als ein Jahr, enthaltene Informationen sind möglicherweise veraltet.

0 Kommentare
Älteste
Neuste Beste Bewertung
Inline Feedbacks
Alle Kommentare anzeigen
Nach oben