InstantView® für Eclipse - eine Einführung

Eclipse ist eine Entwicklungsumgebung, die in Java geschrieben worden ist. Sie besteht aus einem Kern und vielen Plug-Ins, die sich jeder Benutzer individuell zusammen stellen kann. Beispiele für Plug-Ins sind das JDT (Java Development Tool) und das CDT (C/C++ Development Tool), mit denen sich Programme in Java beziehungsweise C/C++ entwickeln lassen. ClassiX® bietet in dem Zusammenhang ein Plug-In an, das den Benutzer ähnlich mit InstantView® unterstützt. Die Plug-Ins werden dabei ins Verzeichnis "/plugins" direkt unter dem Hauptverzeichnis abgelegt.

Für Eclipse werden zwei Ordner beansprucht: Zum einen das Installationsverzeichnis, in das Eclipse einfach hineinkopiert wird. Hier werden auch alle Plug-Ins abgespeichert/installiert. Der zweite Ordner repräsentiert den sogenannten Workspace. In diesem werden Projektinformationen abgelegt und Einstellungsdetails abgespeichert. Dadurch können alle Einstellungen auch bei Installation einer neuen Eclipse-Version übernommen werden. Beachten Sie, dass die Funktionalität von Eclipse von seinen Plug-Ins abhängt, die im Installations-Verzeichnis liegen.

Die Oberfläche

Die Oberfläche von Eclipse gliedert sich in einen großen Editor-Bereich und mehrere kleinere View-Bereiche. Im Editor-Bereich werden alle Dokumente, die bearbeitet werden, im entsprechenden Editor geöffnet. Die View-Bereiche gliedern sich im Allgemeinen um den Editor-Bereich und liefern dem Programmierer weitere Informationen. Die Outline-View beispielsweise stellt die wichtigsten Elemente des im Editor geöffneten Dokuments graphisch dar. Selbstverständlich können alle Bereiche nach belieben per Drag&Drop in Größe und Position angepasst und die Views umverteilt werden.
Die Aufteilung und Auswahl der Views wird in einer sogenannten Perspective gespeichert. Dies ist nützlich, um beispielsweise für verschiedene Programmiersprachen sein Eclipse anders einzurichten. So gibt es auch für InstantView® eine spezielle InstantView®-Perspective, in der die für InstantView® relevanten Views eingebunden sind. Zum Debuggen von Programmen steht übrigens eine eigene Debug-Perspective zur Verfügung, die unter anderem eine Debug-, eine Variable- und eine Breakpoint-View anbietet, in der der momentane Stack-Trace, die dazugehörigen Variablen beziehungsweise die installierten Breakpoints angezeigt werden.

Das Projektmanagement

Quelltext wird in Eclipse als sogenannte "Resources" im "Workspace" verwaltet. Es wird also intern ein Modell der Dateien, die sich im Workspace befinden, gepflegt. Den Workspace wird dabei beim Starten von Eclipse ausgewählt. Die persistenten Daten für das interne Modell werden hierin im Ordner ".metadata" gespeichert.

Die Resources werden vom InstantView-Plugin für eine möglichst intuitive Benutzung eingesetzt. So entsprechen die Files den Dateien und die Folder den Ordnern auf der Festplatte. Besonders sind dabei lediglich die Projekte, welche eine besondere Art von Ordnern darstellen. Dabei stellen die Projekte grundsätzlich die Ordner der obersten Ebene dar. Wir haben uns entschlossen, das ClassiX-Verzeichnis (z.B. "Y:\ClassiX") als Workspace auszuwählen und die darunterliegenden Ordner als Projekte (z.B. "Y:\ClassiX\Evaluate"). Zu Einschränkungen dieses Vorgehens siehe Hinweise zur Installation

Da Eclipse jedoch nicht automatisch alle Ordner innerhalb des Workspaces als Projekte ansieht und auch Projekte außerhalb des Workspace-Ordners angebunden werden könnten, müssen Projekte erzeugt oder importiert werden. Sofern die ClassiX-Projekte also schon existiert, was meistens der Fall ist, müssen entsprechende Projekte folgendermaßen importiert werden:

Projekte haben zudem die Eigenschaft, entweder geschlossen oder offen zu sein. Dabei werden geschlossene Projekte vom Parser und von Such-Anfragen ausgelassen. Ein Projekt lässt sich per Rechtsklick "Open/Close Project" öffnen bzw. schließen. Ein geschlossenes Projekt wird von jeglichen Aktivitäten wie Suchanfragen oder Parsevorgängen ausgeschlossen.

IPC-Dateien

Um das Arbeiten mit bestimmten Konfigurationen von Projekten zu vereinfachen, wurden InstantView-Project-Configuration-Dateien eingeführt. Diese tragen den selben Namen wie die zugehörige CXP-Datei und beinhalten alle zur Konfiguration eines Projekts nötigen Informationen, welche auch in den InstantView-Project-Properties eingestellt werden können. Die Properties erreichen Sie, indem Sie auf ein InstantView-Project rechtsklicken und die InstantView-Properties auswählen.

