10. Besonderheiten


 

10.1 Umgebungsvariablen

mbedit.sucht bestimmte Files auf bestimmten Directories, die u.a. auch durch Umgebungs-Variable spezifiziert werden. Das ist teilweise abhängig vom verwen- deten Betriebssytem. - Der History-File 'MBEDIT.HST' wird immer auf der User-Home-Directory gesucht bzw. angelegt. Diese wird anhand einer Umgebungs-Variablen ermittelt: - Umgebungs-Variable ":HOME:" oder, wenn diese nicht existiert - Umgebungs-Variable "HOME" oder, wenn diese nicht existiert - die aktuelle Directory "." - Der Macro-File "MBEDIT.MAC" wird default-mässig in folgenden Directories gesucht: a) Bei unix + os/9 wird dem Editor als erstes Argument das 1. Wort des Kommando-Strings übergeben (i.d.R. also "mbedit", ohne Pfad). Deshalb wird bei diesen Betriebssystemen zusätzlich noch im "PATH" gesucht. b) in der Directory, die als erstes Argument dem Editor übergeben wird, also bei MS-DOS dieselbe Directory, von der auch mbedit gestartet wurde (z.B. "C:\BIN\mbedit"). c) in der User-Home-Directory. Alle existierenden Macro-Files werden in dieser Reihenfolge gelesen. - Der Temp.-File "MBEDIT.TMP" wird auf der Temp.-Directory angelegt, die folgendermaßen definiert ist: - Es gab Zugriffsprobleme mit "/tmp" als temp. Directory unter unix, wenn 2 User gleichzeitig auf dem temp. File zugegriffen haben. So beschloß ich, den temp. File auch auf der User-Home-Directory anzulegen (wie den History-File). - Der Name der Konsole wird benötigt, wenn bei Verwendung einer Eingabe- umleitung ein EOF (End of File) auftritt. Er ist wie folgt definiert: - MS-DOS: CON - os/9 : Umgebungs-Variable "PORT" - unix : /dev/tty

10.2 mbedit und unix (vt-100-mode)

