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.