Sili(CON:) User Manual ====================== -- Copyright 1991 Pete Goodeve -- Concept ======= In recent years there has been a pronounced trend toward the "Graphic User Interface" (GUI). In fact at times the trend has seemed more like a headlong rush. Despite this, experienced users seem likely to stick to the Command Line form of interaction for a lot of their work. This is partly a simple reluctance to change, probably, but in many ways a command language is plain more flexible and convenient. How often do you give a person instructions solely by pointing and clicking your fingers? Or by showing them pre-drawn pictures? What would seem to be needed is an approach that combines the convenience of point-and-click with the flexibility of text commands. This is exactly the intent of Sili(CON:). Commands, once typed in, remain available for recall and re-execution by mouse click, and one common window acts as a convenient central control point for all the Shell processes that you have running (hence "Poly" Sili(CON:)). A Shell under Sili(CON:)'s control, by the way, is (normally) a standard AmigaDOS Shell, so all the usual commands and facilities are available. In typical usage, you find that you are entering the same -- or minor variations of the same -- commands repeatedly, sometimes in the same cyclic order, sometimes not. With the AmigaDOS Shell, you can step back through the history to recall previous commands, but this becomes tedious especially when the command is more than a few lines back. Sili(CON:) provides a VISIBLE History list in its window (with a scrollbar): recalling a wanted line is just a matter of clicking on it with the mouse; a double click re-executes it directly. A single click brings the line back into the editing gadget for possible modification; this area is an enhanced String Gadget with all the standard Shell editing options (ctrl-U and ctrl-K etc.) plus a few extras like cursor-to-next-space. If you use a particular set of commands repeatedly over a number of sessions, you can store them in a file that can be copied straight into the history list (at startup or any time later) ready for immediate selection. Another important Sili(CON:) policy is to separate the Command Area from the Display windows for each process. You can have as many Shell processes as you like (within reason!) connected to Sili(CON:) channels, and they all receive their commands from the single Sili(CON:) window. When first entered, a command is directed to the channel currently selected as active; any re-invocation of that line goes automatically to the same channel (whatever the selcted default at that time) unless specifically redirected. Both the command and any resulting program output are of course displayed in the associated Shell window as usual. One notable consequence of this scheme is that the execution of programs doesn't interfere with the entry of commands. Not only can you type in the command text at any time, however many programs are executing, but you can transmit it to its Shell. It will be queued to be executed when that Shell finishes all the jobs preceding it. As well as letting you use the mouse to save typing, Sili(CON:) conversely often lets you keep your hands on the keyboard where otherwise you would need to use the mouse: switching between shells is a matter of a single keystroke -- no need to move your hand to the mouse and click in that window. Of course you have menu selection of the active shell, too, if that happens to be more convenient. With the full package (Licensed Shareware -- see the end of this manual) you can actually connect ANY program that accepts text lines as input to Sili(CON:). This could be an ARexx script, for instance, set up to read an `IP:' device channel. (Sili(CON:) doesn't have an ARexx port of its own; this approach provides all the convenience of such a port without any extra overhead.) Sili(CON:)'s history list can be manipulated in ways that are not common in such mechanisms. For one thing, you can delete unwanted items, so the visible area doesn't get cluttered with mistyped commands and so on. You can also gather all the lines associated with one channel together at the front of the list, or just wipe them all to start afresh on that channel. Up and down arrows also operate to move you through the history as you would expect, of course. All functions (except a couple of "critical" ones, like `QUIT') can be performed from the keyboard rather than the mouse if it is more convenient at that point. The final important underpinning of Sili(CON:) is its modularity, based on the ppIPC communication mechanism. Components are kept small by doing only what they need to, communicating with other components for their distinct specialities. Sili(CON:) itself, for instance, accepts no command line options for setting window configuration and so on. Instead there is a module `SiliConfig' (in the Licensed Shareware package only) that accepts and parses command lines -- or configuration files -- and sends compact IPCMessages to Sili(CON:) to implement the requests. The ppIPC interface is fully documented (in the printed Licensed documentation only), so that others can write their own utilities to work with this system. Requirements and Components =========================== Sili(CON:) will run on any Amiga with AmigaDOS 1.3 or 2.0. (It may also behave properly under 1.2, but this has not been checked.) Some software components other than the SiliCon program itself are needed for the system to work; they are all included with this package, and the easiest way to install them is with the automatic installation program also included. The InterProcess Communications library `ppipc.library' must be available in LIBS: and the IPC pipe device `IP:' (`IP-Handler') must be installed in L: and mounted; this means too, of course that this must have an entry in DEVS:MountList. Both the above are general purpose modules -- not restricted to functioning with Sili(CON:). Sili(CON:) itself has two essential components: the `SiliCon' program that provides the main Control and History window, and `InShell', which links this to the Shell processes that you want to control. In addition, you will want some scripts in your path (usually in the `S:' directory) for convenient opening of new Shell windows and so on. Basic ones are supplied in this package, but you may want to tailor them or create your own. With the Licensed Shareware package (obtained by sending in the requested contribution -- see the end of this manual) you get three more utility programs: SiliConfig, SiliDump, and SiLink. SiliConfig lets you configure the window and history under program control. SiliDump creates a configuration file from the current state and contents of the window -- and also provides a mechanism for "circulating" individual command lines from older parts of the history to the front. SiLink allows you to make connections to processes other than Shell windows (and has some other subsidiary convenience functions). Any program that accepts lines of text as input can be connected to Sili(CON:) -- via an `IP:' channel (or even a suitable direct IPCPort) -- provided that Sili(CON:) is instructed to open that channel. InShell does this automatically for itself, of course, but SiLink is the command-line-driven equivalent for other occasions. Compatibility ============= Sili(CON:) was written to function with the standard AmigaDOS Shell and CLI. It has not been tested with other shells, but if they use standard Console (not `RAW:') Input for their commands it will probably work with them also. (I would be interested in any experiences in this area.) It should be compatible with any program that runs under the CLI or Shell. If a program itself requires standard console input, this can come from either Sili(CON:) or the Shell window it is running in (by redirection, as explained in `Keyboard Input to Programs'). In fact you can use a Shell window's own (Console) history, separate from Sili(CON:)'s, for program input, if you wish. If a program takes raw keystrokes as input (`more' for example) it must come from the Shell window rather than Sili(CON:). Many -- probably most -- utilities work well with Sili(CON:). No real incompatibilities have yet been found. If you have any problems please let me know. System Installation =================== For most people, the most convenient way of installing the system will be simply to use the supplied `Install SiliCon' icon. Double-clicking on this initiates a complete installation sequence, with your permission being asked each time before any change is made to your disk. The following paragraphs detail the steps involved, so that you can see what the installation program is doing, or so that you can do the installation manually if you prefer. One option in the automatic sequence is to do a trial installation. This makes NO changes to your disk, loading everything it needs from the installation directory, and putting pieces that may be needed later into a RAM: directory. To try it this way, just click `Yes' in the first requester presented to you; in a few moments the Sili(CON:) window and an attached shell should appear; you can use `NewSili' to attach more shells. This is a fully functional copy of the program, and you can try out all its features. To perform a full install instead, just click on the `Install' gadget of the requester, rather than `Yes'. The full automatic installation sequence assumes that your environment is fairly standard. DOS commands should be the 1.3 or 2.0 standard ones and have standard names, so that the script can use them. There must be sufficient room in your system directories, particularly in the C: directory, to hold the required additions -- a total of about 30K is needed for the Freely Distributable package, 20K more for the licensed extras. See the previous Requirements and Components section (and below) for details of the pieces to be installed. The installation sequence begins at the `foundation level' and works up. First, `ppipc.library' is placed in `LIBS:', then `IP-handler' is copied to `L:'. Next, the executable modules are copied, and finally changes are (carefully!) made to `DEVS:MountList' and `S:Startup-Sequence' so that Sili(CON:) is started automatically when the system starts. You needn't permit the last step (or in fact any of the others) if you don't want it. The installation process is managed by an Xicon script. The "Install SiliCon" icon is actually attached to a directory of that name, rather than directly to a script; the main script is actually `.script' within that directory; it in turn uses sub-scripts within the `.work_scripts' subdirectory to do the pieces of the job. All the modules that will be copied to your disk during installation are also in the `Install SiliCon' directory, except that the User scripts are in an `S' subdirectory of this (and the licensed modules if present are in their own subdirectory too). ppipc.library: This module must be installed in the `LIBS:' directory for normal use of Sili(CON:). (For the trial installation, a judicious temporary switching of assignments avoids this.) The original released version is still the current one, so that if you already have it installed you don't have to do it again. IP-Handler: The `IP:' device is used to connect to shell processes, so this handler must be available in `L:' (and must be mounted -- see later). The original release has a bug that could occasionally cause problems with Sili(CON:) (though not for other uses), so it should be replaced with this version. There are no differences in the two versions aside from the bug fix. If a version exists in L:, the program will show you the comparative directory entries, so you can decide whether you need to replace it. If for some reason there is absolutely no room in `L:', you could put the handler somewhere else, and modify the MountList entry yourself to match. SiliCon: This is the main program that manages the user interface and history window. You probably will want it in `C:' -- which is where the installation sequence will put it -- but you can place it anywhere that it is convenient for you to execute it from. (It will probably only be executed automatically by a suitable command in the startup sequence.) InShell: This is executed to make the connection between a shell and Sili(CON:). It also should normally be in `C:', but can be anywhere on the standard path. Note that if you wish, this program may be made resident; the installation sequence doesn't add any automatic instruction to do this, however. Scripts: There are two scripts that will be put in the `S:' directory -- which, by the way, should be in your path, as is usually the case since DOS 1.3 was introduced. These are `NewSili' and `Sili-Startup'. If for some reason `S:' is not normally in your path, you can put NewSili in `C:' or anywhere else on the path. Sili-Startup should, however, always be in `S:' -- it is always referred to directly, so it doesn't need to be in the path. These two scripts are in the `S' subdirectory of the main installation directory. Extended modules: If you have the licensed package, there are three more programs that the installation sequence will copy to `C:' -- `SiliConfig', `SiliDump', and `SiLink'. These are simple utility programs that could be put anywhere else accessible that you prefer. MountList: The `IP:' Handler must be mounted before Sili(CON:) is used, and so it must have an entry in `DEVS:MountList'. The installation program looks for an appropriate entry there, and if it doesn't find one asks permission to insert it. If allowed to it simply appends the entry to the current list. By the way, it is careful to do the modification on a copy! The original MountList is then renamed as a backup BEFORE the copy is put in its place. If you prefer to make the change yourself, the necessary lines are in `IP_MountList' in the installation directory. Startup-Sequence: There are two separate additions that the program will make to `S:Startup-Sequence' if so allowed. First it inserts a `mount IP:' command to ensure that this device is available, and then adds automatic startup of Sili(CON:) and one connected shell before the `endcli'. It first checks to see if such lines appear to have already been added, though, so that the file doesn't get modified twice. There are some subtleties here that you should be aware of. A 1.3 system often has the major part of the startup in `S:StartupII', rather than in the main sequence, so the program first checks for the existence of this and for other `mount' commands within it; if it is successful it will offer to put the new line there also. If it doesn't find it, or is told not to, it will then request permission to modify Startup-Sequence itself; it will put the new line with other mounts if there are any, or otherwise after the LoadWB line; if it really gets lost it will give up and let you edit the file yourself. The automatic startup text will be put immediately before the usual `endcli'. Again, if the program can't find this it will pass the job on to you. And of course once again all this editing is done on a copy, which only replaces the original after it is backed up. If you allow all these steps, the next time you boot your machine, Sili(CON:) will be started automatically. startup: Finally, the program asks if you want to start Sili(CON:) immediately. If you answer `Yes' it does essentially the same startup that would occur from the Startup-Sequence (except that the current directory is still the installation directory). Custom installation: If you prefer not to use the automatic sequence, or for some reason you cannot in your machine, you can find all the pieces referred to above in the `Install SiliCon' directory, and copy them yourself to the appropriate places. You will also have to know how to edit the MountList and Startup Sequence. If you wish to do this, or to change anything in the default installation, please read the relevant sections of this manual first, and back things up before you change them. Starting Sili(CON:) =================== Once you have all components properly installed, as detailed in `Installation', you need to do two things to begin using the program. First you need to start the control and history module, and then connect one or more Shell processes to it. You will probably want to do both of these things either automatically from your startup sequence or at least from a script, but they can be done directly from a Shell window. For clarity, this last alternative will be described first. To start the control module, just give the (CLI or Shell) command: silicon The control/history window will appear. There is no need to use "RUN", because SiliCon immediately detaches itself and runs in the background. The SiliCon window does, however, become the active one, so for the next step you need to click in the Shell window to reactivate it. (If you type commands into the SiliCon window at this point, nothing will happen because as yet no Shell is connected.) If you want to connect the AmigaDOS Shell you are working in to SiliCon, use the command: inshell This runs momentarily to make the connection between the Standard Input of the Shell and SiliCon and then exits, freeing the Shell for other commands. (Do NOT use "RUN" here!) From this point, the Shell will get its command input from one of SiliCon's channels; the channel name assigned by InShell appears in the SiliCon window title bar when the link is made, to indicate that commands will be directed there (until the channel is changed). By the way, once linked, there is no way to break SiliCon's thrall except by killing the shell (`ENDCLI', or from the SiliCon `SHUT' menu). The InShell command is described more fully in its own section. If you do not want to link the currently running Shell or CLI to SiliCon (or if it is already linked and you want to open more channels), you can start another shell that is immediately linked to SiliCon by using the supplied shell startup script `Sili-Startup' (normally in the `S:' directory): newshell from s:sili-startup This script simply executes InShell itself, and sets up some aliases and so on; edit it to suit your needs. There is an executable script `NewSili' that conveniently performs the above command (with a default window specification). Note that the supplied Sili-Startup redefines `NewSili' as an alias. This is faster, but not as flexible (and of course doesn't work if Sili-Startup wasn't used for the current shell). Whichever version is used, `NewSili' becomes the equivalent of `NewShell' for starting another Shell process that is controlled from SiliCon. The most convenient way to start up SiliCon is from the Startup-Sequence at boot time, launching one or more linked Shells at the same time. Simply include whatever versions of the above commands suit your needs immediately before the terminating EndCli in the S:Startup-Sequence file. (You CAN replace the EndCli with an InShell, but it is probably not a good idea, as this initial window -- under 1.3 at any rate -- is a CLI, not a Shell, so you won't be getting the features that you would otherwise expect.) This is the sort of thing: ..... ..... SiliCon NewShell "NEWCON:0/0/300/200/Sili Shell" from S:Sili-Startup endcli >NIL: Some other things you may also want to do before the endcli. If you have the full system you can invoke SiliConfig (not included with the Freely Distributable version) to dimension the control window and so on, and install some initial lines in the history for quick access. You can even, in fact, copy lines into the history from a file if you only have the basic FD package, as explained in a later section, but you have fewer options that way. Advanced users may even want to link in other utility processes that are not Shells (ARexx programs perhaps) -- again, the full system is needed for this. The Sili(CON:) Window ===================== Sili(CON:) opens just a single window, with a number of functional areas. At the bottom there is the Command Entry Line; any characters typed while the window is active will appear there. The main area of the window above that is the History Display, showing the list of commands previously entered. On the right is the scrollbar that lets you move directly to the point of interest in the history if it is off screen. When first started (and at occasional times later) the title bar just says `Sili(CON:)', but most of the time it gives information on the channels currently selected. See the later section on `Channels' for details. The window has the usual front/back and sizing gadgets, and of course can be dragged by its title bar, but there is no `quit' gadget. A menu item is used to close Sili(CON:) down. Activating the Window ===================== An important feature of Sili(CON:) is that there is a `hot key' combination that will activate the window immediately, whatever else the Amiga is doing at the time. Hold down the LEFT Amiga key and type the return key, and the control window will be brought to the front of the Workbench screen and activated. (Note well that this key combination ALWAYS activates Sili(CON:), whatever screen is active at the time, but it does NOT bring the Workbench screen to the front. You can type `blind' if you wish after doing this, but it is probably wiser not to! Note also that there is an apparent Intuition glitch that very occasionally prevents the window from coming to the front when activated; if this happens, it WILL come to the front when the return key is next pressed; if you are worried about possible accidental execution of a command, use shift-return to prevent this.) Using Sili(CON:) ================ Once you have started Sili(CON:) you will normally leave it running continuously until you shut the machine off -- although you can remove it with the `QUIT' menu item if you so wish. Usage is mostly just a matter of typing commands into its entry line or selecting previous ones from its history area for re-execution. Freshly entered commands are transmitted out the currently selected channel; re-executed ones go to the channel they were originally associated with, unless you specify otherwise. In general, the destination of a command is a perfectly standard AmigaDOS shell, so all the facilities it provides (such as aliases, command redirection, and directly executable scripts) are available as usual. The only real difference is that if you want to open a new shell connected to Sili(CON:) you should use `NewSili' rather than `NewShell' (see below). A command is actually transmitted when the return key is typed. Sili(CON:) normally remains active after transmission, so you can immediately continue entering further commands. However, if you execute a command with the Right-Amiga key held down as you type return, keyboard activity is transferred to the shell window itself (see below for more details). This lets you control output with the space bar, for instance. If you want to interact with the program itself in the shell window, rather than through Sili(CON:), you should redirect its input in the command line. See `Keyboard Input to Programs' for details. You can change the current channel -- to transmit to any of the connected Shells -- via either menu selection or keyboard. Other actions you can select from either menu or keyboard include gathering all the commands associated with the current channel at the front of the list, wiping all the commands on that channel from the history, changing a command to a different channel, or fixing the channel temporarily so that all commands are directed there, whatever their original destination. From the menu only, you can shut down a channel (and close its Shell) when you are done with it; you can also flush all the shut channels (i.e. remove them from the menu and discard their command lines) or quit Sili(CON:) entirely -- shutting down all its associated shells as well. (see `Menu Operations'.) New Shell processes are created for Sili(CON:) in an analogous fashion to the AmigaDOS `NewShell' command. In this case the command is `NewSili'. This is in fact either a script or an alias and does not have NewShell's options, but you can easily tailor it to your needs (or create alternatives). See the section below on `NewSili'. Entering commands: ================== While the Sili(CON:) window is the active one, characters typed at the keyboard go straight into the Command Entry Line at the bottom of the window. The return key is used to actually execute the command (or more precisely transmit it to the shell on the current channel for execution). A number of special keys and control characters are also active to give you convenient editing amd other controls: left-arrow move cursor one character left right-arrow move cursor one character right shift-left-arrow move cursor to beginning of text shift-right-arrow move cursor to end of text ctrl-left-arrow move cursor left to next space ctrl-right-arrow move cursor right to next space ctrl-K erase from cursor to end of line ctrl-U erase from before cursor to start of line ctrl-X erase whole line R.Amiga-Q restore initial contents of line (only on lines from history) up and down arrows move through the history -- see later (the current edited line is NOT preserved -- be careful!) return transmits command for execution shift-return enters command in history only -- does NOT transmit it alt-return transmits command, but adds it to the history as a "floating command" not associated with any channel (see the section on `Channels') Right_Amiga-return as return, but pushes the Sili(CON:) window to the back and activates the shell window that the command is sent to. Note that the Right_Amiga modifier remains associated with that command line: the Sili(CON:) window will be deactivated (and the shell window activated) each time that command is reinvoked. The above modifiers for the return key may be combined if you wish, and will usually do something rational. Thus: shift-alt-return enters command in history only as a "floating" one. R_Amiga-shift-return command to history only, and Sili(CON:) remains active, but the `background' modifier gets asociated with the command, and will take effect on future invocations. Other special keys, such as menu shortcut commands, are described in their own sections. The History List ================ Each new command typed into Sili(CON:) goes into the History as it is transmitted (or even without transmission, as described under `Entering Commands'). It can be retrieved from there when needed, for immediate re-execution or re-editing. Re-executed commands are NOT added again to the list, though re-edited ones are. You can access the history either through mouse or keyboard. At the left of each line in the history is a space for a marker that indicates something about the channel associated with that command. All the commands that are associated with the `selected' channel -- i.e. the channel of the currently selected command, or the default channel if there is no selected command -- show a `bullet within a rectangle' mark. Commands belonging to the `default' channel, if this is different from the selected channel, show a `bullet' only. `Floating' commands, that always go to the current default channel, will show a rectangle only at all times. Commands associated with other channels have no marker. You can select a particular command and bring it back to the entry line simply by clicking once on it with the mouse left button. If it is not visible in the window, you can scroll through the entire history with the scrollbar on the right of the window. (Note that this will be a reasonably smooth scroll if the window is the frontmost one known to Intuition; if it is not, the scroll flickers rather more. If this annoys you, click on the "to-front" gadget, or use the Left_Amiga-return combination.) A selected command is highlighted, and remains so as long as it is the selected one. Only one line may be selected at a time; executing any command -- from the history or keyed in -- unselects all lines. If you want to execute the command immediately, rather than bring it back for editing, double-click on that line in the history area. (You can't execute a command by clicking in the entry line area -- you must use the return key in that case.) You can step through the history with the up and down arrow keys if you prefer (while the window is active, of course). If the step would take you out of the currently visible area, the text will scroll to compensate. The list is not immutable as displayed. In a sense it is not a true "History" as seen in other situations (the Shell for example), because it is not an exact and complete record of all the commands in the order they were given. For a start, commands executed unchanged from the history are not re-entered: only new or edited ones go in. Further, you can delete unwanted lines from the set; this helps to avoid clutter, and guards you from choosing a badly entered one accidentally. To delete a line, first select it -- by mouse click or with the up/down arrows -- and then type Right_Amiga-Del. You can delete a set of adjacent lines backwards through the list by repeating that key combination an appropriate number of times. You have other manipulations available to you as well, both from the menu and by keyboard shortcut command. You can wipe (delete) all the lines associated with the current default channel, or gather them at the front of the list. See `Menu Operations' for details. The default maximum number of entries in the history is 50; when that number is exceeded, the oldest entries are discarded. Using the SiliConfig module (from the full package) you can reset this to any desired value. Channels ======== When you enter a command to Sili(CON:) it is sent out through a "Channel" to the desired shell (or other) process. Each connected process has its own channel, and each channel has its own name and its own item in the `Channel' menu tagged with that name. When a new channel is connected (`opened') it is added at the bottom of the menu list. It may later be `shut', in which case its menu item is disabled, and after that may be completely `flushed', at which point the item is removed from the menu. (See `Menu Operations'.) A channel name may be any appropriate string of characters, and is determined by the connecting process at the time the connection is made. The program that links a shell to a channel -- `InShell' -- will accept a command line argument for this if the user provides one; otherwise it generates a default one of the form `CLI_n', where `n' is the AmigaDOS CLI-Process number. At any time, one of the channels is Sili(CON:)'s `Selected Default Channel'. There is also a `Current Channel', which is the channel that the current command will actually be sent out on; for new commands this is just the default; for a reselected one it is the channel associated with it in the history. You select a particular channel to be the default by picking it from the `Channel' menu, or with one of the shortcut key combinations `Right_Amiga_1', `Right_Amiga_2',... `Right_Amiga_9'. These key combinations correspond IN ORDER to the items in the channel menu, but bear well in mind that there is no FIXED relation between the items and the keys, because items may be added and deleted at any time (as channels are opened and discarded). However there is little difficulty, as you get immediate feedback from the titlebar (see below). It is possible for NO channel to be the current default (when no shells have yet been linked, when the default channel has been flushed, or when you deliberately select `NO Channel'); in this case new commands don't get sent anywhere except into the history, where they become `floating' commands (see below). When a channel is shut, its commands don't disappear from the history unless it is actually flushed as well. Invoking a command for a shut channel does nothing at all. If the same channel is later opened again, the commands once again become active. (Note: in the current version, although a shut channel has its menu item disabled, you can still select it from the keyboard! Also, if it was the default channel at the time it was shut it remains so. This does no harm, but might confuse you.) The title bar of the Sili(CON:) window shows both the Current Channel (the leftmost), and the Selected Default (within brackets). If there is no current channel (i.e. there is neither a default nor one from a currently selected command) it will just show `Sili(CON:)'. If there is a current channel but no default, the brackets will be empty. A marker on the left of each history line indicates whether that line is associated with the current channel, the default channel, or is floating; see the section on `History' for details. This, together with the titlebar, gives you a convenient way of checking the association of commands with channels and with each other. You can see at a glance which commands will go to the current channel, and which to the default. By clicking on a particular line, you immediately see all the other commands linked to the same channel. A newly typed command is normally associated with the current default, and remains associated with it in the history unless later changed with a `Set to Channel' operation. The only exceptions to this are if the alt-return key combination is used to end the command, in which case it is entered as floating, or a previously entered command is edited, in which case it retains the channel of the original command. This last may be overridden by selecting a new default channel sometime AFTER the original command has been selected, but before the terminating return; this sequence will also temporarily redirect an unedited command to the default channel, but does not change the association in the history. A `floating' command line in the history is not associated with any particular channel. It will be always go out the current default channel when invoked. This is often useful for preventing multiple copies of commonly used commands (such as DIR) littering the history area. A floating line can be entered either with the alt-return combination mentioned or by entering it when there is no current default channel. The `Set to Channel' operation may also be used (with no default) to make a previously entered line floating. For completeness it should be pointed out that channels are actually just (ppIPC) IPCPorts passing messages with IDs suitable for an `IP:' device data stream. Hence any program that takes serial input (at least as long as it doesn't need raw console keystrokes) can be linked to a channel via an IP-device `pipe', or specially-written programs can even connect to a channel port directly. However, to complete the connection, Sili(CON:) has to be requested to open that channel; for a shell, this is done automatically by the linking program InShell, but a suitable message has to be sent in other cases; another utility `SiLink' is available with the full package to do this. `Shutting' a channel is slightly more complex than it might at first appear. Just as Sili(CON:) only opens a channel when it is requested to do so by a message, so it only actually shuts it (disables its menu item) when it receives a message requesting this; such a message is normally sent by the connection that is shutting down. Selecting a channel from the `SHUT:' menu simply sends a closedown request to the channel; it is up to the channel itself to send the `SHUT' message in return before actually going away. A shell connection will always do this, but a channel opened by `SiLink' for example may not. Whether the menu item is disabled or not, however, has no direct bearing on whether the channel is flushable. A channel may be flushed only when there are no other connections remaining to it. In normal use, when a channel has been opened by InShell, the menu item is disabled at the same time as the connection is closed, so there is no confusion. If you have connected a channel via SiLink, however, you may need to be aware of the distinction. Sili(CON:) WILL disable the channel menu item if you send a shut request from the menu and it finds that the channel is already actually closed. SiLink -- if you are using that -- has a SHUT option to send the appropriate message, from a closedown script for example. Menu Operations =============== Sili(CON:) has four menu lists, positioned along the menu bar in a way that should make them most convenient for most users, at least when the History window is close to its default position. At the far left is the `Sili(CON:)' menu, only used for quitting the program and flushing shut channels. Next to it is the `SHUT:' menu, used for closing down individual channels. On the right, above the normal position of the window, are the `Actions:' and `Channel' menus. The `Channel' and `SHUT:' menus contain the same list of currently known channel names -- ghosted (disabled) if they have been shut. Selecting an item from the `Channel' menu makes this the default channel to which new commands will be sent and on which most actions are performed. Selecting from the `SHUT:' menu sends a closedown message out that channel; if it is connected to a shell, an ENDCLI will be issued, the shell window will close, and Sili(CON:) will disable that channel; if it is some other program the result may be different -- in particular the menu item may NOT get disabled. For more on this see the `Channels' section. Nothing happens to the command lines in the history for that channel at this point, nor does the default channel change if it happens to be the one that is shut. The `Actions:' menu contains a number of possible operations on the history list and channels: `Gather Channel' -- collects all the history lines pertaining to the current default channel at the front of the history; their order is otherwise unchanged. `Wipe Channel' -- deletes all the history lines pertaining to the current default channel. `Fix Channel' -- forces ALL commands -- whether newly entered or selected from the history -- to be sent out the current default channel. This coercion remains in effect until another selection is made from the Channel menu (this may be a reselection of the same channel if you wish). It has no effect on the associations in the history, which will resume when the coercion is ended. You are reminded that this is in effect by there being no default (bracketed) channel shown in the title bar. `Set to Channel' -- functional only when a history line is currently selected: changes the association of that command to the current default channel. `NO Channel' -- sets the current default channel to null; as well as making any newly entered commands floating, this allows you to use the `Gather', `Wipe', and `Set' operations on all the floating history lines. The `Sili(CON:)' menu has only two entries (separated by a blank space for safety): `Flush Channels' -- removes ALL unconnected channels completely from Sili(CON:)'s control. The associated lines are wiped from the history, and the channel names are removed from the menus. Note that there is no way of removing a channel completely while there are other processes connected to the port. `QUIT' -- closes down Sili(CON:) completely. All channels and their associated shells are closed, and the history discarded. The `Actions:' and `Channel' menus have equivalent keyboard shortcut commands; the less commonly used (and more protected) `Sili(CON:)' and `SHUT:' menus don't. For `Actions:', the key equivalent is the Right_Amiga key combined with the initial letter of the item, except for `NO Channel' which uses `Right_Amiga-0' (zero) by analogy with the channel selection shortcuts. The combinations `Right_Amiga_1' through `Right_Amiga_9' are associated with the corresponding lines in the `Channel' menu. It would be possible (though rare) to have more than nine channels open, in which case the later ones would only be accessible from the menu. NewSili and Sili-Startup ======================== In the same way that you would type `NewShell' to open a new `standalone' shell window, you use `NewSili' to open a new shell connected to Sili(CON:). This is actually a single name for a couple of different mechanisms. There is a short script -- expected to be in `S:' -- that will do the job, but once you are running from a shell started in this way, it will normally be an alias created by the startup script. Whichever of these NewSili is, it simply performs the command newshell from S:Sili-Startup Sili-Startup is a short script, analogous to `Shell-Startup' for a standard shell except that it MUST contain the `InShell' command line that actually makes the link to Sili(CON:). The version supplied with this package can simply be regarded as a base from which to tailor your own. If your shells are virtually always connected to Sili(CON:), you may prefer to add `InShell' directly to `S:Shell-Startup'. In that case, the `NewShell' command will make the connection itself if Sili(CON:) is running. (If it is not, the shell would continue as normal.) Remember that the instant a new shell is started up, that window momentarily becomes the active one (as always with a new shell), and Sili(CON:) doesn't regain control until the InShell is executed. You should avoid typing anything in this short interval so that you don't get unwanted characters (and blocked output!) in the new window. Note that as supplied both NewSili and Sili-Startup refer to the `CON:' device, rather than the `NEWCON:' that would be slightly preferable under 1.3 (in case you should ever want to make use of the Console Device history as well). This is very seldom needed, and the NEWCON device is not recognized under 2.0, so to avoid having different versions for the two systems the basic `CON:' has been used. If you are running under 1.3 and you wish to change it, please do so. InShell -- Shell Linking Module =============================== A standard AmigaDOS Shell or CLI, once running, is connected to Sili(CON:) by invoking the program `InShell' (either directly or through a startup mechanism such as NewSili). This opens a new `IP:' device channel, connects it to the Standard Input of the shell, and informs Sili(CON:) that it is to open (and switch to) that same channel. It also ensures that the device is set up to close down the shell and its I/O properly when eventually requested to do so. It then exits, leaving the shell free to accept commands on its new input channel. If InShell is executed without any command line argument, it forms a name for the new channel by appending the number of the CLI process (assigned by AmigaDOS) to the prefix `CLI_', so that each channel has a unique name. If you are starting up a new shell for a particular purpose (working on a project, perhaps) you may want to have a more specific name for the channel. To do this, simply provide the desired name as a command line argument, like: inshell "my project" You will probably want to do this from a script (similar to Sili-Startup invoked by NewSili) that does any other initialization required for the project at the same time. You can then start it as: newshell from my-startup or simply create a script or alias (like NewSili) to do the job. Because InShell must be run in the newly started Shell, there is no easy direct way to pass it an argument from the process in which the actual `NewShell' is issued. This can be done with pipes (IP or standard) or even via a temporary file, but is cumbersome. It doesn't seem worth including examples; experiment if you feel like it. The first time InShell is run after Sili(CON:) has started, it displays the version number of Sili(CON:), and probably a little advertising message (!). Thereafter, only a short identification is displayed. InShell may be installed as a Resident command, if you wish, to speed up its action somewhat. (For a description of the RESIDENT command see your Amiga documentation.) Keyboard Input to Programs ========================== When Sili(CON:) is connected to a Shell process, it becomes the normal Standard Input for that process, and therefore for all the programs run under it. This is often convenient, as it makes for a uniform keyboard input mechanism. However there are cases in which you might rather interact with the program in the shell window itself, and if the program happens to need RAW keyboard input (as opposed to the more usual line-by-line mode) it MUST come from that window. It is easy to arrange this, because Sili(CON:) does not affect the Console Device for that window at all, and the special command line character `*' will refer to this in the usual way. Simply include the input redirection argument `<*' in the command line immediately after the command name itself and the program will take its input from the window rather than Sili(CON:). So to run the standard DOS program `more' (which does expect raw input) from Sili(CON:), you can use: more <* mytext If you do use such redirection, you will usually also want to transmit the command with the Right_Amiga-return combination (see `Command Entry'), so that the shell window is immediately activated for input. This code becomes associated with that command in the history, and the window activates again each time the command is reinvoked. (You can also give the Right_Amiga-return afterwards, of course, but it then is not associated with the command.) Unless the program being run does require raw keystrokes, there is usually no need for redirection. Sili(CON:) passes on the attention characters `control-C;, `-D', `-E', and `-F' directly to the currently selected Shell process. It also will pass on an end-of-file (`control-\') and a `lone' return (even though this is not added to the history). One thing Sili(CON:) does not provide is any direct way to pause scrolling in the shell window. If you are expecting this to be necessary, it is wise to again use Right_Amiga-return as the command terminator, so you get immediate access to the window and can pause scrolling with the spacebar as usual. The `Sili(CON:)' Input Port =========================== As has been mentioned in passing several times, Sili(CON:) uses the ppIPC communication mechanism for interacting with other processes. Not only does it send commands to the channels it is connected to, but it receives information and commands of its own on an IPCPort named `Sili(CON:)'. (If you are addressing this port, be sure you use EXACTLY the characters within the quotes (but not the quotes themselves); case is important, too.) InShell and SiLink open new channels by sending messages to this port, and SiliConfig and SiliDump send their instructions and requests there. The exact protocol of these messages is detailed in an Appendix to the printed manual. One thing it may be useful to know, however, is that it can receive lines of text in the same form as it sends out as commands, and the same as the `IP:' device receives and transmits. Incoming lines are added directly to the history (attached to the currently selected channel). It is therefore easy -- even without SiliConfig from the full package -- to load Sili(CON:) with a convenient set of commands, at start up time or later. Create a file of the desired commands, one to a line. Then copy this (at start up time or later) to the history display with the command: type >IP:Sili(CON:) cmdfile You may find this useful even if you have SiliConfig available, because the current version of this always specifies the channel that each entered line is to be associated with. If you prefer to have the commands loaded into the current default channel, whatever that may be, you may want to use this mechanism. If you do this often, you may even want to define an alias such as: alias get type >IP:Sili(CON:) [] Distribution of this Program ============================ Sili(CON:) is not public domain. The `Sili(CON:)' program, its associated modules, and manual are copyrighted -- All Rights Reserved. Sili(CON:) is distributed as ShareWare. If you find it useful, please send a license fee of $25 (US) to: Pete Goodeve 3012 Deakin Street #D Berkeley, CA 94705 USA (Preferably use the `reg_form' included as a file in this directory, or an approximate copy of it.) In return you will receive a complete version of the system (including all the ancillary utility modules omitted from this Freely Distributable version) and a 40-page printed manual. This version may be distributed without restriction as long as no charge other than a reasonable disk duplication fee is made. The Licensed version provided for the $25 fee is licensed to one user only, and is not distributable. Please do not use this program without paying for it. Every effort has been made to produce a useful, bug-free product and documentation, and this hasn't been cheap on my time! Thanks for respecting the ShareWare Ethic! Pete Goodeve June 1991 --------------------------