Ein leidiges Problem bei der Tastatur-Eingabe sind die sog. Escape-Sequenzen (das sind Folgen von ASCII-Charaktern, die mit <esc> beginnen und eine variable Laenge haben). Die Sequenz für "Cursor Up" ist z.B. "<esc>[A". Die Schwierigkeit besteht im Erkennen von einzelne <esc>s, wie nach der Eingabe eines 'Find'-Strings. Das Programm kann einzelne <esc>s von <esc>-Sequenzen nur mit einer Timeout-Überwachung unterscheiden. Unter OS/9 ist das kein Thema, aber unter unix ist die kürzeste Zeit, die vom Betriebssytem unterstützt wird, 1 Sek. (seit Version 6.77 auch kürzer, siehe Kapitel "Macro File", Eintrag "AE=200", <esc> Wartezeit = 200 msec). D.h.: nach dem Drücken der <esc>-Taste vergeht die Wartezeit, bis das Betriebssytem dem Editor mitteilt: "Es kommt kein Character mehr hinterher", worauf der Editor feststellt: "einzelnes <esc>". Man kann diesen Wartevorgang abkürzen, indem man das nächste Kommando sofort eingibt - das funktioniert. Wenn das nächste Kommando noch nicht feststeht, kann man auch 2-mal <esc> eingeben. Dann wird das erste sofort ausgeführt und das zweite bewirkt nichts. Allerdings läßt sich dann mit 'A' (Again) das letzte Kommando (wie 'Find') nicht wiederholen. Statt dessen würde das 2. <esc> wiederholt, was wiederum nichts bewirkt. Immerhin geht dabei nichts kaputt. Übrigens kranken alle Editoren an dieser Unterscheidung der <esc>s von den Sequenzen. Manche haben sogar einen Bug: Wenn vor Ablauf der Sekunde Wartezeit eine andere Taste gedrückt wird, geht ein Keyboard- Character verloren, was mitunter zu seltsamen Ergebnissen führt. Sehr häufig erscheint dann die Sequenz "[xx" mitten im editierten Text, d.h. die <esc>-Sequenz ab dem 2. Character. Neue Methode ------------ Ab Version 6.2 ist mbedit mit einer neuen <esc>-Sequenz-Behandlung ausge- stattet. Das Problem ist: Tastatur-Eingaben in Verbindung mit einer Netz- werk-Verbindung (rlogin or telnet) können Probleme verursachen, wenn die Folge der Character durch lange Pausen unterbrochen wird. In diesem Fall ist die Unterscheidung zwischen einzelnen <esc>s und -Sequenzen problematisch. Um diesen Ärger zum umgehen, verwende ich einen ausgeklügelten Algorithmus: keyboard input sequence | detected character(s) | o.k. | remarks ------------------------+-----------------------+--------+----------------- <esc> (1 sec pause) | <esc> | yes | single <esc> <esc> [ A | (Cursor Up) | yes | normal case <esc> ( pause) [ A | <esc> [ A | no | old algorithm <esc> (short pause) [ A | <esc> (Cursor Up) | mostly | new algorithm <esc> (long pause) [ A | <esc> [ A | no | new algorithm Der 4. Fall ist der entscheidende. Wenn mbedit ein '[' entdeckt, das einem <esc> nach einer kurzen Pause folgt (max. 5 Sekunden), erzeugt es den korrekten Tastatur-Code, aber mit einem vorangestellten <esc>. Dieses wird im Command Mode völlig ignoriert. In den meisten anderen Fällen wird eine Fehlermeldung angezeigt, und danach im Command Mode weitergemacht. Das ist in jedem Fall besser als der 3. Fall, der sehr viel Verwirrung stiftet.

10.3. mbedit und X11

Die Clipboard-Funktion (also das Kopieren von Texten von einem Fenster in ein anderes) funktioniert, was aber zugegebenermaßen das Verdienst von X11 ist. Beim Drücken der rechten Maustaste wird der markierte Text einfach nach Standard-Input umgeleitet. Damit der empfangene Text auch als solcher verstanden wird, muß der mbedit im Ziel-Fenster auf 'Insert' stehen. Die eingehenden Zeichen würden sonst als Kommandos interpretiert, was beliebigen Unsinn ergeben kann. Um Daten von einem anderen Fenster in den mbedit-Text zu kopieren, benutzt man die Option 'S'et 'I'ndent 'N'o. Andernfalls würden die Zeilenanfänge um zusätzliche Leerzeichen ergänzt werden.

10.4. Fenstergröße unter X11

mbedit unterstützt die automatische Umskalierung eines X11-Fensters. Dafür werden das Signal "SIGWINCH" und eine der Funktionen "tput" oder "resize" benötigt. Beide Features sind in den meisten unix/X11-Systemen vorhanden. Die entsprechende define-Konstante (WITH_WINCH) befindet sich im File "config.h" (siehe dort für Details).

10.5. Speicher-Verwaltung

Der editierte File wird immer komplett im Speicher gehalten. Bei Anwachsen des Speicherbedarfs wird dynamisch zusätzlicher Speicher vom Betriebssystem geholt, solange der Vorrat reicht. Die max. Filegröße ist also durch das Betriebssytem vorgegeben und liegt bei MS-DOS bei ca. 200 k Byte (grober Schätzwert). Es werden dynamisch verschiedene Buffer mit variabler Größe für folgende Daten angelegt: a. für den Daten-File selbst, b. für den sog. Other-File (auch mehrere) c. für die Kommandos "Buffer"/"Delete" d. für das Kommando "Get" <filename> (nur temporär) e. für die Macros Das Betriebssytem muß dafür ausreichend Speicherplatz bereithalten. Die Speicherbegrenzung von MS-DOS kann mit sog. DOS-Extendern wie z.B. von Phar Lap umgangen werden.

10.6. Interne Darstellung von Charactern

mbedit speichert die Character eines Datenfiles als Bytes ab. 'special keys' (Funktions- und Cursor-Tasten, ALT-Kombinationen) werden intern als negative Integer behandelt und vor Abspeicherung (z.B. in Macros) in '\'-Sequenzen umgesetzt (identisch mit Aedit). Bei der Eingabe von Strings (z.B. für 'Find') sind dieselben Spezial-Operationen wie bei Aedit möglich, also ^S, ^N, ^R. Dabei gibt es eine Ausnahme: Der Hex-Wert '\0' ist nicht verwendbar, da er intern als Endekennung des Strings benutzt wird. Nach 0x00 kann also nicht mit 'F'ind gesucht werden. Dafür kann aber 'H'ex 'F'ind benutzt werden. Auf den os/9- und unix-Umgebungen machte es große Schwierigkeiten, das ^S als Software-Handshake zu unterdrücken, und statt dessen zum Editor durchzureichen. Deshalb kann statt ^S auch ^V benutzt werden.

10.7. Maus-Unterstützung für MS-DOS

Ab Version 6.1 unterstützt mbedit den Maus-Treiber von MS-DOS. Beim Start des Programms testet mbedit, ob eine Maus am System verfügbar ist. Beim Verlassen von mbedit wird der Maus-Treiber wieder deaktiviert. Beide Aktionen benötigen einige Zeit, falls eine Maus angeschlossen ist. Wenn die Benutzung der Maus nicht geplant ist, kann die Initialisierung des Maus-Treibers abgeschaltet werden, um Zeit zu sparen. Dies wird mit dem Kommando "AM=0" in "MBEDIT.MAC" erreicht. (siehe auch Kapitel "Macro-File") Wenn die Maus aktiv ist, kann sie für mehrere Funktionen benutzt werden: - Der Maus-Zeiger erscheint auf dem Bildschirm, sobald die Maus bewegt oder eine der Maus-Tasten gedrückt wird. Er verschwindet wieder nach Eingabe einer beliebigen Taste auf der Tastatur. - Auf dem Standard-Text-Bildschirm - bzw. einem der 2 Fenster - kann der Maus-Zeiger auf jede Position des Text-Bereichs positioniert werden. Durch Drücken der linken Maus-Taste wird der Text-Cursor auf den Maus-Zeiger gesetzt. Es ist auch möglich, den Cursor hinter das Ende einer Zeile zu plazieren. - Wenn der Maus-Zeiger auf einer der Kanten des Bildschirms steht und die linke Muas-Taste festgehalten wird, rollt der Text in eine der 4 möglichen Richtungen. - Im der Betriebsart "Eingaben in Status-Zeile 2" kann der Cursor mit der Maus in beide Richtungen bewegt werden. Das Drücken der linken Maus-Taste bedeutet: Diese komplette Zeile übernehmen (wie bei <esc>). Die rechte Taste is gleichbedeutend mit ^C: Abbruch der Text-Eingabe. - Im History- oder File-Selection-Window wird mit der Maus die angewählte Zeile hoch und runter bewegt (entsprechend Cursor Up/Down). Die linke Taste bedeutet: <cr> - diesen Eintrag übernehmen. Drücken der rechten Taste verläßt das Fenster (wie ^C). Beim Wechsel von einer Betriebsart zur vorherigen (z.B. vom History Window zurück zur Status-Zeile 2), wird die alte Cursor-Position wiederhergestellt.