Klicken Sie in diesem Dialog nun auf "Apply" oder "OK", wird die momentane Konfiguration als IPC-Datei gespeichert und wird ab sofort geladen, sobald Sie das momentane CXP in der Combobox auswählen.

Die IPC-Datei wird stets im gleichen Verzeichnis wie die CXP gespeichert und trägt den selben Namen (bis auf die Endung). Sie kann auch vom Project-Validator eingelesen werden, um die exakt gleiche Konfiguration zu parsen. Auch eignet sie sich dafür, um die Konfiguration für ein Projekt auf einen anderen Arbeitsplatz zu portieren.

Working Sets

Working Sets definieren eine Menge an Resources (Files, Folders, Projects), die zusammengehören und - wie der Name des Working Sets schon andeutet - zusammen bearbeitet werden. Sie ermöglichen es, Views und Suchanfragen auf diese Resources zu beschränken. Dadurch werden unübersichtliche Views vermindert (im Englischen wird dieses Phänomen "visual noise" genannt) bzw. die Suchanfrage präzisiert und beschleunigt.

Um ein Working Set zu definieren müssen Sie zunächst in den Dialog "Select Working Set" kommen. Dies ist auf mehreren Wegen möglich. Zum einen über das Menü einer View und zum anderen über die Suche: In einer View, die Working Sets unterstützt (beispielsweise der Project-Explorer) öffnet man über einen Klick auf das Dreieck das "View Menu" und wählt "Select Working Set..." (siehe links). Startet man die Suche über Strg + H, kann man den Dialog über den "Choose..."-Button neben "Working set:" erreichen.

