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 >
Text File  |  1990-09-26  |  14KB  |  327 lines

  1. Wozu hist ?
  2. ===========
  3.  
  4. Die Benutzeroberflaeche der Standard-Shell unter OS-9 ist einigermassen
  5. spartanisch:
  6.  
  7. - Tippfehler in Kommandozeilen sind nur mittels Backspace zu korrigieren,
  8.   was insbesondere dann aergerlich ist, wenn der Fehler am Beginn der
  9.   Befehlszeile liegt.
  10. - Soll ein frueherer Befehl unveraendert oder mit leichten Modifikationen
  11.   ausgefuehrt werden, muss er mit Ausnahme des letzten Befehls voll-
  12.   staendig neu eingegeben werden, ohne einen Zugriff auf die vorangegangenen
  13.   Kommandostrings zu haben.
  14.  
  15. Beiden Unzulaenglichkeiten soll das vorliegende Programm abhelfen. Es stellt
  16. sowohl einen Kommandozeilen-Editor als auch einen History-Mechanismus zur
  17. Verfuegung.
  18.  
  19. - Der Editor erlaubt Cursorbewegungen in der Befehlszeile, stellt Loesch-
  20.   funktionen zur Verfuegung und gibt die Moeglichkeit, zwischen Einfuege-
  21.   modus und Ueberschreibemodus umzuschalten.
  22.  
  23. - Der History-Mechanismus gestattet die Wiederholung und gegebenenfalls
  24.   Modifizierung eines vorangegangenen Befehls; dabei ist die Nacheditierung
  25.   der selektierten Kommandozeile moeglich. Der hier implementierte
  26.   History-Mechanismus ist von der Syntax her eng an die History der BSD-UNIX-
  27.   C-Shell angelehnt.
  28.  
  29. Die beiden Hauptbestandteile von 'hist' koennen - je nach Gewoehnung -
  30. unterschiedlich stark benutzt werden: Es ist moeglich, nur den Zeileneditor
  31. zu verwenden, indem keine Metazeichen fuer die History-Substitution einge-
  32. geben werden. Andererseits kann der intensive Gebrauch des History-Mechanismus
  33. viel Tipparbeit ersparen.
  34.  
  35.  
  36. Bedienung und Funktionsweise von 'hist'
  37. =======================================
  38.  
  39. Wird 'hist' ohne Parameter gestartet, wird die maximale History-Tiefe auf
  40. DEPTH_DEFAULT (32) gesetzt und die History in der Datei TRACE_DEFAULT ab-
  41. gelegt. Beide Defaults koennen in 'h_def.h' geaendert werden.
  42. Es ist jedoch moeglich, in beliebiger Reihenfolge die History-Tiefe und/oder
  43. den Namen des History-Files als Parameter mitzugeben. Damit koennen z.B.
  44. sitzungsbezogene History-Dateienaufgebaut werden, die bei Fortsetzung der
  45. jeweiligen Sitzung statt der Default-Datei benutzt werden koennen. Die
  46. History-Files sind im uebrigen so angelegt, dass sie z.B. mit 'list' aus-
  47. gegeben werden koennen.
  48. Nach dem Start des Programms wird zunaechst der History-File - sofern
  49. vorhanden - in ein Array eingelesen. Nach der Ausgabe eines Prompts mit der
  50. laufenden Befehlsnummer erwartet das Programm die Eingabe eines Kommandos,
  51. wobei hier vier Moeglichkeiten zu unterscheiden sind:
  52.  
  53. - Das Kommando ist LIST_HISTORY_CMD ('h'):
  54.     Die aufgelaufene History-Liste wird angezeigt, danach wird eine neue
  55.     Kommandoeingabe erwartet.
  56.  
  57. - Das Kommando ist END_HISTORY_CMD ('logout'):
  58.     'hist' wird beendet, der History-File bleibt erhalten.
  59.  
  60. - Das Kommando ist ein reines OS-9-Kommando:
  61.     Das Kommando wird unmittelbar zur Ausfuehrung gebracht.
  62.  
  63. - Das Kommando enthaelt die Metazeichen CMD_LEADIN ('+') und/oder
  64.   DELIMITER ('^'):
  65.     Das Kommando wird mittels der weiter unten beschriebenen Funktion
  66.     "expand ()" expandiert; anschliessend besteht fuer den Benutzer die
  67.     Moeglichkeit, das Ergebnis nachzueditieren oder durch ein einfaches
  68.     'Return' das Kommando zur Ausfuehrung zu bringen. Dass eine Expansion
  69.     stattgefunden hat und beim Nacheditieren keine Metazeichen mehr einge-
  70.     geben werden sollten, ist am veraenderten Prompt festzustellen.
  71.  
  72. Sowohl zur Kommandoeingabe als auch zum Nacheditieren wird der weiter unten
  73. beschriebene Zeileneditor "edit_line ()" verwendet.
  74.  
  75.  
  76. Der Zeileneditor
  77. ================
  78.  
  79. Bei der Eingabe von Befehlszeilen unter der OS-9-Shell steht im wesentlichen
  80. nur die Moeglichkeit zur Verfuegung, das letzte Zeichen oder die gesamte bis
  81. dahin eingegebene Zeile zu loeschen. Mit dem hier beschriebenen Zeileneditor
  82. lassen sich nunmehr Cursorbewegungen ausfuehren, Zeichen und Worte loeschen
  83. und neue Zeichen einfuegen.
  84.  
  85. Folgende Moeglichkeiten stehen zur Verfuegung:
  86. - Cursor um ein Zeichen nach rechts / links
  87. - Cursor um ein Wort nach rechts / links
  88. - Cursor an den Zeilenanfang / an das Zeilenende
  89. - Zeichen loeschen an der Cursorposition / links davon
  90. - Wort rechts loeschen
  91. - bis Zeilenende loeschen
  92. - Einfuegen ein / aus
  93.  
  94. Die Funktionen werden jeweils durch ein Control-Zeichen ausgeloest. Im vor-
  95. liegenden Programm sind die Steuerzeichen an die IBM-kompatible Tastatur des
  96. mc68000 angepasst; soweit mit einem einzelnen Control-Zeichen moeglich,
  97. lassen sich die Funktionen auch ueber die Wordstar-Steuerzeichen aufrufen:
  98.  
  99. Funktion                             Taste       Hex     #define
  100. ----------------------------------------------------------------------
  101. Cursor 1 Zeichen nach links          <-          1D      IN1_C_LEFT
  102.                                      ^S          13      IN2_C_LEFT
  103. Cursor 1 Zeichen nach rechts         ->          1C      IN1_C_RIGHT
  104.                                      ^D          04      IN2_C_RIGHT
  105. Cursor 1 Wort nach links             ^A          01      IN_W_LEFT
  106. Cursor 1 Wort nach rechts            ^F          06      IN_W_RIGHT
  107. Cursor an den Zeilenanfang           Home        0B      IN_START_OF_L
  108. Cursor an das Zeilenende             End         11      IN_EOL
  109. Zeichen links loeschen               <--         08      IN_DEL_LEFT
  110. aktuelles Zeichen loeschen           Del         7F      IN_DEL_AKT
  111. Wort rechts loeschen                 <Crsr down> 1F      IN1_DEL_WORD
  112.                                      ^T          14      IN2_DEL_WORD
  113. bis Zeilenende loeschen              PgDn        18      IN_DEL_EOL
  114. Insert-Toggle                        Ins         10      IN1_INSERT
  115.                                      ^V          16      IN2_INSERT
  116.  
  117. Eine Anpassung der Steuerzeichen an andere Tastaturen oder Gewohnheiten
  118. ist leicht in 'h_edidef.h' vorzunehmen.
  119. Die Eingabe einer Zeile wird - unabhaengig von der Cursorposition - mit der
  120. Returntaste abgeschlossen.
  121.  
  122.  
  123. Der History-Mechanismus
  124. =======================
  125.  
  126. Waehrend einer Terminalsitzung kommt es recht haeufig vor, dass Befehle
  127. identisch oder auch in abgewandelter Form wiederholt werden muessen -
  128. z.B. mit neuem Kommando, aber gleichen Parametern. Dazu dient der der
  129. BSD-UNIX-C-Shell nachgebildete History-Mechanismus, der im vorliegenden
  130. Programm in der Funktion "expand ()" realisiert ist:
  131.  
  132. Der Eingabestring wird daraufhin untersucht, ob er Metazeichen enthaelt, die
  133. bewirken, dass vorhergehende Kommandos oder Teile davon in die aktuelle
  134. Kommandozeile uebernommen werden. Eine solche Referenz auf einen vorherigen
  135. Befehl beginnt im Normalfall mit dem Zeichen CMD_LEADIN ('+'). Darauf folgt
  136. die Kommandoselektion entweder
  137.  
  138. - absolut mittels der Kommandonummer,
  139. - relativ mittels des negativen Offsets von der aktuellen Befehlsnummer
  140.   aus   oder
  141. - durch Stringvergleich mit dem Beginn der vorherigen Kommandozeilen, vom
  142.   juengsten Befehl aus rueckwaerts suchend.
  143.  
  144. Daran schliesst sich die optionale Feldselektion an, die mit FIELD_LEADIN
  145. (':') beginnt. Darauf folgt die Angabe der auszuwaehlenden Feldnummer (n1)
  146. bzw. des Bereiches (n1-n2), wobei die Zaehlung der Felder bei Null beginnt.
  147. n2 kann auch das Zeichen LAST_FIELD ('$') sein und bezeichnet das letzte Feld
  148. des selektierten Kommandos. Welche Zeichen als Trennzeichen zwischen Feldern
  149. gelten sollen, ist in FIELD_SEPARATORS (' ;&!><#^') definiert.
  150.  
  151. Alternativ zur Feldselektion kann auch die Ersetzfunktion aktiviert werden.
  152. Auch sie beginnt mit dem Zeichen FIELD_LEADIN (':'), wird dann jedoch gefolgt
  153. von dem Zeichen SINGLE_EXCHANGE ('s') oder GLOBAL_EXCHANGE ('g'), je nachdem,
  154. ob nur das erste Vorkommen des Suchstrings ersetzt werden soll, oder ob
  155. globales Suchen und Ersetzen in der selektierten Kommandozeile gewuenscht ist.
  156. Das danach folgende Zeichen wird als Delimiter sowohl fuer den Such- als auch
  157. fuer den Ersetzstring betrachtet, die in dieser Reihenfolge - durch den
  158. Delimiter getrennt - erwartet werden.
  159.  
  160. Ist die Selektion abgeschlossen, wird das referenzierte Kommando bzw. die
  161. ausgewaehlten Teile davon statt der Referenz in den Eingabestring ein-
  162. gefuegt:
  163.  
  164. - Es ist weder Feldselektion noch Ersetzung gefordert: Das gesamte Kommando
  165.   wird uebertragen.
  166. - Bei Feldselektion werden nur die ausgewaehlten Felder (bzw. das einzelne
  167.   Feld) uebertragen.
  168. - Bei Ersetzung wird das gesamte Kommando uebertragen (nach - ggf. globalem -
  169.   Austausch des Suchstrings durch den Ersetzstring).
  170.  
  171. Im Anschluss an eine solche History-Referenz koennen weiterer Kommandotext
  172. und/oder weiter Referenzen stehen.
  173.  
  174.  
  175. Beispiele:
  176. ==========
  177.  
  178. Es sei folgende History aufgelaufen:
  179.  
  180.       5  copy /h0/b1xyz.abc /d0/prog1.c
  181.       6  dir /d1/p*.c
  182.       7  cc -f=/r0/affe affe.c -g -i
  183.       8  copy -w=/r0/TEST /d0/SRC/h_*.*
  184.       9  /h0/TEST/dump t1.c
  185.      10  r79 prog5 -l -s >/p0
  186.      11
  187.  
  188. Eingabe            Resultat
  189. --------------------------------------------------
  190. +-2                /h0/TEST/dump t1.c
  191. +8                 copy -w=/r0/TEST /d0/SRC/h_*.*
  192. +c                 copy -w=/r0/TEST /d0/SRC/h_*.*
  193. del +6:1           del /d1/p*.c
  194. +6:0 +/:1          dir t1.c
  195. +8:s/d0/h0/ -v     copy -w=/r0/TEST /h0/SRC/h_*.* -v
  196. +-6:g.1.2.         copy /h0/b2xyz.abc /d0/prog2.c
  197. r68 +10:1-$        r68 prog5 -l -s >/p0
  198.  
  199.  
  200. Zur Vereinfachung sind noch einige abkuerzende Schreibweisen moeglich:
  201.  
  202. - Die Symbole FIRST_FIELD ('^'), LAST_FIELD ('$') und ALL_FIELDS ('*')
  203.   selektieren den ersten, letzten bzw. alle Parameter des ausgewaehlten
  204.   Befehls. Diese Symbole koennen auch ohne FIELD_LEADIN (':') nach einer
  205.   numerischen Kommandoselektion benutzt werden:
  206.  
  207.   Eingabe            Resultat
  208.   --------------------------------------------------
  209.   del +6^            del /d1/p*.c
  210.   dir +c:$           dir /d0/SRC/h_*.*
  211.   r68 +-1*           r68 prog5 -l -s >/p0
  212.  
  213. - Das verdoppelte CMD_LEADIN ('++') selektiert den vorhergehenden Befehl.
  214.   Gleiches gilt fuer das einfache CMD_LEADIN ('+'), falls ihm unmittelbar
  215.   eines der Zeichen FIELD_LEADIN (':'), FIRST_FIELD ('^'), LAST_FIELD ('$')
  216.   oder ALL_FIELDS ('*') folgt oder es das letzte Zeichen der Eingabezeile ist:
  217.  
  218.   Eingabe            Resultat
  219.   --------------------------------------------------
  220.   ++ ; dir -l        r79 prog5 -l -s >/p0 ; dir -l
  221.   r68 +*             r68 prog5 -l -s >/p0
  222.   +                  r79 prog5 -l -s >/p0
  223.  
  224. - Falls das erste Zeichen der Eingabezeile ein DELIMITER ('^') ist, wird
  225.   damit die Ersetzfunktion in der vorhergehenden Zeile eingeleitet, wobei
  226.   DELIMITER ('^') als Begrenzungszeichen dient. Es wird nur das erste Vor-
  227.   kommen des Suchstrings ersetzt (entspricht: '+-1:s^...^...^').
  228.   Falls der abschliessende Delimiter das letzte Zeichen der Eingabezeile
  229.   ist, kann er auch fortgelassen werden.
  230.  
  231.   Eingabe            Resultat
  232.   --------------------------------------------------
  233.   ^79^68^            r68 prog5 -l -s >/p0
  234.   ^-l^^              r79 prog5 -s >/p0
  235.   ^79^68             r68 prog5 -l -s >/p0
  236.   ^-l^               r79 prog5 -s >/p0
  237.   ^p^t               r79 trog5 -l -s >/p0
  238.  
  239.  
  240. Die genaue Syntax einer Eingabezeile kann dem Anhang entnommen werden.
  241.  
  242. Das Zeichen CMD_LEADIN ('+') entspricht in der BSD-UNIX-C-Shell dem Symbol '!',
  243. wurde hier aber abweichend davon zu '+' gesetzt, da unter OS-9 das Zeichen '!'
  244. als Pipesymbol verwendet wird.
  245. Durch Voranstellen des CHAR_ESCAPE ('\') vor ein Metazeichen kann ihm seine
  246. besondere Bedeutung genommen werden (wie von C her bekannt).
  247.  
  248.  
  249.  
  250.  
  251.                              A N H A N G 
  252.                             =============
  253.  
  254. Es bedeutet:
  255.   [ ]   optional
  256.   { }+  1-n - malige Wiederholung
  257.   { }*  0-n - malige Wiederholung
  258.   |     trennt Alternativen
  259.  
  260.  
  261. Syntax fuer Eingabezeilen:
  262.  
  263. <Eingabestring>       ::=   DELIMITER <Suchstring> DELIMITER <Ersetzstring>
  264.                               [ DELIMITER [ <string> ] ]
  265.                           | <String>
  266.  
  267. <Suchstring>          ::=   { <Char \ Delimiter> }+
  268.  
  269. <Char \ Delimiter>    ::=   druckbares Zeichen mit Ausnahme des unmittelbar
  270.                             vor <Suchstring> stehenden Zeichens
  271.  
  272. <Ersetzstring>        ::=   { <Char \ Delimiter> }*
  273.  
  274. <String>              ::=   { <simple String> | <Metastring> }+
  275.  
  276. <simple String>       ::=   { <Char \ Metachar> }+
  277.  
  278. <Char \ Metachar>     ::=   druckbares Zeichen mit Ausnahme von
  279.                             CHAR_ESCAPE ('\') und CMD_LEADIN ('+')
  280.  
  281. <Metastring>          ::=   CHAR_ESCAPE <Char>
  282.                           | CMD_LEADIN <Selektion>
  283.  
  284. <Char>                ::=   druckbares Zeichen
  285.  
  286. <Selektion>           ::=   <Kommnadoselektion> <Modifikation>
  287.  
  288. <Kommandoselektion>   ::=   <empty>
  289.                           | [ '-' ] <Nummer>
  290.                           | <Vergleichsstring>
  291.                           | CMD_LEADIN
  292.  
  293. <empty>               ::=   leere Zeichenkette
  294.  
  295. <Nummer>              ::=   { <Digit> }+
  296.  
  297. <Digit>               ::=   '0' | '1' | '2' | '3' | '4'
  298.                           | '5' | '6' | '7' | '8' | '9'
  299.  
  300. <Vergleichsstring>    ::=   { <Char \ Endchar> }+
  301.  
  302. <Char \ Endchar>      ::=   druckbares Zeichen mit Ausnahme von ' ',
  303.                             CHAR_ESCAPE ('\'), CMD_LEADIN ('+') und
  304.                             FIELD_LEADIN (':')
  305.  
  306. <Modifikation>        ::=   <Feldselektion> | <Ersetzung>
  307.  
  308. <Feldselektion>       ::=   <empty>
  309.                           | <special field>
  310.                           | FIELD_LEADIN <Feldbereich>
  311.  
  312. <special field>       ::=   FIRST_FIELD | LAST_FIELD | ALL_FIELDS
  313.  
  314. <Feldbereich>         ::=   <special field>
  315.                           | <Nummer> [ FROM_TO <end field> ]
  316.  
  317. <end field>           ::=   <Nummer> | LAST_FIELD
  318.  
  319. <Ersetzung>           ::=   FIELD_LEADIN <Ersetzungstyp> <Delimiter>
  320.                             <Suchstring> <Delimiter> <Ersetzstring>
  321.                             [ <Delimiter> }
  322.  
  323. <Ersetzungstyp>       ::=   SINGLE_EXCHANGE | GLOBAL_EXCHANGE
  324.  
  325. <Delimiter>           ::=   <Char>
  326.  
  327.