19.11.1990 DME 1.42 Kurzeinführung von Dirk Traenapp Sellostraße 7 2942 Jever DME wurde von Matthew Dillon geschrieben, einem Programmierer, dem wir bereits viele hervorragende Programme verdanken (CSHELL/DICE usw.). Diesen Editor schrieb Matthew, weil er als Programmierer einen Editor benötigte, der sehr flexibel ist. DME erfüllt diesen Aspekt, ohne gleich so wahnsinnig überladen zu sein, wie UEDIT, der auf programmierbar ist. Diese Programmierbarkeit hat für den Normaluser allerdings den Nachteil, daß man DME erst an seine Bedürfnisse anpassen muß, denn ohne ein gutes Makropaket (DME-Programme nennt man MAKROS) ist DME für niemanden zu gebrauchen. Das mag auch der Grund sein, warum viele Leute eine Abneigung DME geegenüber entwickelt haben. Seitdem ich DME mit einer recht guten Makrosammlung ausgestattet habe, ist die Gruppe der Benutzer in meiner Nachbarschaft gewaltig gestiegen. Also verzagen Sie nicht und werfen Sie ruhig mal einen Blick auf DME, er ist wirklich sehr gut ! Nach dieser Vorrede möchte ich kurz auf die Programmierung von DME eingehen. Dies wird allerdings nur eine kurze Einführung werden, da die genaue Beschreibung in einem großen Workshop enden würde, für den ich momentan absolut keine Zeit habe (Studenten haben es halt sehr schwer !!!). Für nähere Informationen ist dann ja auch noch die (leider) englische Originalanleitung, die allerdings nicht ganz Einsteigerfreundlich geschrieben wurde (DME war halt von einem Programmierer für Programmierer !). 1. Für den normalen User, ohne Programmierambitionen Durch das, diesem DME beigelegte Makropaket .EDRC, ist ein komfortables Arbeiten mit DME, wie mit einem anderen Texteditor (z.B. AZ) möglich. Nahezu alle Fuktionen wurden in deutsche Menüs implementiert und können, bis auf wenige Ausnahmen (aus Sicherheitsgründen) auch direkt von der Tastatur aus aufgerufen werden (Das ist ja auch DME's Art Kommandos abzulegen !). Die Menüpunkte sind, wie ich aus Erfahrung weiß, nahezu vollständig selbsterklärend und laufen soweit fehlerfrei (ich habe bisjetzt noch keine entdeckt, aber ich kann keine Garantien geben !!). Was ist grundsätzlich zu beachten: Die Routine SORTIERT DRUCKEN wurde für Leute geschrieben, die einen Drucker mit Einzelblatteinzug haben (ich z.b.) und sich dauernd ärgern, daß es KEINEN Texteditor gibt, der Vorder- und Rückseiten getrennt druckt (nicht einmal WordPerfect macht das !!). Nun gut DME kann das jetzt; dabei sind allerdings ein paar Dinge zu beachten: 1. Die Seitenlänge muß vorher eingestellt werden. Damit ist die Anzahl von Zeilen gemeint, die auf ein Blatt passen, bis der Drucker AUTOMATISCH ein neues Blatt einzieht. Bei mir sind das 61 Zeilen und das ist auch die Voreinstellung im .EDRC File. 2. Der Text muß in der Breite so formatiert sein, daß KEINE überlangen Zeilen gedruckt werden. Der Algorithmus der zum Seitensortieren benutzt wird geht nämlich davon aus, das eine Zeile im Editor auch eine Zeile auf dem Drucker ergibt. Stimmt das nicht, dann verzählt er sich fürchterlich und das Ergebnis auf dem Papier ist nur noch für den Mülleimer zu gebrauchen. Wenn man bei der Texterstellung den rechten Rand grundsätzlich auf Druckerzeilenbreite einstellt und den WORDWRAP Modus aktiviert, dann kann so etwas normalerweise nicht vorkommen. Wenn man Listings ausdrucken möchte, dann ist es aber üblich, daß viele Zeilen länger sind. Wenn man hier allerdings mit Wordwrap formatiert, dann stimmen die Zeilenbreiten zwar, von einem Listing kann man dann allerdings nicht mehr sprechen. In diesem Fall sollte man den Text mit dem Menüpunkt TEXT FORMATIEREN oder der Tastenkombination Shift Alt f7 bearbeiten. Diese Funktion formatiert jeweils nur eine einzelne Zeile für sich, dadurch bleibt der Listingcharakter erhalten und der Text kann SORTIERT gedruckt werden. 3. Bei der Sortierung des Textes für den Druck bitte nicht nervös werden. Diese Funktion nimmt doch etwas Zeit in Anspruch. Der Ursprüngliche Text wird übrigens im T: zwischengespeichert und nach dem Druck wieder geladen. FEHLER: Bisher sind keine schlimmen Fehler aufgetreten. Ein kleines Problem ist, daß nach dem Druck der ungeraden Seiten immer ein Blatt zuviel eingezogen wird; dieses kann man dann ruhig entfernen. Ich habe auch keine Ahnung, was die Routine bei unmöglichen Seitenlängen macht ( < 1 ). Der Menüpunkt ERSETZEN ersetzt leider noch ALLE gefundenen Wörter und fragt dabei nicht mehr nach. D.h. ERSETZEN ist etwas riskant. Die Stiländerungen wie UNTERSTREICHEN, BOLD, ... funktionieren auf Druckern und auf dem Bildschirm, nur DME merkt da nichts von. D.h. DME fügt diese Steuerketten so ein, wie sie sind. Das hat folgenden Nachteile: - Der Text wird recht unübersichtlich, obwohl ich sagen muß, daß man sich auch an die Steuerkodes gewöhnt (ESC [4m ist für mich ganz selbstverständlich UNDERLINE ON). - Viel wichtiger ist, daß DME die Steuerketten als Zeichen mitzählt, obwohl sie nachher auf dem Drucker bzw. dem Bildschirm nicht auftauchen. Das hat zur Folge, daß sich die Textformatierroutine WORDWRAP versieht und der Text nachher nicht mehr ganz so schön aussieht. Abhilfe schafft folgender Trick: Der Text wird komplett OHNE Steuerketten geschrieben und formatiert. Danach wird der WORDWRAP-Modus ausgeschaltet und die Steuerketten eingefügt. Danach darf auf keinen Fall wieder neu formatiert werden, da der Text sonst wieder durcheinandergebracht wird. - Ein weiterer wichtiger Punkt ist, daß sich ALLE STIL-Kommandos selbsttätig umschreiben. D.h. wenn z.B. UNDERLINE angewählt wird, dann wird in den Text der Steuerkode für UNDERLINE ON eingefügt. Die Funktion UNDERLINE schreibt sich dabei so um, daß bei nächsten Aufruf automatisch UNDERLINE OFF eingefügt wird. Erst nach diesem zweiten Aufruf ergibt die Funktion wieder UNDERLINE ON. - Sollen diese Steuerkommandos übrigens auch auf dem Bildschirm aussehen, dann ist es notwendig mit der Zeichenfolge ESC [0m wieder auf den normalen Zeichsatz zurückzuschalten, denn die Bildschirmroutine versteht leider nur Aktivierungskommandos. So, daß wärs eigentlich. Der nachfolgende Teil zeigt kurz (sehr kurz), wie man DME programmiert. Wenn der Teil zu kompliziert, oder zu nichtssagend ist, dann bitte ich mir das zu verzeien, aber ich habe wirklich keine Lust und Zeit einen Workshop über das Programmieren von DME zu schreiben, und ich glaube auch, daß ich dazu nicht der Richtige bin, denn mit dem Erklären von Programmiersprachen habe ich es nicht so. Ich kann's, daß reicht mir. 2. Was ist ein Makro ? Anders als bei den normalen Texteditoren ist ein DME-Makro keine gespeicherte Tastenfolge, die in einem Lernmodus eingegeben wird und danach beliebig wiederholbar ist. DME baut seine Makros in einer Programmiersprache auf, die an die Bedürfnisse eines Textsystem angepaßt sind. DME besitzt Schleifenkonstrukte wie REPEAT und WHILE. Es können Kommandos bedingt mit IF oder IFELSE ausgeführt werden, also ganz wie es mit einer normalen Hochsprache möglich ist. Ich hoffe, daß Sie jetzt nicht schon erschrocken die Diskette aus dem Laufwerk reißen und dieses Teufelswerk lieber gegen AZ oder ähnliches eintauschen wollen, denn so schlimm wie es sich anhört, ist ist beileibe nicht. Unser erstes Beispielmakro: Hmmm, es gar nicht so einfach, sich ein Makro auszudenken, das es nicht schon gibt; ich werde jetzt einfach mal ein NONSENS Makro erstellen, welches aber sehr schön die Art der Programmierung demostriert: AUFGABE: Wir wollen, aus welchen unerfindlichen Gründen auch immer, eine Zeile in den aktuellen Text einfügen und diese Zeile soll aus MINUSZEICHEN bestehen. Wir gehen also in den Kommandomodus von DME (Die ESC- bzw, bei meinem .EDRC-File, welches hier verwandt wird, HELP-Taste) und schreiben: (----------------------------------------) Nach Return erscheint diese Zeile ohne die Klammern an der Stelle, an der der Cursor steht. Sie werden jetzt sicherlich sagen, daß hätte ich ja auch direkt eingeben können. Recht haben Sie, aber es geht gleich weiter. Drücken Sie jetzt bitte CONTROL HELP. Sie befinden sich jetzt wieder im Kommandomenü, in dem immer noch das letzte Kommando, nämlich unsere Strichlinie, steht. Ändern Sie den Text jetzt bitte so ab, daß er der folgen Zeile gleicht: map f10 ((----------------------------------------)) Wenn Sie jetzt Return drücken und Sie keinen Fehler gemacht haben, werden Sie diesmal keine Striche sehen. Wenn Sie jetzt aber die Taste F10 betätigen, dann erscheint Ihre Strichlinie sofort an der aktuellen Cursorposition. Soeben haben Sie ihr erstes DME-Makro erstellt !! Es kann jetzt sooft wiederholt werden, wie Sie wollen, es kann auch aus einem anderen Makro heraus als Unterprogramm benutzt werden. Das Makro kann man aber noch verbessern: map f10 (repeat 40 ((-))) Jetzt haben wir unser erstes Hochsprachenkommando (REPEAT) benutzt, welches dieses Makro natürlich gigantisch aufwertet. Dieses Makro ist aber leider ein totales NONSENS Makro, mit dem man eigentlich absolut nichts anfangen kann. Daß mit dieser Makrosprache aber auch komplexere Dinge machbar sind, möchte ich mit dem folgenden Makro demonstrieren. AUFGABE: Nehmen wir an, wir bräuchten eine Funktion, die in einem Wort alle Kleinbuchstaben in Großbuchstaben wandelt. (Ok, ok ! Ich weiß, daß ich das aus der Originalanleitung abgekupfert habe, aber mir fällt einfach kein einfaches Makro ein): map f10 (while cl (tlate -32 right)) Dieses Makro besteht aus einer Schleife, die solange durchlaufen wird, bis sich unter dem Cursor kein Kleinbuchstabe mehr befindet. Die Kommandos, die in dieser Schleife durchlaufen werden sind: tlate -32 : Dieses Kommando zieht von dem Zahlenwert des Zeichens unter dem Cursor 32 ab, was einer Umwandlung von Klein- in Großzeichen entspricht ('a' hat den Wert 97 und 'A' den Wert 65) right : Dieses Kommando bewegt den Cursor um eine Position nach rechts Damit das Makro funktioniert, muß der Cursor am Anfang des zu ändernden Wortes stehen. Da das nicht ganz benutzerfreundlich ist, ist es sinnvoll das Makro noch etwas zu modifizieren: map f9 (ifelse !ca wright (if !l (left ifelse c<>32 (right wleft) right)) if c<>0 (while !ca right) -f10) Jetzt kann der Cursor stehen, wo er will, das Makro sucht selbstständig den Anfang des Wortes und fängt an dieses Wort dann GROß zu machen. Dazu wird übrigens die alte Großschriftroutine auf der Taste f10 benutzt. Diese Definition geht nun schon über zwei Zeilen, was DME allerdings nicht verkraftet. DME verlangt, daß ein Makro nur über eine Bildschirmuzeile geschrieben werden darf, diese ist allerdings 255 Zeichen lang, was ab und zu aber nicht ausreicht. In diesem Fall muß man das Makro in Unterprogramme aufteilen, was dieses Demomakro auch schon macht. Bei dieser Definition wird allerdings sehr stark deutlich, daß DME-Makros dazu neigen unübersichtlich zu werden. Es ist doch schon erschreckend, wie sich so ein primitives Problem einer Uppercasefunktion zu einem großen Abfragemoloch entwickelt. Es ist deswegen dringend anzuraten, alle komplexeren Makros ausreichend zu dokumentieren. So, hier möchte ich die kleine Einführung jetzt beenden, da die Sache sonst doch Gefahr läuft, in einen Workshop auszuarten. Dieser Editor ist dermaßen komplex, daß ich selbst (und ich bin Programmierer) zwei Monate gebraucht habe, um ihn zu beherschen; seien Sie also nicht so schnell frustriert, wenn mal ein Makro partout nicht laufen will. Einen wichtigen Tip möchte ich noch geben: Vorsicht mit den Klammern !!! DME legt sehr viel Wert auf seine Klammerebenen, meckert aber leider nicht, wenn man mal eine oder sogar mehrere vergißt, was bei einem Makro von >100 Zeichen sehr schnell passiert. Das Makro macht dann zwar etwas, aber meist nur Blödsinn. Bei meiner .EDRC Datei hatte ich teilweise sehr lange an Klammerebenen herumgebastelt, bis alles einwandfrei lief. Für nähere Informationen zu den Kommandos und Flags verweise ich nochmals auf die Originalanleitung von Matt Dillon und den kommenden Workshop in der Zeitschrift Amiga-DOS (Diese Time geht gleich nach der Fertigstellung an die PD-Redaktion). Dirk Traenapp für APS -electronic- Sonnenborstel 31 3071 Steimbke (Dieser Text wurde selbstverständlich mit DME erstellt) (Laden Sie den Text doch einmal in DME ein, damit sie sehen, wie die Steuerkodes aussehen)