home *** CD-ROM | disk | FTP | other *** search
/ Simtel MSDOS 1992 December / simtel1292_SIMTEL_1292_Walnut_Creek.iso / msdos / keyboard / recall.arc / RECALL.DOC < prev   
Text File  |  1989-10-15  |  37KB  |  772 lines

  1.  
  2.                            Command Line RECALL  2.1
  3.  
  4.           Resident Interrupt Handler for DOS Buffered Keyboard Input
  5.  
  6.                                 (c) Roger Roth
  7.                                   PO Box 840
  8.                           West Jordan, UT 84084-0840
  9.  
  10.                             CompuServ: 70431,2513
  11.  
  12.                     No Fee for Use, Not for Sale or Resale
  13.  
  14.  
  15. ---------------------------------- Contents ---------------------------------
  16.  
  17.   Introduction
  18.     - Features
  19.   Installation
  20.     - Installing on a Hard Disk
  21.     - Installing in Memory
  22.   Command History
  23.     - Buffer 1 vs. Buffer 2
  24.     - <UpArrow> and <DownArrow> Keys
  25.     - Listing History
  26.     - Fetching Old Commands by Number
  27.     - Searching for a Command Fragment
  28.   Line Editing
  29.     - Moving the Cursor
  30.     - Deleting Characters
  31.     - Toggling Insert Mode
  32.     - Two Methods of Backspacing
  33.   DOS Compatibility
  34.     - Function Keys
  35.     - The Template
  36.     - Inserting Control Characters
  37.   Command Line Options
  38.     - Changing Defaults
  39.     - Redefining Keys
  40.   Aliasing
  41.     - Creating Aliases
  42.     - Using Aliases
  43.   Function Key Macros
  44.     - Defining Function Key Macros
  45.     - Executing Function Key Macros
  46.   Environment Substitution
  47.   Environment Completion
  48.   Filename and Dirname Completion
  49.   Technical Notes
  50.     - Calling from Assembly Language
  51.     - Calling from C Language
  52.     - Internals
  53.     - DOS Environment
  54.  
  55.  
  56. -------------------------------- Introduction -------------------------------
  57.  
  58. Command Line RECALL is a Terminate and Stay Resident (TSR) program that 
  59. provides recall and full editing of previously entered commands.  The user 
  60. can move the cursor, insert, and delete, while the entire command line is in 
  61. view.  When a command is entered, it is saved in a History Buffer so that it 
  62. can be recalled at a later time for reuse or revision.  
  63.  
  64. Only part of RECALL.COM becomes memory resident.  Much of its executable code 
  65. is used to process the many options available after memory install.  
  66. RECALL.COM can be executed over and over again without reinstalling itself in 
  67. memory.  
  68.  
  69. The following features are supported by Command Line RECALL: 
  70.    - Retrieve previously entered commands with <UpArrow> and <DownArrow>.
  71.    - Display a list of previously entered commands.
  72.    - Retrieve previously entered commands by number.
  73.    - Retrieve previously entered commands by searching for a string.
  74.    - Two separate command line buffers, one for DOS and one for programs that 
  75.      run under DOS, such as DEBUG and EDLIN.
  76.    - Control of memory usage, by specifying the size of both buffers.
  77.    - Most options can be set at or after memory install.
  78.    - The functions of many keys can be redefined.
  79.    - Aliases for frequently used commands.
  80.    - Function Key Macros.
  81.    - Environment Substitution and Completion.
  82.    - Filename and Dirname Completion.
  83.  
  84. Command Line RECALL tries not to be annoying: 
  85.    - Close compatibility with regular DOS command line editing.
  86.    - Video parameters, including cursor size and display colors, are never 
  87.      changed.
  88.    - Screen sizes other than 25 x 80 are detected and taken advantage of.
  89.    - No case sensitivity, all options and Environment Variable strings can be 
  90.      entered in either upper or lower case.
  91.    - An exact match of the previously entered command will not be added to 
  92.      the History Buffer.
  93.    - History Buffers are non-circular.  Repeated <UpArrow>s will stop at the 
  94.      oldest command.  Repeated <DownArrow>s will stop at the newest command.
  95.  
  96.  
  97. -------------------------------- Installation -------------------------------
  98.  
  99. To access the many features of Command Line RECALL, it is necessary to copy 
  100. RECALL.COM to a subdirectory which is on the PATH.  For example, if 
  101. RECALL.COM is on a diskette in the A: drive: 
  102.   C:\> path
  103.   PATH=C:\DOS;C:\UTILS;C:\WORDPROC;C:\WRKSHEET
  104.   C:\> copy  A:\RECALL.COM  C:\UTILS
  105.            1 File(s) copied
  106.  
  107. RECALL.COM becomes memory resident the first time it is run.  A short message 
  108. will be displayed with information about the amount of memory used.  To make 
  109. Command Line RECALL memory resident: 
  110.   A> RECALL
  111.  
  112. Once Command Line RECALL is installed in memory, it will stay in memory until 
  113. the computer is reset, <Ctrl-Alt-Del>.  
  114.  
  115. Most users will be happy with the defaults.  However, many users will want to 
  116. specify various options.  For example, to make Command Line RECALL memory 
  117. resident, but change some of the defaults: 
  118.   A> RECALL /SIZE1=2048 /INS+
  119.  
  120. To make Command Line RECALL memory resident each time the computer boots up, 
  121. install RECALL.COM into AUTOEXEC.BAT.  Edit the AUTOEXEC.BAT file, and add 
  122. one line (with or without options): 
  123.     RECALL  [/options]
  124.  
  125.  
  126. ------------------------------ Command History ------------------------------
  127.  
  128. Command Line RECALL maintains two separate History Buffers, one for DOS and 
  129. one for programs that run under DOS, such as DEBUG and EDLIN.  When working 
  130. with one buffer, the other will not be affected.  Throughout this document, 
  131. the following naming convention is used: 
  132.   'Buffer 1' is the History Buffer used for DOS command line editing.
  133.   'Buffer 2' is the History Buffer used by programs which run under DOS.
  134.  
  135. The following keys will retrieve previously entered commands: 
  136.     <UpArrow>              edit previous command
  137.     <DownArrow>            edit next command
  138.     <PgUp>                 edit oldest command
  139.     <PgDn>                 edit most recent command
  140.     <Ctrl-PgUp>            remove displayed command from History
  141.     <Ctrl-PgDn>            clear all History
  142.  
  143. The following commands will display History from Buffer 1: 
  144.   RECALL                   display last 20 commands (no parameters)
  145.   RECALL /ALL              display all commands, pausing every 20
  146.   RECALL /ALL /LOG >PRN    print all commands, no pause
  147.  
  148. The following commands will display History from Buffer 2: 
  149.   RECALL /2                display last 20 commands
  150.   RECALL /ALL2             display all commands, pausing every 20
  151.   RECALL /ALL2 /LOG >PRN   print all commands, no pause
  152.  
  153. Command Line RECALL actually displays commands (number of screen rows - 5) at 
  154. a time.  Since most users operate in 25 line mode, this document will claim 
  155. that commands are displayed 20 at a time.  
  156.  
  157. By default, the above commands display the command History from most recent 
  158. to oldest.  The default can be changed, History can be displayed from oldest 
  159. to most recent, with a 'RECALL /LIST-' command.  
  160.  
  161. The list commands mentioned above display a number next to each listed 
  162. command.  A previous command can be retrieved by referencing that number: 
  163.   RECALL  nn                recall command #nn
  164.  
  165. A previous command can be retrieved by doing a non case sensitive search for 
  166. a command fragment: 
  167.   RECALL  frag              recall previous command containing 'frag'
  168.  
  169. Ordinarily, when a command is entered, it is added to the History Buffer.  
  170. The following are exceptions: 
  171.    - The command is too short (as specified with a 'RECALL /TOOSHORT1=n' 
  172.      command).
  173.    - The command is an exact copy of the previously entered command.
  174.    - The command is a RECALL command with any list option (example: 
  175.      RECALL /ALL).
  176.    - The command is a successful RECALL search command, i.e. a RECALL command 
  177.      which brings back a previous command for editing.
  178.  
  179. Once a command is added to the History Buffer, it will stay there until one 
  180. of the following events occurs: 
  181.    - The History Buffer is full and room is needed to add a new command.
  182.      Older commands will be discarded to make room for newer commands.
  183.    - The command is deleted from the History Buffer with <Ctrl-PgUp>.
  184.    - The History Buffer is cleared with <Ctrl-PgDn>.
  185.    - The History Buffer is cleared with a 'RECALL /CLEAR' command.
  186.  
  187.  
  188. -------------------------------- Line Editing -------------------------------
  189.  
  190. Command Line RECALL provides the capability for full editing of the command 
  191. line with the entire command line visible.  Most of the keys described below 
  192. have similar use with all DOS programs.  
  193.  
  194. The following keys move the cursor: 
  195.     <LeftArrow>          move left one char
  196.     <RightArrow>         move right one char
  197.     <Ctrl-LeftArrow>     move left to beginning of word
  198.     <Ctrl-RightArrow>    move right to beginning of word
  199.     <Home>               move to left of line
  200.     <End>                move to right of line
  201.  
  202. The following keys delete characters: 
  203.     <Backspace>          delete char to left of cursor
  204.     <Ctrl-Backspace>     delete char to left of cursor, slide line left
  205.     <Del>                delete char at cursor
  206.     <Shift-Tab>          delete word left of cursor
  207.     <Ctrl-Home>          delete all chars left of cursor
  208.     <Ctrl-End>           delete all chars at cursor and right of cursor
  209.     <Ctrl-Enter>         delete all chars at cursor and right of cursor
  210.     <Esc>                delete entire line
  211.  
  212. The <Ins> key is used to temporarily toggle insert/overwrite mode.  However, 
  213. when <Enter> is pressed, Command Line RECALL goes back to its fixed mode 
  214. which is normally overwrite.  At any time, the fixed mode can be changed to 
  215. insert with a 'RECALL /INS+' command or back to overwrite with a 'RECALL 
  216. /INS-' command (see Command Line Options in this document).  
  217.  
  218. There are two different methods of backspacing.  Both methods delete the 
  219. character to the left of the cursor.  Both methods work identically in insert 
  220. mode or when the cursor is at the end of the line.  The difference can be 
  221. noticed in overwrite mode when the cursor is somewhere in the middle of the 
  222. line.  Method 1 will delete the character and replace it with a space.  
  223. Method 2 will delete the character and slide the line to the left.  By 
  224. default, <Backspace> uses method 1 and <Ctrl-Backspace> uses method 2.  If 
  225. method 2 is preferred, change the definition of the <Backspace> key (see 
  226. Defining Keys in this document).  
  227.  
  228.  
  229. ----------------------------- DOS Compatibility -----------------------------
  230.  
  231. The DOS operating system provides Buffered Keyboard Input, on the DOS command 
  232. line and to any program which wants to use it.  Command Line RECALL is a new 
  233. implementation of Buffered Keyboard Input.  <F1> through <F6> will work just 
  234. like they used to work with DOS: 
  235.     <F1>             one char from Template to current line
  236.     <F2> (+char)     chars from Template to current line until char matched
  237.     <F3>             rest of chars from Template to current line
  238.     <F4> (+char)     skip in Template until char matched
  239.     <F5>             copy current line to Template and to History Buffer
  240.     <F6>             end of file char, <Ctrl-Z> or ascii 26
  241.     <RightArrow>     works just like <F1>, when cursor is at end of line
  242.  
  243. To fully understand the DOS compatibility of Command Line RECALL, the 
  244. difference between the Template and the History Buffer should be clear.  When 
  245. a program (DOS, DEBUG, EDLIN, etc.) uses Buffered Keyboard Input, the program 
  246. must provide a buffer, the Template, for Buffered Keyboard Input to use.  The 
  247. Template is the communication link between programs and Buffered Keyboard 
  248. Input.  Regular DOS command line editing uses only the Template and no 
  249. History Buffers.  Command Line RECALL maintains its own History Buffers and 
  250. normally writes to the Template only when <Enter> is pressed.  However, <F1> 
  251. through <F6>, and in some cases <RightArrow>, cause Command Line RECALL to 
  252. access the Template.  
  253.  
  254. The inserting of control characters into the command line is accomplished 
  255. with a trick derived from a similar function of EDLIN, the DOS line editor.  
  256. To insert a control character into the command line, press <Ctrl-V>, then one 
  257. of the following keys: 
  258.  
  259.     key following <Ctrl-V>         ascii value inserted into command line
  260.     ----------------------         --------------------------------------
  261.     a through z                    ascii 1 through 26
  262.     A through Z                    ascii 1 through 26
  263.     [ \ ] ^ _                      ascii 27, 28, 29, 30, 31
  264.     =                              ascii 127
  265.  
  266.  
  267. ---------------------------- Command Line Options ---------------------------
  268.  
  269. Most users will find that Command Line RECALL works just fine with only 
  270. default options.  This section can be skipped for now and read at a later 
  271. time.  However, many options are available to customize to a user's needs.  
  272. Notice that all options except '/SIZE1=' and '/SIZE2=' can be set after 
  273. Command Line RECALL is memory resident.  
  274.  
  275. When Command Line RECALL is run with no options, one of three things can 
  276. happen: 
  277.   1)  The first time, it will become memory resident with default options.
  278.   2)  If disabled (see 'RECALL /OFF' command), it will reenable itself.
  279.   3)  Otherwise, the last 20 commands will be displayed.
  280.  
  281. Help: 
  282.   RECALL /?                display short help message
  283.  
  284. At Memory Install Only: 
  285.   RECALL /SIZE1=nnnnn      size of Buffer 1 (default 512)
  286.   RECALL /SIZE2=nnnnn      size of Buffer 2 (default 256)
  287.                                256 <= 'nnnnn' <= 16384
  288.  
  289. After Memory Install Only: 
  290.   RECALL /OFF              temporarily disable,
  291.                            use regular DOS command line editing
  292.   RECALL /ON               enable Command Line RECALL
  293.   RECALL /CLEAR            clear both command buffers
  294.   RECALL /CLEAR1           clear Buffer 1
  295.   RECALL /CLEAR2           clear Buffer 2
  296.  
  297. The '/OFF' option will leave Command Line RECALL resident in memory, but all 
  298. 'Buffered Keyboard Input' calls will be handled by DOS.  The '/ON' option 
  299. will reenable Command Line RECALL without using any more memory.  The 
  300. '/CLEAR' options will throw away all saved command History, but will not 
  301. change the size of either History Buffer.  
  302.  
  303. At or After Memory Install: 
  304.   RECALL /INS-             insert mode off, overwrite (default)
  305.   RECALL /INS+             insert mode on
  306.   RECALL /LIST-            list History backwards
  307.   RECALL /LIST+            list History forwards (default)
  308.   RECALL /ALIAS-           disable Aliasing
  309.   RECALL /ALIAS+           enable  Aliasing (default)
  310.   RECALL /ALIASCHR1=c      Aliasing char for Buffer 1 (default @)
  311.   RECALL /ALIASCHR2=c      Aliasing char for Buffer 2 (default #)
  312.   RECALL /TOOSHORT1=nn     don't save cmds of len <= nn in Buffer 1 (default 0)
  313.   RECALL /TOOSHORT2=nn     don't save cmds of len <= nn in Buffer 2 (default 3)
  314.   RECALL /FILEATTRIB=hh    File Completion search attribute (default 00 hex)
  315.   RECALL /DIRATTRIB=hh     Dir  Completion search attribute (default 10 hex)
  316.  
  317. After Memory Install, Displaying History from Buffer 1: 
  318.   RECALL                   display last 20 commands (no parameters)
  319.   RECALL /ALL              display all commands, pausing every 20
  320.   RECALL /ALL /LOG >PRN    print all commands (no pause)
  321.  
  322. After Memory Install, Displaying History from Buffer 2: 
  323.   RECALL /2                display last 20 commands
  324.   RECALL /ALL2             display all commands, pausing every 20
  325.   RECALL /ALL2 /LOG >PRN   print all commands (no pause)
  326.  
  327. Redefining Keys: 
  328.     RECALL   /key=function
  329.  
  330. The possible values for 'key' are listed in the left column below, and the 
  331. possible values for 'function' are listed in the second column below.  It so 
  332. happens that for each 'key' listed below, the default 'function' is listed to 
  333. its right.  The third column is a short description of the 'function'.  By 
  334. default, the last 'function' is not assigned to any 'key'.  The default 
  335. 'key's and 'function's are described elsewhere in this document.  Upper/lower 
  336. case, no difference.  
  337.  
  338.     key       function      description
  339.     ---       --------      -----------
  340.     UP        PrevCmd       edit previous command in History Buffer
  341.     DOWN      NextCmd       edit next command in History Buffer
  342.     LEFT      CharL         move left one char
  343.     RIGHT     CharR         move right one char
  344.     ^LEFT     WordL         move left to beginning of word
  345.     ^RIGHT    WordR         move right to beginning of word
  346.     HOME      BegLine       move to left of line
  347.     END       EndLine       move to right of line
  348.     ^HOME     DelLineL      delete chars left of cursor
  349.     ^END      DelLineR      delete chars at cursor and right of cursor
  350.     PGUP      FirstCmd      edit oldest command
  351.     PGDN      LastCmd       edit most recent command
  352.     ^PGUP     DelCmd        remove displayed command from History Buffer
  353.     ^PGDN     ClearHist     clear the History Buffer
  354.     INS       InsMode       toggle insert/overwrite mode
  355.     DEL       DelChar       delete char at cursor
  356.     F1        FOne          F1 function key (DOS compatible)
  357.     F2        FTwo          F2 function key (DOS compatible)
  358.     F3        FThree        F3 function key (DOS compatible)
  359.     F4        FFour         F4 function key (DOS compatible)
  360.     F5        FFive         F5 function key (DOS compatible)
  361.     F6        FSix          F6 function key (DOS compatible)
  362.     F7        Nothing       do nothing
  363.     F8        EnvCmpl       invoke Environment Completion
  364.     F9        DirCmpl       invoke Dirname Completion
  365.     F10       FilCmpl       invoke Filename Completion
  366.     BSP       BackSpace     delete char to left of cursor
  367.     ^BSP      BackSpace2    delete char to left of cursor, slide line left
  368.     BKTAB     DelWordL      delete word to left of cursor
  369.               DelWordR      delete word at cursor and right of cursor
  370.  
  371. Example, installing Command Line RECALL in memory with options: 
  372.   - insert mode on, instead of the default, overwrite
  373.   - redefine <Backspace> to use Backspace Method 2
  374.   - redefine <Ctrl-Backspace> to Delete Word Left
  375.   - Make Buffer 1 larger, 2 kilobytes, instead of the 512 byte default
  376.  
  377.       RECALL /INS+ /BSP=BackSpace2 /^BSP=DelWordL /SIZE1=2048
  378.  
  379. Example, changing options after Command Line RECALL is memory resident: 
  380.   - display History backwards
  381.   - save only commands 4 characters or longer in Buffer 1
  382.   - clear all History in Buffer 2
  383.   - disable Clear History function of <Ctrl-PgDn>
  384.  
  385.       RECALL /LIST- /TOOSHORT1=3 /clear2 /^PgDn=nothing
  386.  
  387. The first example above is valid only on first time use, because of the 
  388. '/SIZE1=' option.  The second example above is not valid for first time use, 
  389. because of the '/CLEAR2' option.  
  390.  
  391. The following examples give a clue as to how Command Line RECALL decides 
  392. whether to change options, or to search for a previously entered command, or 
  393. to display an error message: 
  394.  
  395.       RECALL /INS+ /LisTT-
  396. Command Line RECALL looks for mistakes before it takes any action.  The error 
  397. will be detected and an error message will be displayed.  The default insert 
  398. mode will not be changed.  
  399.  
  400.       RECALL /LisTT-
  401. Command Line RECALL sees no valid options in this command, so it will assume 
  402. that a search for a previous command containing command fragment, '/LISTT-', 
  403. is being requested.  If there is no matching previous command, a 'No Find' 
  404. error message will be displayed.  
  405.  
  406.       RECALL 94
  407. Command Line RECALL first looks for command #94.  If a 94th command is in the 
  408. History Buffer, it will be presented for editing.  Otherwise, a search for a 
  409. previous command containing command fragment, '94', will be conducted.  If 
  410. such a command is in the History Buffer, it will be presented for editing.  
  411. Otherwise, a 'No Find' error message will be displayed.  
  412.  
  413.  
  414. ---------------------------------- Aliasing ---------------------------------
  415.  
  416. An Alias is an alternate name.  Aliasing allows the user less typing with 
  417. frequently used commands.  Aliasing can also replace the use of simple one 
  418. line Batch Files.  An Alias is defined with the DOS SET command.  To define 
  419. an Alias for use with Buffer 1: 
  420.   A> set @alias=string
  421.          or
  422.   A> set @alias="string"
  423.  
  424. 'Alias' is now an alternate name for 'string'.  Whenever 'alias' is typed at 
  425. the far left of the command line, it will be as though 'string' was really 
  426. typed.  
  427.  
  428. Aliasing works only at the far left of the command line.  Another feature, 
  429. Environment Substitution, described elsewhere in this document, is similar to 
  430. Aliasing, but works anywhere on the command line.  
  431.  
  432. Command Line RECALL doesn't care whether or not 'string' is enclosed in 
  433. double quotes.  However the double quotes allow a user to get certain 
  434. characters (namely '<', '>', and '|') into the Environment.  
  435.  
  436. An Alias defined for use in Buffer 1 will have no effect from within a 
  437. program which runs under DOS (Buffer 2), and vice versa.  The rest of this 
  438. section will concentrate on defining Aliases for use from the DOS command 
  439. line (Buffer 1).  The use of Aliases with Buffer 2 is not as useful, but is 
  440. fully supported.  To define an Alias for use with Buffer 2: 
  441.   A> set #alias=string
  442.  
  443. An '@' before the Alias applies to the DOS command line (Buffer 1).  The '@' 
  444. can be changed with a 'RECALL /ALIASCHR1=c' command.  A '#' before the Alias 
  445. applies to programs which run under DOS (Buffer 2).  The '#' can be changed 
  446. with a 'RECALL /ALIASCHR2=' command.  
  447.  
  448. For example, to make 'D' an Alias for 'DIR': 
  449.   A> set @d=dir           define Alias
  450.   A> d                    use Alias
  451.   A> d  *.doc             use Alias
  452.  
  453. Aliases are defined with the DOS SET command.  The following Alias 
  454. definitions are excellent candidates for addition to AUTOEXEC.BAT: 
  455.      A> set @up="cd .."                 (quotes optional)
  456.      A> set @cmp="echo n| comp"         (quotes necessary)
  457.      A> set @r=recall
  458.  
  459. After Aliases have been defined, they can be accessed from the DOS command 
  460. line.  Column 1 below shows how Aliases are used.  Column 2 shows how the 
  461. command would have to be typed without the Aliasing feature.  For users who 
  462. understand DOS Batch Language, column 3 shows an equivalent one line Batch 
  463. File.  The following examples use the Aliases defined with the above SET 
  464. commands: 
  465.      Aliasing              equivalent                    Batch Language
  466.      --------              ----------                    --------------
  467.   A> up                 A> cd ..                         cd ..
  468.   A> cmp file1 file2    A> echo n| comp file1 file2      echo n| comp %1 %2
  469.   A> r autoexec         A> recall autoexec               %@r% autoexec
  470.  
  471.  
  472. ---------------------------- Function Key Macros ----------------------------
  473.  
  474. Function Key Macros are Aliases.  The Function Key Macros feature of Command 
  475. Line RECALL is nothing more than a special case of the Aliasing feature.  
  476. Function Key Macros can be defined for the following keys: 
  477.   <Shift-F1>  through  <Shift-F10>
  478.   <Ctrl-F1>   through  <Ctrl-F10>
  479.   <Alt-F1>    through  <Alt-F10>
  480. Function Key Macros cannot be defined for <F1> through <F10>, as these keys 
  481. are used to access other features.  
  482.  
  483. Macros are defined using the DOS SET command, exactly the same way Aliases 
  484. are defined.  To define Macros for use with Buffer 1: 
  485.   A> set @macro=string
  486.          or
  487.   A> set @macro="string"
  488.  
  489. An Alias is also a Function Key Macro when the Alias, 'macro', is one of the 
  490. following (upper/lower case, no difference): 
  491.         ShiftF1     CtrlF1     AltF1
  492.         ShiftF2     CtrlF2     AltF2
  493.         ShiftF3     CtrlF3     AltF3
  494.         ShiftF4     CtrlF4     AltF4
  495.         ShiftF5     CtrlF5     AltF5
  496.         ShiftF6     CtrlF6     AltF6
  497.         ShiftF7     CtrlF7     AltF7
  498.         ShiftF8     CtrlF8     AltF8
  499.         ShiftF9     CtrlF9     AltF9
  500.         ShiftF10    CtrlF10    AltF10
  501.  
  502. To define Macros for use with Buffer 2: 
  503.   A:\> set #macro=string
  504.  
  505. Thirty Macros can be defined for use with Buffer 1, and thirty Macros can be 
  506. defined for use with Buffer 2.  Macros defined for use in Buffer 1 will have 
  507. no effect in Buffer 2 and vice versa.  An '@' before the Macro (Alias) 
  508. applies to the DOS command line (Buffer 1).  The '@' can be changed with a 
  509. 'RECALL /ALIASCHR1=' command.  A '#' before the Macro (Alias) applies to 
  510. programs which run under DOS (Buffer 2).  The '#' can be changed with a 
  511. 'RECALL /ALIASCHR2=' command.  
  512.  
  513. After a Macro has been defined for a function key, pressing that function key 
  514. will perform the following actions: 
  515.   1)  Clear the current line (like the <Esc> key).
  516.   2)  Type in the characters assigned to the Macro.
  517.   3)  Process the characters (like the <Enter> key).
  518.  
  519. A caret, '^',  has a special meaning in a Macro definition.  A '^' as the 
  520. first character of 'string' means skip step 1), above.  A '^' as the last 
  521. character of 'string' means skip step 3), above.  
  522.  
  523. Macros are defined with the DOS SET command.  Some examples follow: 
  524.       A> set  @CtrlF6="DIR  ^"               (quotes optional)
  525.       A> set  @CtrlF5="set | find "@""       (quotes necessary)
  526.       A> set  @AltF10=recall
  527.       A> set  @ShiftF8=^autoexec.bat^
  528.  
  529. Some examples of using the above defined Macros from the DOS command line 
  530. follow: 
  531.          keystrokes                     equivalent
  532.          ----------                     ----------
  533.       A> <Alt-F10>                   A> recall<Enter>
  534.       A> <Ctrl-F5>                   A> set | find "@"<Enter>
  535.       A> <Ctrl-F6>*.bat              A> DIR  *.bat
  536.       A> edit <Shift-F8>             A> edit autoexec.bat
  537.       A> altF10 /ins+ <Enter>        A> recall /ins+ <Enter>
  538.  
  539. Notice, in the last example, that a Function Key Macro is being used as an 
  540. Alias.  
  541.  
  542. Function Key Macros can be defined on the fly, but those used often should be 
  543. added to AUTOEXEC.BAT.  Function Key Macros could be very useful in the 
  544. implementation of Batch Menus. 
  545.  
  546.  
  547. -------------------------- Environment Substitution -------------------------
  548.  
  549. Environment Substitution is similar to Aliasing.  An Environment Variable's 
  550. equivalent string can be inserted into a command line by proceeding the 
  551. Environment Variable with a single quote, ('), or enclosing it between single 
  552. quotes.  For example: 
  553.     A> echo The path is 'path' and today is Friday.
  554.     The path is C:\DOS;C:\UTILS and today is Friday.
  555.  
  556. Environment Variables are defined with the DOS SET command:
  557.      A> set a=autoexec.bat
  558.      A> set @r=recall
  559.  
  560. Column 1 below shows how Environment Substitution is invoked.  Column 2 shows 
  561. how the command would have to be typed without Environment Substitution.  For 
  562. users who understand DOS Batch Language, column 3 shows an equivalent line in 
  563. a Batch File.  The following examples use the Environment Variables defined 
  564. with the above SET commands: 
  565.      Examples              equivalent                     Batch Language
  566.      --------              ----------                     --------------
  567.   A> type 'a'           A> type autoexec.bat           A> type %a%
  568.   A> r 'a               A> recall autoexec.bat         A> %@r% %a%
  569.   A> echo '@r  'a       A> echo recall  autoexec.bat   A> echo %@r%  %a%
  570.  
  571. Environment Substitution works anywhere on the command line, whereas 
  572. Aliasing, described elsewhere in this document, works only at the far left of 
  573. the command line.  
  574.  
  575.  
  576. --------------------------- Environment Completion --------------------------
  577.  
  578. Environment Completion is similar to Environment Substitution, but allows the 
  579. user to edit the Environment Variable equivalent string before pressing 
  580. <Enter>.  Environment Completion allows a user to edit long Environment 
  581. Variable definitions.  When <F8> is pressed, the last word on the command 
  582. line is looked up in the Environment.  If a match is found, an equal sign and 
  583. the Environment Variable equivalent string are placed at the end of the line 
  584. for further editing.  
  585.  
  586. Without Command Line RECALL, a change to the PATH Environment Variable 
  587. requires retyping the whole path.  The following example shows how easy 
  588. changing the PATH can be: 
  589.            A> path                                press <F8>
  590.            A> path=C:\DOS;C:\UTILS;C:\EDIT        continue editing
  591.  
  592.  
  593. ---------------------- Filename and Dirname Completion ----------------------
  594.  
  595. Filename Completion allows a user to type a few characters of a filename, 
  596. then press <F10> to complete the filename.  <F10> can be pressed again and 
  597. again to view other possible completions of the filename.  No matter where 
  598. the cursor is located, Command Line RECALL uses the last word on the line to 
  599. look for a matching file.  A blank at the end of the line is just like a 
  600. '*.*' at the end of the line.  
  601.  
  602. The following examples demonstrate the use of Filename Completion.  The 
  603. second column shows how Command Line RECALL searches for matching filenames: 
  604.      examples                   what is searched for
  605.      --------                   --------------------
  606.   A> type<F10>                  TYPE*.*                  no space before <F10>
  607.   A> type  <F10>                *.*                      space before <F10>
  608.   A> copy \dos\.com<F10>        \DOS\*.COM
  609.   A> edit a:subdir\<F10>        A:SUBDIR\*.*
  610.   A> del c:\xyz?.<F10>          C:\XYZ?.
  611.   A> type J:\xyz*<F10>          J:\XYZ*.*
  612.  
  613. Dirname Completion, <F9>, works just like Filename Completion, <F10>, except 
  614. that only subdirectory names are matched.  The following example shows how to 
  615. use Dirname Completion and Filename Completion to search through a hard disk 
  616. directory tree for a file.  This particular example searches for a filename 
  617. for a COPY command: 
  618.  
  619.   keys                       display
  620.   ----                       -------
  621.   copy  s               C:\> copy  s
  622.   <F9>                  C:\> copy  STUFF
  623.   <F9>                  C:\> copy  SYS
  624.   \                     C:\> copy  SYS\
  625.   <F9>                  C:\> copy  SYS\DOS
  626.   \c                    C:\> copy  SYS\DOS\c
  627.   <F10>                 C:\> copy  SYS\DOS\COMMAND.COM
  628.   <F10>                 C:\> copy  SYS\DOS\CHKDSK.COM
  629.  
  630.  
  631. ------------------------------ Technical Notes ------------------------------
  632.  
  633. This section is not for everyone.  Skip it if seems too complicated or too 
  634. boring.  
  635.  
  636. Command Line RECALL is a Terminate-and-Stay-Resident (TSR) program which 
  637. traps and completely handles Interrupt 21H, service 0aH, also known as 
  638. Buffered Keyboard Input.  All other Interrupt 21 calls except 0a are passed 
  639. directly to DOS.  
  640.  
  641. Command Line RECALL can be called from programs written in Assembly Language 
  642. or in a high level language.  When a program calls INT 21 with register 
  643. AH=0a, instead of using the old command line editor provided with DOS, the 
  644. program now has use of all the editing features explained in this document.  
  645. This provides an easy way for a program to get user input.  Remember, that 
  646. programs that run under DOS use Buffer 2 and use the '#' character for 
  647. Aliases and Function Key Macros.  
  648.  
  649. Buffered Keyboard Input can be called from Assembly Language.  The following 
  650. example is not a complete program, rather Data and Code fragments: 
  651.  
  652.                                 ;*** Data ***
  653.   TEMPLATE  db   81                  ;max len of buffered input (incl CR)
  654.             db   ?                   ;returned len goes here (not incl CR)
  655.             db   81 dup(?)           ;returned buffered input chars go here
  656.  
  657.                                 ;*** Code ***
  658.             mov  dx,offset TEMPLATE  ;DS:DX -> Template
  659.             mov  ah,0aH              ;Buffered Keyboard Input
  660.             int  21H
  661.  
  662.             mov  si,dx               ;DS:SI -> Template
  663.             mov  ch,0                ;CX <- len of user input
  664.             mov  cl,[si+1]
  665.             add  si,2                ;DS:SI -> user input characters
  666.  
  667. The high level language, C, can also be used to access Buffered Keyboard 
  668. Input.  The following is a complete C program: 
  669.  
  670.     /* DOS interrupt with AL and DX     arg1,arg2,arg3  --  AH,DX,AL */
  671. extern int       bdos(int, unsigned int, unsigned int);
  672. struct template {        /* Template for Buffered Keyboard Input */
  673.   char   max_len;           /* maximum return len (incl CR) */
  674.   char   ret_len;           /* len of user input (not incl CR) */
  675.   char   ret_chars[21];     /* user input characters */
  676. };
  677. main()
  678. {
  679.   struct template   bfr;
  680.   bfr.max_len = 21;                    /* maximum return len (incl CR) */
  681.   printf("Press ^C when Done\n");
  682.   while (1) {                          /* infinite loop */
  683.     bdos(10, (unsigned int)&bfr, 0);   /* buffered keyboard input */
  684.                      /* change terminator from CR to NULL, and print results */
  685.     *(bfr.ret_chars + (int)bfr.ret_len) = '\0';
  686.     printf("\n%s    *** Len = %i ***\n", bfr.ret_chars, bfr.ret_len);
  687.                      /* change terminator back to CR */
  688.     *(bfr.ret_chars + (int)bfr.ret_len) = '\r';
  689.   }
  690. }
  691.  
  692. Command Line RECALL was written in a mixture of Assembly Language and C.  To 
  693. reduce the memory requirements, the part of RECALL.COM that becomes memory 
  694. resident was written almost entirely in Assembly Language.  C was used to 
  695. write the part of RECALL.COM which handles the various command line options.  
  696.  
  697. The memory resident part of Command Line RECALL is executing when the 
  698. computer is at the DOS prompt.  It is possible that Command Line RECALL will 
  699. spend more time executing than all other programs combined.  Most of Command 
  700. Line RECALL's execution time is spent waiting for user keystrokes.  
  701.  
  702. Command Line RECALL uses INT 21H, Service 8 for keyboard input.  This insures 
  703. compatibility with DOS piping.  In an attempt at maximum compatibility, the 
  704. only ascii keystrokes assigned to functions are: 
  705.   <Enter>             ascii  13
  706.   <Ctrl-Enter>        ascii  10
  707.   <BackSpace>         ascii   8         redefinable
  708.   <Ctrl-BackSpace>    ascii 127         redefinable
  709.   <Esc>               ascii  27
  710.   <Tab>               ascii   9
  711.   <Ctrl-V>            ascii  22
  712. To prevent a user from accidentally hosing the DOS pipeline, only two keys 
  713. from the above list can be redefined.  
  714.  
  715. Command Line RECALL uses INT 10H, service 0aH for display output.  This is a 
  716. departure from the more traditional INT 10H, service 0eH.  
  717.  
  718. Command Line RECALL assumes that after it becomes memory resident, the first 
  719. program requesting Buffered Keyboard Input is DOS.  In this way, calls by DOS 
  720. (Buffer 1) can be differentiated from calls by programs that run under DOS 
  721. (Buffer 2).  If RECALL.COM is memory installed from AUTOEXEC.BAT, and DEBUG 
  722. is run after RECALL.COM in AUTOEXEC.BAT, Command Line RECALL will be faked 
  723. out and will not behave correctly.  
  724.  
  725. Every program that runs under DOS receives a copy of the DOS Environment.  
  726. When Command Line RECALL is run for the first time, it receives a copy of the 
  727. DOS Environment.  Before Command Line RECALL makes itself memory resident, it 
  728. throws away its copy of the DOS Environment and uses COMMAND.COM's 
  729. Environment, instead.  Therefore, after Command Line RECALL becomes memory 
  730. resident, it will notice changes made to the Environment.  
  731.  
  732. When an application is run it receives a copy of the Environment.  When a 
  733. user Shells out of an application, the DOS Shell will be working with a copy 
  734. of a copy of the Environment.  Changes made to the Environment when Shelled 
  735. out of an application will not be noticed by Command Line RECALL.  
  736.  
  737. The DOS Environment is used heavily by Command Line RECALL's Aliasing and 
  738. Macros features.  It may be necessary to expand the Environment Size by 
  739. including a SHELL statement in CONFIG.SYS, for example: 
  740.      SHELL = C:\COMMAND.COM /P /E:nnnn
  741. With DOS 3.x and higher, the 'nnnn' is the Environment Size in bytes.  To 
  742. allocate a 1K Environment: 
  743.      SHELL = C:\COMMAND.COM /P /E:1024
  744. With DOS 2.x, the 'nnnn' is the Environment Size in 16 byte paragraphs.  To 
  745. allocate a 1K Environment: 
  746.      SHELL = C:\COMMAND.COM /P /E:64
  747. On a non-hard disk system with DOS 3.x: 
  748.      SHELL = A:\COMMAND.COM /P /E:1024
  749. Consult a DOS manual for more details.  
  750.  
  751.  
  752. ---------------------------------- Updates ----------------------------------
  753.  
  754. To update to the latest version of Command Line RECALL, write: 
  755.  
  756.                                   Roger Roth
  757.                              Command Line RECALL
  758.                                   PO Box 840
  759.                          West Jordan, UT  84084-0840
  760.  
  761. Include $20 (shipping/handling) and mailing label.  Specify 5.25" or 3.5".  
  762.  
  763. Diskette will include approximately 15 other utilities, including: 
  764.  
  765.     KEYBUF  memory resident 160 character keyboard type ahead buffer
  766.     KBD     keyboard repeat rate, shift bits, stuff type ahead buffer
  767.     CLEAR   set display rows, columns, colors, cursor in text modes
  768.     SEARCH  find text strings in ascii files
  769.     WTO     standard output with escape sequences and optional (Y/N) response
  770.     RENN    rename files, move files, rename directories with verify
  771.  
  772.