home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
rtsi.com
/
2014.01.www.rtsi.com.tar
/
www.rtsi.com
/
OS9
/
OSK
/
EFFO
/
forum14.lzh
/
SOFTWARE
/
C
/
HIST
/
hist.doc
< prev
next >
Wrap
Text File
|
1990-09-26
|
14KB
|
327 lines
Wozu hist ?
===========
Die Benutzeroberflaeche der Standard-Shell unter OS-9 ist einigermassen
spartanisch:
- Tippfehler in Kommandozeilen sind nur mittels Backspace zu korrigieren,
was insbesondere dann aergerlich ist, wenn der Fehler am Beginn der
Befehlszeile liegt.
- Soll ein frueherer Befehl unveraendert oder mit leichten Modifikationen
ausgefuehrt werden, muss er mit Ausnahme des letzten Befehls voll-
staendig neu eingegeben werden, ohne einen Zugriff auf die vorangegangenen
Kommandostrings zu haben.
Beiden Unzulaenglichkeiten soll das vorliegende Programm abhelfen. Es stellt
sowohl einen Kommandozeilen-Editor als auch einen History-Mechanismus zur
Verfuegung.
- Der Editor erlaubt Cursorbewegungen in der Befehlszeile, stellt Loesch-
funktionen zur Verfuegung und gibt die Moeglichkeit, zwischen Einfuege-
modus und Ueberschreibemodus umzuschalten.
- Der History-Mechanismus gestattet die Wiederholung und gegebenenfalls
Modifizierung eines vorangegangenen Befehls; dabei ist die Nacheditierung
der selektierten Kommandozeile moeglich. Der hier implementierte
History-Mechanismus ist von der Syntax her eng an die History der BSD-UNIX-
C-Shell angelehnt.
Die beiden Hauptbestandteile von 'hist' koennen - je nach Gewoehnung -
unterschiedlich stark benutzt werden: Es ist moeglich, nur den Zeileneditor
zu verwenden, indem keine Metazeichen fuer die History-Substitution einge-
geben werden. Andererseits kann der intensive Gebrauch des History-Mechanismus
viel Tipparbeit ersparen.
Bedienung und Funktionsweise von 'hist'
=======================================
Wird 'hist' ohne Parameter gestartet, wird die maximale History-Tiefe auf
DEPTH_DEFAULT (32) gesetzt und die History in der Datei TRACE_DEFAULT ab-
gelegt. Beide Defaults koennen in 'h_def.h' geaendert werden.
Es ist jedoch moeglich, in beliebiger Reihenfolge die History-Tiefe und/oder
den Namen des History-Files als Parameter mitzugeben. Damit koennen z.B.
sitzungsbezogene History-Dateienaufgebaut werden, die bei Fortsetzung der
jeweiligen Sitzung statt der Default-Datei benutzt werden koennen. Die
History-Files sind im uebrigen so angelegt, dass sie z.B. mit 'list' aus-
gegeben werden koennen.
Nach dem Start des Programms wird zunaechst der History-File - sofern
vorhanden - in ein Array eingelesen. Nach der Ausgabe eines Prompts mit der
laufenden Befehlsnummer erwartet das Programm die Eingabe eines Kommandos,
wobei hier vier Moeglichkeiten zu unterscheiden sind:
- Das Kommando ist LIST_HISTORY_CMD ('h'):
Die aufgelaufene History-Liste wird angezeigt, danach wird eine neue
Kommandoeingabe erwartet.
- Das Kommando ist END_HISTORY_CMD ('logout'):
'hist' wird beendet, der History-File bleibt erhalten.
- Das Kommando ist ein reines OS-9-Kommando:
Das Kommando wird unmittelbar zur Ausfuehrung gebracht.
- Das Kommando enthaelt die Metazeichen CMD_LEADIN ('+') und/oder
DELIMITER ('^'):
Das Kommando wird mittels der weiter unten beschriebenen Funktion
"expand ()" expandiert; anschliessend besteht fuer den Benutzer die
Moeglichkeit, das Ergebnis nachzueditieren oder durch ein einfaches
'Return' das Kommando zur Ausfuehrung zu bringen. Dass eine Expansion
stattgefunden hat und beim Nacheditieren keine Metazeichen mehr einge-
geben werden sollten, ist am veraenderten Prompt festzustellen.
Sowohl zur Kommandoeingabe als auch zum Nacheditieren wird der weiter unten
beschriebene Zeileneditor "edit_line ()" verwendet.
Der Zeileneditor
================
Bei der Eingabe von Befehlszeilen unter der OS-9-Shell steht im wesentlichen
nur die Moeglichkeit zur Verfuegung, das letzte Zeichen oder die gesamte bis
dahin eingegebene Zeile zu loeschen. Mit dem hier beschriebenen Zeileneditor
lassen sich nunmehr Cursorbewegungen ausfuehren, Zeichen und Worte loeschen
und neue Zeichen einfuegen.
Folgende Moeglichkeiten stehen zur Verfuegung:
- Cursor um ein Zeichen nach rechts / links
- Cursor um ein Wort nach rechts / links
- Cursor an den Zeilenanfang / an das Zeilenende
- Zeichen loeschen an der Cursorposition / links davon
- Wort rechts loeschen
- bis Zeilenende loeschen
- Einfuegen ein / aus
Die Funktionen werden jeweils durch ein Control-Zeichen ausgeloest. Im vor-
liegenden Programm sind die Steuerzeichen an die IBM-kompatible Tastatur des
mc68000 angepasst; soweit mit einem einzelnen Control-Zeichen moeglich,
lassen sich die Funktionen auch ueber die Wordstar-Steuerzeichen aufrufen:
Funktion Taste Hex #define
----------------------------------------------------------------------
Cursor 1 Zeichen nach links <- 1D IN1_C_LEFT
^S 13 IN2_C_LEFT
Cursor 1 Zeichen nach rechts -> 1C IN1_C_RIGHT
^D 04 IN2_C_RIGHT
Cursor 1 Wort nach links ^A 01 IN_W_LEFT
Cursor 1 Wort nach rechts ^F 06 IN_W_RIGHT
Cursor an den Zeilenanfang Home 0B IN_START_OF_L
Cursor an das Zeilenende End 11 IN_EOL
Zeichen links loeschen <-- 08 IN_DEL_LEFT
aktuelles Zeichen loeschen Del 7F IN_DEL_AKT
Wort rechts loeschen <Crsr down> 1F IN1_DEL_WORD
^T 14 IN2_DEL_WORD
bis Zeilenende loeschen PgDn 18 IN_DEL_EOL
Insert-Toggle Ins 10 IN1_INSERT
^V 16 IN2_INSERT
Eine Anpassung der Steuerzeichen an andere Tastaturen oder Gewohnheiten
ist leicht in 'h_edidef.h' vorzunehmen.
Die Eingabe einer Zeile wird - unabhaengig von der Cursorposition - mit der
Returntaste abgeschlossen.
Der History-Mechanismus
=======================
Waehrend einer Terminalsitzung kommt es recht haeufig vor, dass Befehle
identisch oder auch in abgewandelter Form wiederholt werden muessen -
z.B. mit neuem Kommando, aber gleichen Parametern. Dazu dient der der
BSD-UNIX-C-Shell nachgebildete History-Mechanismus, der im vorliegenden
Programm in der Funktion "expand ()" realisiert ist:
Der Eingabestring wird daraufhin untersucht, ob er Metazeichen enthaelt, die
bewirken, dass vorhergehende Kommandos oder Teile davon in die aktuelle
Kommandozeile uebernommen werden. Eine solche Referenz auf einen vorherigen
Befehl beginnt im Normalfall mit dem Zeichen CMD_LEADIN ('+'). Darauf folgt
die Kommandoselektion entweder
- absolut mittels der Kommandonummer,
- relativ mittels des negativen Offsets von der aktuellen Befehlsnummer
aus oder
- durch Stringvergleich mit dem Beginn der vorherigen Kommandozeilen, vom
juengsten Befehl aus rueckwaerts suchend.
Daran schliesst sich die optionale Feldselektion an, die mit FIELD_LEADIN
(':') beginnt. Darauf folgt die Angabe der auszuwaehlenden Feldnummer (n1)
bzw. des Bereiches (n1-n2), wobei die Zaehlung der Felder bei Null beginnt.
n2 kann auch das Zeichen LAST_FIELD ('$') sein und bezeichnet das letzte Feld
des selektierten Kommandos. Welche Zeichen als Trennzeichen zwischen Feldern
gelten sollen, ist in FIELD_SEPARATORS (' ;&!><#^') definiert.
Alternativ zur Feldselektion kann auch die Ersetzfunktion aktiviert werden.
Auch sie beginnt mit dem Zeichen FIELD_LEADIN (':'), wird dann jedoch gefolgt
von dem Zeichen SINGLE_EXCHANGE ('s') oder GLOBAL_EXCHANGE ('g'), je nachdem,
ob nur das erste Vorkommen des Suchstrings ersetzt werden soll, oder ob
globales Suchen und Ersetzen in der selektierten Kommandozeile gewuenscht ist.
Das danach folgende Zeichen wird als Delimiter sowohl fuer den Such- als auch
fuer den Ersetzstring betrachtet, die in dieser Reihenfolge - durch den
Delimiter getrennt - erwartet werden.
Ist die Selektion abgeschlossen, wird das referenzierte Kommando bzw. die
ausgewaehlten Teile davon statt der Referenz in den Eingabestring ein-
gefuegt:
- Es ist weder Feldselektion noch Ersetzung gefordert: Das gesamte Kommando
wird uebertragen.
- Bei Feldselektion werden nur die ausgewaehlten Felder (bzw. das einzelne
Feld) uebertragen.
- Bei Ersetzung wird das gesamte Kommando uebertragen (nach - ggf. globalem -
Austausch des Suchstrings durch den Ersetzstring).
Im Anschluss an eine solche History-Referenz koennen weiterer Kommandotext
und/oder weiter Referenzen stehen.
Beispiele:
==========
Es sei folgende History aufgelaufen:
5 copy /h0/b1xyz.abc /d0/prog1.c
6 dir /d1/p*.c
7 cc -f=/r0/affe affe.c -g -i
8 copy -w=/r0/TEST /d0/SRC/h_*.*
9 /h0/TEST/dump t1.c
10 r79 prog5 -l -s >/p0
11
Eingabe Resultat
--------------------------------------------------
+-2 /h0/TEST/dump t1.c
+8 copy -w=/r0/TEST /d0/SRC/h_*.*
+c copy -w=/r0/TEST /d0/SRC/h_*.*
del +6:1 del /d1/p*.c
+6:0 +/:1 dir t1.c
+8:s/d0/h0/ -v copy -w=/r0/TEST /h0/SRC/h_*.* -v
+-6:g.1.2. copy /h0/b2xyz.abc /d0/prog2.c
r68 +10:1-$ r68 prog5 -l -s >/p0
Zur Vereinfachung sind noch einige abkuerzende Schreibweisen moeglich:
- Die Symbole FIRST_FIELD ('^'), LAST_FIELD ('$') und ALL_FIELDS ('*')
selektieren den ersten, letzten bzw. alle Parameter des ausgewaehlten
Befehls. Diese Symbole koennen auch ohne FIELD_LEADIN (':') nach einer
numerischen Kommandoselektion benutzt werden:
Eingabe Resultat
--------------------------------------------------
del +6^ del /d1/p*.c
dir +c:$ dir /d0/SRC/h_*.*
r68 +-1* r68 prog5 -l -s >/p0
- Das verdoppelte CMD_LEADIN ('++') selektiert den vorhergehenden Befehl.
Gleiches gilt fuer das einfache CMD_LEADIN ('+'), falls ihm unmittelbar
eines der Zeichen FIELD_LEADIN (':'), FIRST_FIELD ('^'), LAST_FIELD ('$')
oder ALL_FIELDS ('*') folgt oder es das letzte Zeichen der Eingabezeile ist:
Eingabe Resultat
--------------------------------------------------
++ ; dir -l r79 prog5 -l -s >/p0 ; dir -l
r68 +* r68 prog5 -l -s >/p0
+ r79 prog5 -l -s >/p0
- Falls das erste Zeichen der Eingabezeile ein DELIMITER ('^') ist, wird
damit die Ersetzfunktion in der vorhergehenden Zeile eingeleitet, wobei
DELIMITER ('^') als Begrenzungszeichen dient. Es wird nur das erste Vor-
kommen des Suchstrings ersetzt (entspricht: '+-1:s^...^...^').
Falls der abschliessende Delimiter das letzte Zeichen der Eingabezeile
ist, kann er auch fortgelassen werden.
Eingabe Resultat
--------------------------------------------------
^79^68^ r68 prog5 -l -s >/p0
^-l^^ r79 prog5 -s >/p0
^79^68 r68 prog5 -l -s >/p0
^-l^ r79 prog5 -s >/p0
^p^t r79 trog5 -l -s >/p0
Die genaue Syntax einer Eingabezeile kann dem Anhang entnommen werden.
Das Zeichen CMD_LEADIN ('+') entspricht in der BSD-UNIX-C-Shell dem Symbol '!',
wurde hier aber abweichend davon zu '+' gesetzt, da unter OS-9 das Zeichen '!'
als Pipesymbol verwendet wird.
Durch Voranstellen des CHAR_ESCAPE ('\') vor ein Metazeichen kann ihm seine
besondere Bedeutung genommen werden (wie von C her bekannt).
A N H A N G
=============
Es bedeutet:
[ ] optional
{ }+ 1-n - malige Wiederholung
{ }* 0-n - malige Wiederholung
| trennt Alternativen
Syntax fuer Eingabezeilen:
<Eingabestring> ::= DELIMITER <Suchstring> DELIMITER <Ersetzstring>
[ DELIMITER [ <string> ] ]
| <String>
<Suchstring> ::= { <Char \ Delimiter> }+
<Char \ Delimiter> ::= druckbares Zeichen mit Ausnahme des unmittelbar
vor <Suchstring> stehenden Zeichens
<Ersetzstring> ::= { <Char \ Delimiter> }*
<String> ::= { <simple String> | <Metastring> }+
<simple String> ::= { <Char \ Metachar> }+
<Char \ Metachar> ::= druckbares Zeichen mit Ausnahme von
CHAR_ESCAPE ('\') und CMD_LEADIN ('+')
<Metastring> ::= CHAR_ESCAPE <Char>
| CMD_LEADIN <Selektion>
<Char> ::= druckbares Zeichen
<Selektion> ::= <Kommnadoselektion> <Modifikation>
<Kommandoselektion> ::= <empty>
| [ '-' ] <Nummer>
| <Vergleichsstring>
| CMD_LEADIN
<empty> ::= leere Zeichenkette
<Nummer> ::= { <Digit> }+
<Digit> ::= '0' | '1' | '2' | '3' | '4'
| '5' | '6' | '7' | '8' | '9'
<Vergleichsstring> ::= { <Char \ Endchar> }+
<Char \ Endchar> ::= druckbares Zeichen mit Ausnahme von ' ',
CHAR_ESCAPE ('\'), CMD_LEADIN ('+') und
FIELD_LEADIN (':')
<Modifikation> ::= <Feldselektion> | <Ersetzung>
<Feldselektion> ::= <empty>
| <special field>
| FIELD_LEADIN <Feldbereich>
<special field> ::= FIRST_FIELD | LAST_FIELD | ALL_FIELDS
<Feldbereich> ::= <special field>
| <Nummer> [ FROM_TO <end field> ]
<end field> ::= <Nummer> | LAST_FIELD
<Ersetzung> ::= FIELD_LEADIN <Ersetzungstyp> <Delimiter>
<Suchstring> <Delimiter> <Ersetzstring>
[ <Delimiter> }
<Ersetzungstyp> ::= SINGLE_EXCHANGE | GLOBAL_EXCHANGE
<Delimiter> ::= <Char>