Im Dialog wählt man nun "New → Resource → Next", gibt dem Working Set einen Namen (z.B. "Ableitungen"), wählt die zum Working Set gehörigen Dateien und Ordner aus und kehrt mit Finish zum Dialog zurück. Nun wähle man auf jeden Fall "OK", damit die Working Sets gespeichert werden (man kann auch bei den Radio-Buttons "No Working Sets" auswählen, so dass keine Nebeneffekte entstehen.

Im Project-Explorer können Sie nun wiederum über das Menü "Select Working Sets..." auswählen und dadurch die angezeigten Resources auf die der Working Sets beschränken. Ähnlich kann man die Suche über "Choose..." auf die gewählten Working Sets einschränken.

Marker

An Resources können sogenannte Marker angebracht werden, welche besondere Eigenschaften hervorheben. So gibt es im Allgemeinen drei verschiedene Arten von Markern:

Bookmarks werden normalerweise vom Benutzer selbst gesetzt, um bestimmte Code-Stellen zu markieren.

Task-Marker werden meist von Eclipse gesetzt, können aber auch manuell definiert werden. Sie sind spezielle Bookmarks, die Aufgaben markieren und dementsprechend als wichtig und/oder erledigt gekennzeichnet werden können. Der InstantView-Parser sucht beispielsweise alle Positionen, an denen Kommentare mit dem Stichwort "FIXME" auftreten, heraus und markiert diese als Aufgaben.

Problem-Marker können nicht vom Benutzer gesetzt werden. Sie werden von Eclipse benutzt, um Fehler im Source-Code anzuzeigen.

Allen Markern gemeinsam ist, dass sie beim Öffnen eines Dokuments auf den Overview-Rulern beidseitig vom Editor und teilweise im Text angezeigt werden. Um eine Übersicht überdie vorhandenen Marker zu verschaffen, gibt es für jeden Marker-Typ eine eigene View, in der Marker tabellarisch aufgeführt werden. (Diese Views sind über Window → Show View (→ Other) zu erreichen.)

Im Menü einer solchen View kann man unter anderem einen Filter einstellen, der einem nur die Marker der momentan ausgewähten Datei anzeigt. Dazu lässt man sich, wie links auf dem Bild angedeutet, das Menü anzeigen, wählt "Configure Content" und wählt beispielsweise für die Problem-View im folgenden Dialog die Optionen "Errors/Warnings on Selection" und "On selected element only".

Teilweise ist für die Views ein Filter aktiv, der lediglich 100 oder 200 Marker zulässt. Sie können diesen Filter unter "View Menu → Preferences" im oberen Bereich ändern und auch deaktivieren.

Es gibt persistente Marker, welche beim Schließen von Eclipse erhalten bleiben, und transiente Marker, welche beim Schließen von Eclipse verschwinden. Allen Markern gemein ist, dass sie nicht in der Datei gespeichert werden (d.h. die Datei, in der Marker gesetzt werden, bleibt unverändert), sondern im Workspace, welcher ein Model der in ihm beinhalteten Resources hält und zu jeder Resource deren Marker speichert. Die entsprechenden Daten liegen im Verzeichnis ".metadata\.plugins\org.eclipse.core.resources" in Ihrem Workspace-Ordner.

Der Parser

Der InstantView-Parser ließt importierte Projekte, erstellt aufgrund dessen Datenmodelle der Strukturen und markiert Fehler im Source-Code.

Die Einstellungen des Parsers finden sich unter

Window → Preferences → InstantView-Preferences → Parsing.

Hier kann das Background- oder Single-File-Parsing in Kombination mit Reconciling ausgewählt, sowie das Parsen komplett ausgestellt werden. Wir empfehlen, Single-File-Parsing sowie Reconciling auszuwählen.

Der Parser kontrolliert unter anderem den InstantView®-Code auf Fehler. Findet der Parser einen Fehler, so wird dieser als Problem-Marker abgelegt. Eine Auflistung aller Problem-Marker findet man in der Problem-View, die man über Window → Show View → Problems sich anzeigen lassen kann.

Die Fehler teilen sich auf in behebbare und nicht behebbare Fehler. Bei den behebbaren Fehlern, weiß der Parser, was er an dieser Stelle zu erwarten hätte und weiß, wir er darauf reagieren und wie weiterparsen soll. Typischerweise sind dies falsch geschriebene oder unbekannte Makros, Messages, Widgets, Variablen etc. Sie werden vom Parser mit beispielsweise "Unknown macro: "SendMesage"" markiert.

Bei nicht behebbaren Fehlern ist es im Allgemeinen nicht möglich, zu bestimmen, was der Autor ursprünglich gemeint hat, und dementsprechend fällt es schwer, die allgemeine Struktur zu interpretieren. Typischerweise wird das nächste Zeichen übersprungen ("Single Symbol Deletion") oder so getan, als ob ein erwartetes Zeichen dort stünde ("Single Symbol Insertion"). Schlägt dies fehl, werden die nächsten Befehle übersprungen, bis der Parser auf etwas stößt, was ihm bekannt vorkommt. Dies kann dazu führen, dass schwerwiegende Folgefehler auftreten. Wir arbeiten daher daran, diese Fehler zu umgehen, abzufangen und dem Parser die nötigen Informationen zu verschaffen, so dass dieser weiter parsen kann.

Möchten Sie bestimmte Probleme nicht anzeigen lassen, so können Sie für jedes Projekt auswählen, ob Sie einen bestimmten Fehlertyp anzeigen lassen wollen oder nicht.

Sofern nicht das Background-Parsing aktiv ist, kann der Parser manuell angestoßen werden, ein Projekt zu parsen. Dazu markieren Sie die Projekte im Project Explorer, welche geparst werden sollen, rechtsklicken auf die Markierung und wählen "Parse Project(s)".

Background-Parsing

Das Plug-In hält sich intern für jedes Projekt ein Model vor, um die Korrektheit von Makros, Messages und Variablen zu prüfen und Informationen in der Outline aufbereiten zu können. Dieses wird vom Parser im Hintergrund mit Informationen gespeist, damit der Benutzer möglichst ungestört seine Arbeit fortführen kann. Der Parse-Vorgang wird angestoßen, sobald das Plug-In gestartet wird. Dies ist beispielsweise beim Öffnen eines Dokumentes mit dem InstantView-Editor der Fall.
Dieser Parser im Hintergrund ist ebenfalls dafür zuständig, dass Dateien, die gespeichert oder von außen neu hinzugefügt werden (beispielsweise über ein Versionskontrollsystem), wieder auf den aktuellen Stand gebracht werden. Es kann daher beim Speichern zu leichten Verzögerungen kommen, bevor die Datei wieder vollständig geparst ist, wenn das anfängliche Hintergrund-Parsen noch nicht abgeschlossen ist.

Zusätzlich zum Background-Parsing, das nur auf gespeicherten Dateien aktiv ist, gibt es die Option eines Reconcilers (auch Foreground-Parsing genannt). Dieser ist dafür gedacht, schnell Änderungen im Dokument zu überprüfen. Dies kann Eclipse verlangsamen, da theoretisch das gesamte Dokument bei jeder Eingabe neu geparst werden müsste. Praktisch beschränken wir uns darauf, sogenannte Blocks zu parsen, die eine Einheit bilden. Das können beispielsweise Action-Lists, Makro-Implementationen oder Code-Blocks sein. Sollten dabei Fehler auftreten, parst das Background-Parsing beim nächsten Speichern das gesamte Dokument durch.
Sollte die Performance unter dem Reconciling trotzdem allzu sehr leiden, kann es auch ausgeschaltet werden, ohne dass das Background-Parsing deaktiviert werden muss.

Das Reconciling springt auch dann ein, wenn nicht erkennbar ist, aus welchem Projekt das Dokument stammt und wie also der Kontext ist. Dadurch kann es vorkommen, dass eine inkludierte Datei zunächst als fehlerhaft angesehen wird, da sie beispielsweise kein "Module" enthält, später aber als korrekt erkannt wird, sobald der Kontext der Datei klar ist. Tritt ein Fehler aus einem bestimmten Kontext heraus auf, so wird dies vermerkt.

Single-File-Parsing

Alternativ zum Background-Parsing, welches ein gesamtes Projekt durchparst und auf Fehler überprüft, gibt es die Option des Single-File-Parsings. Dabei werden nur die vom geöffneten Modul aus bekannten Module geparst. Dadurch kann es vorkommen, dass eine inkludierte Datei nicht einem Modul zugeordnet werden kann, da diese inkludierte Datei nicht in der EXT deklariert wird. In solchen Fällen gibt der Parser eine Fehlermeldung aus und startet gegebenenfalls das Reconciling. Sobald jedoch das Modul geöffnet wird, welches die Datei inkludiert, merkt sich das interne Modell die Zugehörigkeit der inkludierten Datei.

Reparsing

Wurde eine Datei von außen geändert (beispielsweise durch Syncen vom Versionskontrollsystem) oder im Editor gespeichert, so setzt das Reparsing ein. Dieses errechnet sich, welche Dateien von der Änderung betroffen sind, und lässt diese im Hintergrund parsen, damit das Modell wieder aktuell ist.

Je nach Betriebssystem und internen Einstellungen kann es zu längeren Wartezeiten bis zum Reparsing kommen. Um ein Reparsing zu erzwingen, rechtsklicken Sie auf den Ordner bzw. die Dateien, die reparst werden sollen und wählen Sie "Refresh" aus. Dadurch überprüft Eclipse die Dateien auf der Festplatte auf Inkonsistenzen mit den Resourcen im Workspace und stößt gegebenenfalls das Reparsing an.

Die Outline

Wie schon erwähnt, gibt es in Eclipse eine View, die den Code eines Dokumentes graphisch aufbereitet. Die Outline findet man unter Window → Show View → Outline und wird von unserem Plug-In genutzt, um eine Übersicht über die im Modul deklarierten und implementierten Macros, Messages, Variablen und Widgets zu präsentieren. Wird eines dieser Objekte in der Outline-View angeklickt, so wird im Editor das entsprechende Objekt markiert und zentriert. Mithilfe der Schaltfläche "Filename" können die Dateinamen, die hinter jedem Objekt stehen, ein- und ausgeblendet werden. Sie sollen helfen, ein Objekt zu finden, welches inkludiert wird.

Hyperlinking

Eclipse bietet die Möglichkeit, Text mit Hyperlinks zu versehen. Dies nutzt unser Plug-In, um zur Position der Implementation bzw. Deklaration von Objekten wie Makros, Messages und Variablen zu gelangen.

Um einen Hyperlink anzuzeigen, hält man die Strg-Taste gedrückt und bewegt dann den Mauszeiger über den Begriff. Nun erscheint der Hyperlink und kann angeklickt werden, wodurch dann die entsprechende Position im Editor geöffnet wird. Ist die Datei, in dem sich die Position befindet, nicht geöffnet, wird ein neuer Editor geöffnet und die Position markiert. Sind mehrere Implementations-Positionen eines Objekts bekannt, werden diese angeboten und man kann sich bei gehaltener Strg-Taste eine Position aussuchen.

Hovering

Hält man den Cursor der Maus einen Moment still über einem Teil des Source-Codes, so kann sich, abhängig von Kontext, ein Tooltip öffnen, welcher dann Informationen über den Source-Code ausgibt.

Im InstantviewEditor wird, geordnet nach Priorität angezeigt:

  1. Werte von Variablen im Debug-Modus
  2. Messages von Problem-Markern
  3. Informationen über Typ und Deklaration/Implementation des Objekts (wie im Screenshot oben)

Completion-Proposals

Möchte man ein längeres Wort im Editor eingeben, welches bereits im Dokument vorhanden ist, so kann man sich die Tipparbeit erleichtern, indem man lediglich die ersten Buchstaben des Wortes eingibt und dann eine Kombination aus Strg + Leertaste drückt. Es erscheint ein Liste der Wörter, die mit dem bisherigen Buchstaben anfangen. Gibt es lediglich ein Wort, auf welches die Buchstaben passen, wird es automatisch eingefügt, ohne dass zunächst die Liste gezeigt wird. Dabei ist zu beachten, dass das Completion-Feature in InstantView case-sensitive ist.

Bedienungsanleitung

Die offizielle Bedienungsanleitung zur aktuellen Eclipse-Version 3.5 (aktuell vom Juni 2009 bis Juni 2010) finden Sie hier.