═══ 1. About Program Editor ═══ Programmers Editor for OS/2 Created by Peter Koller, La vieille Maison d'Anglais, Trebuon, 29530 Plonevez du Faou, France. (...more...) About La Maison d'Anglais La Maison d'Anglais pictured above is a 17th century (169?) weavers cottage of either English or Flemish (Angles) origin. The programs originating therein are the products of Peter Koller, a dedicated Hardware and Software engineer of more than 18 years experience in the design of computers, their software, and their interface to the real world. Program Editor for OS/2 is a product designed to provide a simple, well thought out basis to a program development environment. Although designed for programmers, SysOp's may find this editor useful for editing messy or complex files. Salient features include the ability to run compilers for parsing and customisation using editor scripts. Program Editor provides a substantially User Friendly environment for editing text files. Loading time is short, and cursor movement controls are refined. File EA's are set for new files, click on the file to start the editor. Overview  LOADS of minor features plus...  Customisable edit functions (scripts).  Background Exec to Parse. Test/Make your programs before exiting the editor.  Works with most compilers.  Customizable goto error keys position you at the error.  Extensively MultiThreaded.  Smooth Scrolling.  Well Tested.  Good General Purpose Editor, esp. large files.  Fast, Reliable, Safe. Program editor evaluation copy is a fully functional product for you to enjoy for 30 days. After that, Please Register.... Other products available PM Make PM Make is a programmers make utility that makes use of the PM interface to provide the necessary functions for project maintenance.-  Built in project backup and restore.  User menus defined in the makefile can set compiler, etc., options.  Can include 'global' makefiles as headers.  Can stop on error.  Allows review of error messages.  Force make according to compiler, linker, or user options or make all.  Can make .exe, .hlp, .dll, etc... all in one build.  Background build with 'pop up on error' mode.  Can work in multiple directories, and circumvent tools that won't recognize paths.  Fast.  Applicable to any third party compilers, linkers, or other tools. Enquiries concerning the production of new products, or the inclusion of this product into new products, or the inclusion of features from this product into new products are very welcome. See Also:- Installation. (c) Copyright What is a Script. Note: This product is designed for use with third party products. These third party products have their own copyright. This product does not confer any rights to you in respect of a third party. ═══ 2. Installation ═══ Installation Instructions You must use the Install utility provided if you wish to  Install Program Editor.  Uninstall Program Editor.  Register Program Editor. If you are merely registering, you can uncheck all the buttons before proceeding. The minimum files installed are pmproged.exe, pmproged.hlp, pmproged.eas, and register.doc. That's it !! Enjoy. To uninstall Program Editor run install.exe and select Uninstall, the press Install. Be sure the path and help path is entered correctly before uninstalling. Only those files supplied in the original package will be deleted. You must delete any Objects or Folders by hand. Delete the 'Program Edited' template in the Templates folder and reboot your system. ═══ 3. (c)copyright ═══ This program is the (c) copyright of Peter Koller, La vieille Maison d'Anglais, Trebuon, 29530, Plonevez du Faou, FRANCE. All Rights Reserved. Note: This copyright includes the whole product, including the scripting language format, the installation program, and all documentation associated with the product. 1. You may use the program only on a single machine at any one time.If you have purchased a multiple copy, you may use an according number of copies simultaneously. 2. You may copy the program into machine readable or printed form for backup or data compression purposes. You may not reverse engineer or disassemble the program. 3. You may give this copy to others. You may also charge the end user reasonable costs incurred by your distribution of this product. Please ensure you distribute the entire package as shown below. 4. This product is Shareware. You Must be registered if you continue to use this product after you have evaluated it. Unregistered software will time out after one month. 5. If you have a Customer Registration Code (CRN), you must not disclose it to anyone. Please quote the number shown in the statistics dialog, rather than the full CRN, when seeking technical support. The Author accepts no liability for fitness of purpose, or damages caused whether incidental, or consequential, by the use of this product, howsoever caused. This product is Sold As Seen. In those countries where this statement conflicts with your statutory rights your statutory rights shall remain unaffected. This product consists of install.exe The program install utility. pmpfold.cmd REXX folder creation, used by install.exe pmproged.exe The executable file. pmproged.hlp This help File. pmproged.inf This help File in .INF format. pmproged.eas The extended attributes file (essential) exe.eas The .exe file extended attributes. register.doc The product registration sheet. read.me Late breaking information. uninstal.doc How to remove (uninstall) Program Editor main.scr Main example script. home.scr Home example script eof.scr End of file example script poptab.scr Deindent example script pushtab.scr Indent example script insbkt.scr Insert Brackets example script test.scr Test Message example script killmenu.scr Reset menu example script truncspc.scr Truncate trailing whitespace example script. ═══ 4. File Menu ═══ This menu is used to.- Start a new file. Open an existing file. Save a file. Save a file under a new name (SaveAs). ═══ 4.1. Starting a New File ═══ Select File, then New. If you have typed anything, you will be prompted to save it in a file. Select cancel to abandon the new file command. If you decide to save the file select a save file or cancel to clear the screen and open the new file. ═══ 4.2. Opening a File ═══ Select File, then Open. If you have typed anything, you will be prompted to save it in a file. Select a save file or Cancel. Only then will the Open dialog appear. Double clicking on a directory or drive will select that directory or drive. Single clicking on a file will select that file, while double clicking will load the file and exit the Open dialog. ═══ 4.3. Saving a File ═══ Select File, then Save. If your file has no name, you will be prompted for one. ═══ 4.4. Saving a File under a new name ═══ Select File, then SaveAs. You will be prompted to give a file name. You may also select a new path at this point. Double clicking on a directory or drive will select that directory or drive. Single clicking on a file will select that file, while double clicking will select the file and exit the Save As dialog. If you are overwriting an existing file, you will be required to confirm an appropriate action, where Yes means overwrite the file, No means ask for a new file name, and Cancel aborts the SaveAs dialog. ═══ 5. Edit Menu ═══ This menu is used to.- Undo and then Redo the last action. Cut a Selected area to the clipboard Copy a Selected area to the clipboard Paste from the clipboard over a selected area. Insert Text from the clipboard Clear a Selected area. (ERASE it !!) Find a piece of text Goto a particular line Detab the whole file Select the whole file ═══ 5.1. Undoing Changes ═══ Select Undo from the Edit menu or type alt+backspace to undo the last action. You Cannot undo two different actions. eg. if you type something and then delete a char and then type something else, only the last bit of typing is undone. After an action has been undone, it may be redone. Select Redo from the Edit menu or type alt+backspace. ═══ 5.2. Cutting out blocks ═══ First select a piece of text to hilite it. Select Cut from the Edit menu or press shift+del to copy the selected text to the clipboard and delete the hilited area. See also Copy a Selected area to the clipboard Paste from the clipboard over a selected area. Insert Text from the clipboard Clear a Selected area. (ERASE it !!) Select the whole file ═══ 5.3. Copying blocks ═══ First select a piece of text to hilite it. Select Copy from the Edit menu or press ctrl+ins to copy the selected text to the clipboard, this does not delete the hilited area. See also Cut a Selected area to the clipboard Paste from the clipboard over a selected area. Insert Text from the clipboard Clear a Selected area. (ERASE it !!) Select the whole file ═══ 5.4. Pasting blocks ═══ Select Paste from the Edit menu or press shift+ins to delete any area that may be hilited and then copy any text in the clipboard into the file at the position previously occupied by the hilited area (eg. at the cursor position). See also Cut a Selected area to the clipboard Copy a Selected area to the clipboard Insert Text from the clipboard Clear a Selected area. (ERASE it !!) Select the whole file ═══ 5.5. Inserting blocks ═══ Select Insert Text from the Edit menu or press alt+ins to insert Text at the cursor position. Does not affect any hilited area. See also Cut a Selected area to the clipboard Copy a Selected area to the clipboard Paste from the clipboard over a selected area. Clear a Selected area. (ERASE it !!) Select the whole file ═══ 5.6. Clearing selected text ═══ First select a piece of text to hilite it. Select Clear from the Edit menu or press del to delete the hilited area. Data is not copied to the clipboard. See also Cut a Selected area to the clipboard Copy a Selected area to the clipboard Paste from the clipboard over a selected area. Insert Text from the clipboard Select the whole file ═══ 5.7. Finding text ═══ Select Find from the Edit menu. Find searches for text in the find entryfield. Enter the text you wish to find into the Find entryfield. Until Find has found something, all other options are disabled. Once text is found, it is hilited. You may then 1. Change the text for that in the change entryfield. 2. Change the text as above, and then find the next occurrence. 3. Use any normal editing function, such as cut, copy, paste, typing, etc. 4. Change all occurrences of the text. Note: Find is a separate thread. Try not to edit the file whilst find is actually searching. This is usually not possible because find is fast. ═══ 5.8. Finding a specific line ═══ Select Goto Line from the Edit menu. Enter the line to which you wish to go. The current line is shown in the bottom of the window. If you wish to return to this point make a note of it. ═══ 5.9. Removing tab characters from a file ═══ Program Editor shows tabs as "o". All ascii codes except 0x00,CR,LF,and 0xff are shown as separate characters. Hence all indenting is done with spaces. Note that detabbing a huge file with 1,000,000's of tabs can take a very long time. eg. file has 500 tabs, 5000 chars.. 3 seconds. file has 10,000 tabs,100,000 chars... 25 minutes. Detab Dialog The Detab dialog shows a status bar indicating progress. You may stop the Detab Thread at any time by pressing Stop or the ESC (keyboard) key. You can select a different number of spaces to replace each tab if you wish. The default tabsize is not affected. Each tab in the file will be replaced by the number of spaces indicated. You cannot change the tabsize later, so saving your file before detabbing is recommmended. You must stop the Detab Thread before you can press Cancel. When detabbing is finished the dialog will dismiss itself. You cannot undo a detab. ═══ 5.10. Selecting Text ═══ To select a block of text.... 1. Position the cursor at the start or end of the block you wish to select. 2. Hold down the left mouse button and move the mouse over the area required. OR 1. Position the cursor at the start or end of the block you wish to select. 2. Hold down the Shift Key and use the cursor movement (arrow, home, end, etc.) Keys. Note: The Selected block will be hilited (coloured black?). Because ctrl+ins (copy) and shift+ins (paste) as well as selecting text works in entry fields, you can copy a string to the clipboard and then into the "find" entryfield for example. Similarly, you can copy a script in the "execute" entryfield, paste it into a file, and then save the file. ═══ 5.11. Selecting the whole file ═══ Select "Select All" from the Edit menu. Note: Selecting the whole file enables you to copy the whole file to the clipboard. You can exit Program Editor, and the file will remain in the clipboard. BUT, note that any program that uses the clipboard can overwrite it. However, the saved file is not lost. ═══ 6. Script Menu ═══ Apart from Execute..., all other menu items (if there are any) are setup by a script. These menu items could be anything you like. See also 1. What is a script 2. Script Command Structure 3. Script Command Chains 4. Script Looping Chains 5. Script Command List 6. Script Variables 7. Script Limitations ═══ 6.1. What is a script ═══ Overview Scripting is the automation of normal edit functions, eg type, delete, cursor control etc. Each script command performs the equivalent of a normal edit operation. By having a script chain, the operations thus performed can become quite complex. Scripts can be typed directly into the Execute.. dialog. They can also be saved as a file and then be called from another script. They can also be set as a menu item. This is usually done by the Main script which is always run on startup. Scripting is designed to be simple. Internally, each script command calls the same function that a keypress would call. Because scripting is designed for repetitive tasks, repetition controls are built in. Scripting does not allow you to perform some of the more complex tasks, as these could cause a disaster if the script has errors. Scripts tend to be short and terse. Here is a script to go to the start of a line and delete a tab's worth of characters if not already at the end of the line. home[,,loop[tab,,!eoln[,,del[,,] This reads as keys HOME, (repeat tab times, (if not at end of line), DEL ) The editor is literally typing for you. This is a Chain. Scripts can contain many chains. Here is a chain that goes to the start of the file if "Hi" is not found- find["Hi",1,!ishil[,,abs[0,,] /this is a comment/ Here is one to change all "hi"'s to "ho"'s- loop[200000/...any BIG number! /,,find["hi",1,ins["ho",1,] Delete all "ho"'s loop[file,,find["ho",1,clear[,,] / note:- file = filesize / Scripting is ideal for automating repetitive typing tasks. For example, you wish to make a batch file to backup all the files beginning with 'a'. So you type 'dir a*.* > back.cmd', and then you edit in 'arc -a' etc. for each entry, deleting all the unwanted rubbish along the way. How BORING. It's much more fun, and easier to automate the editor to do it for you. And you can re-use the script whenever you want. Look at the examples provided and experiment. See also 1. Script Command Structure 2. Script Command Chains 3. Script Looping Chains 4. Script Command List 5. Script Variables 6. Script Limitations ═══ 6.2. Script Command Structure ═══ Each command has the following- command[(parameter),(parameter),(command[....etc) eg left[,, 1. Strings in "quotes" are not parsed. 2. Comments are anything between / ...and... /. 3. WHITESPACE eg space, tab, enter are ignored. 4. Space, newline and tab characters are ignored unless in quotes "..." 5. Each command gets and passes along a flag. Some commands respond to this flag, some set it, and some do both. See also 1. What is a script 2. Script Command Chains 3. Script Looping Chains 4. Script Command List 5. Script Variables 6. Script Limitations ═══ 6.3. Script Command Chains ═══ Commands are always constructed into CHAINS. Command chains are executed left to right. Almost every command in a chain is called only if the previous command returns TRUE. But there are some exeptions. All commands either alter the flag, or pass along the old one. The flag may be TRUE or FALSE. Each chain must be terminated with ]. This allow a new chain to start, or the current chain to loop. Each new chain starts with the flag set TRUE. Here are examples of valid chains- loop[20,,ins["hello,there",1,crins[1,,ins["fred, how are YOU !!!",1,crins[1,,] loop[1000,,!eoln[,,right[,,] / ..walk the file / exec["insbkt.scr",,] left[,,] ins /say hello/ [hello,2,] These are invalid or incomplete chains- ins[hello,2] / missing comma / right[] / missing two commas / !stl[,,abs[0,, / exit not defined / any number of chains may be contained in a given script. See also 1. What is a script 2. Script Command Structure 3. Script Looping Chains 4. Script Command List 5. Script Variables 6. Script Limitations ═══ 6.4. Script Looping Chains ═══ This is a looping chain- loop[20,,/...commands.../] loops may be nested... loop[5,,right[,,loop[2,,down[,,]] / go right 5x down twice / Loops may be nested up to about 20 deep. Valid loop counts are from 0 to 2^32-1 eg 4,294,967,295! Other valid loopcounts include hpos or vpos. See Variables Loops exit if the chain returns false- loop[file,,/ ...commands in here... /!eof[,,down[,,] /will exit loop at end of file / loop[10000,,false[,,] /will exit immediately/ In fact loop responds to flag on input and output. This enables fine control of loop starting and ending. Using the false and true commands allows you to construct some weird chains. Here the п symbol is used to show how the flag is passed:- new chain == TRUEпloop[,,пcommand[,,п] TRUEпcommand[,,п etc. so... loop[20,,!eoln[,,loop[100,,!eoln[,,del[,,]] and now showing flag... TRUEпloop[20,,!eoln[,,???пloop[100,,!eoln[,,???пdel[,,???п(loop if true)] TRUEп] In the above example, note the outer loop is forced to loop, regardless of the exit state of the inner loop. Note also that the ] character is not always the end of a chain. You could have loop[1,,loop[2,,loop[3,,up[,,]up[,,]up[,,] as a complete chain. Note the eoln test used both inside and outside the inner loop. Note that a test could be put just before the ]. eg. loop[..down[,,!eof[,,] See also 1. What is a script 2. Script Command Structure 3. Script Command Chains 4. Script Command List 5. Script Variables 6. Script Limitations ═══ 6.5. Script Command List ═══ Note that blank or incorrect variables resolve to 0, eg abs[,,] == abs[0,,] and abs[rubbish,,] == abs[0,,] 1. Commands that return a condition paste instxt cut clear find exec ishil !ishil false true eof !eof stf !stf eoln !eoln stln !stln istxt !istxt inhil !inhil 2. Commands that ignore the previous condition. false true paint sysptr eof !eof stf !stf eoln !eoln stln !stln 3. All other commands. up down left right leftwrd rightwrd tabmov backtab home end txthome txtend line abs copy del backsp hilite hilst hilend hilall ins ovr crins crovr tabins tabovr tabsize gethpos getvpos add sub set txtset loop menuitem See also 1. What is a script 2. Script Command Structure 3. Script Command Chains 4. Script Looping Chains 5. Script Variables 6. Script Limitations ═══ 6.6. Script Variables ═══ Variables can be used in any script command that uses numbers. 1. Numeric Values, variables, and constants. Numbers go from 0 to 4,294,967,295. hpos vpos scr1 scr2 tab file fpos abs bklc bkrc bklr bkrr bkls bkrs hst hend true false zero Note: Blank or incorrect variables resolve to 0, eg.- abs[,,] == abs[0,,] abs[rubbish,,] == abs[0,,] See also 1. What is a script 2. Script Command Structure 3. Script Command Chains 4. Script Looping Chains 5. Script Command List 6. Script Limitations ═══ 6.7. Executing a script ═══ Just in case you screw up your file save it first. Type a script into the entryfield and press Execute to run it, Ok to set the script but not run it, or Cancel to abandon what you have entered. Because ctrl+ins (copy) and shift+ins (paste) as well as selecting text works in entry fields, you can copy a string to the clipboard and then into the "execute" entryfield for example. Similarly, you can copy a script in the "execute" entryfield, paste it into a file, and then save the file. Note: It may not be possible to undo the action performed Note: You can interrupt running scripts with the ESC key See also 1. What is a script 2. Script Command Structure 3. Script Command Chains 4. Script Looping Chains 5. Script Command List 6. Script Variables 7. Script Limitations ═══ 6.8. Script Limitations ═══ Script files are limited to 4096 characters in total. This includes spaces and comments. Scripts slow down substantially when files are large enough to require disk swapping. Function names are limited to 20 chars. Parameter strings are limited to 511 chars. Loop Counts are limited to ULONG's (2^32 - 1) Loop Nesting Depth is limited to 19. A maximum of 8 menuitems may be added to the script menu. There is little error checking. Unrecognized commands are often ignored. You may execute a number of valid commands before an error occurs because chains are not parsed but merely chained. Save your file before executing a new script. ═══ 7. Options Menu ═══ Allows you to setup the various editor options. All options are retained on exit. See Also Setting the font size Setting the tab size Setting AutoSave Setting 'Use EOF' Colour Options Setting the script path Setting the Parse Profile ═══ 7.1. Setting the font size ═══ You may only select the sizes of the monospace fonts. This is deliberate, so that indenting is correct. Program Editor does not use the standard font dialog. This allows all font sizes to be enumerated, regardless of display (and eye) capabilities. Each font shows it's find index, that is the order in which it was found. This number is of no consequence, and is used to index an internal font table. You may nevertheless find it a useful pointer to the current font in the listbox. From V1.20, you may use any monospaced font Program Editor finds. The current font and it's index are shown above the listbox. The current font size is shown until you select an alternative. Select Apply to view the new font. If you press Cancel, the display will revert to the original font. You may thus safely preview fonts on the text window. The font dialog is a seperate thread. See Also Colour Options Warning Small or inappropriate fonts can cause severe headaches and/or eyestrain! ═══ 7.2. Colour Options ═══ You may drag and drop colours onto the Program Editor text window. The only colours accepted are Solid Colours. Some background colours will make the cursor difficult to see. To allow you to change font colours, a little coloured square is shown during the font dialog. You may drop colours onto this square to change the text colour. If the text colour chosen is the same as the background colour the text will disappear. Window and text colours are retained on exit. ═══ 7.3. Setting the tab size ═══ Enter the number of spaces to type when you press the Tab key. Please ensure that you select a number that is sensible eg >1 and <255. This value is not checked for errors. ═══ 7.4. Using Autosave ═══ When Autosave is enabled, Your file will be saved after a number of key presses. Any keypress is counted, including arrow keys. 100 is the recommended default. This setting is saved on exit. ═══ 7.5. Use EOF character ═══ The EOF character delimits the end of a text file. This usually causes no problem and therefore should always be set. If you DO have a problem, eg. with a compiler, setting EOF off strips the EOF character from your file on saving. Note: Program Editor will always show an EOF character. This is useful if there are a lot of useless and normally invisible spaces or lines at the end of the file. ═══ 7.6. Setting the script path ═══ If you have installed the supplied "*.scr" files into the current directory you may not need to perform this step. Enter the full path and filename (including the extension) of your default script. The path is where Program Editor looks for all script files and "pmproged.eas". The script filename is always run on startup. You must have a startup script file, or you will get an error message. This main script file is the ideal place to setup your own script menu. Once the script path is set, you can setup an alternative startup script on the Command Line. This allows you to customise Program Editor to a number of different uses. Note: Always type the full path and script filename including it's file extension. ═══ 7.7. Setting the Parse Profile ═══ The first item is the command to compile a file, whilst the second is a script to find the numeric positions of any errors found. You are not limited to any particular language, but the compiler must issue errors and warnings to STDOUT or STDERR. If not, you may be able to use /e on the Command Line to specify an error listing. You must save the file before executing the command, as the saved file is the one that is parsed. $$(file) is used to set a filename into the command string. (see below) I use the following with IBM C Set++ **. Command.- icc /Fo- /C /Gm /Ss /W3 $$(FILE) Find Script.- set[hpos,0,set[vpos,0,] /* clear vars*/ home[,,] /* start of line*/ find["(",,txtset[vpos,,]/* get vert*/ find[":",,txtset[hpos,,]/* get horz*/ sub[hpos,1,] /*icc counts from 1, pmproged from 0 */ sysptr[vpos,hpos,] /* set goto*/ hilite[false,,] /*turn off hilite in error list*/ Redirect.- Set to STDOUT Note: ** IBM C Set++ (c) IBM . Registered trademarks of International Business Machines Corporation. ═══ 7.8. Statistics ═══ This dialog shows the internal state of Program Editor. All the items are fairly self explanatory. To work out the total memory used add the edit and error file 'memory used' hexadecimal values together and add 0x1000 for scripts. ═══ 8. Command Line Options ═══ pmproged (options) filename eg pmproged /eerror.lst /g100 /smyscript.scr myfile.c If you have a number of different objects for program editor, you can put different options into the parameters field of each object. To find out more about the different things that can be achieved by object settings, look at the OS/2 system documentation. These are the options available. /e ...Load an error list file into memory /g ...Goto line /s ...Load a script and execute it instead of the default Note: There is no space between options and their contents. /s, /S, -s, and -S, (where s is an option) are all equivalent. ═══ 9. Parse Menu ═══ Allows you to parse source files. You are not limited to any particular language, but the compiler must issue errors and warnings to STDOUT or STDERR. If not, you may be able to use /e on the Command Line to specify an error listing. See Also Command Line Options Setting the Parse Profile ═══ 9.1. Parse File ═══ This option allows you to parse a file. The file that is parsed is the one on disk, specified by the current filename. You must have a file open on the screen and saved before parsing. You must also have set up a valid parse profile. You are not limited to any particular language, but the compiler must issue errors and warnings to STDOUT or STDERR. If not, you may be able to use /e on the Command Line to specify an error listing. A small icon to the far right of the menu bar indicates the parse status. You may continue to edit during a parse. The icon will disappear after the parse is complete and you select the Parse menu. You can look at the errors found by using the View Error List menu option. The file is being parsed. Parse has found errors. Parse has found no errors. See Also Command Line Options Setting the Parse Profile ═══ 9.2. First Error ═══ If you have an error list loaded, and a correct parse profile, this item will place you at the first error that was found. This is not necessarily the point where the error occurred. See Also Command Line Options Setting the Parse Profile Parsing a file ═══ 9.3. Next Error ═══ If you have an error list loaded, and a correct parse profile, this item will place you at the next error that was found. This is not necessarily the point where the error occurred. See Also Command Line Options Setting the Parse Profile Parsing a file ═══ 9.4. Previous Error ═══ If you have an error list loaded, and a correct parse profile, this item will place you at the first error that was found. This is not necessarily the point where the error occurred. See Also Command Line Options Setting the Parse Profile Parsing a file ═══ 9.5. View Error List ═══ If you have an error list loaded, this item will allow you to view the error list. Note that the File menu will be disabled while viewing errors. See Also Command Line Options Setting the Parse Profile Parsing a file ═══ 10. Help Menu ═══ To make Program Editor quick at starting, Help is not automatically enabled. On a slow PC this makes Program Editor much faster, and on a fast PC, it's only slightly more difficult to get help. Many users may not even notice the difference. Having made it to here, help is now Enabled. To enable help select Help from the menubar or press the F1 key. Help will also automatically be enabled when selecting a Help button in a dialog. Until help is enabled pressing F1 during a menu selection will have no effect. If help is enabled select Help.. and then the topic of interest. If no specific help is available, the About page is displayed. See Using Help for a more detailed description of the help system. The About page is also found in Help.. General Help.. on the menubar. ═══ 10.1. Keys Help ═══ Where a (+) sign is shown, this means press both keys together. Hold down the first key, and then press the second. Key Action Home Go to start of line. Alt+0(zero) Go to start of file. Ctrl+Home Go to start of text. (Skip indent) End Go to end of line. Ctrl+End Go to end of file. Page Up Go up one page. Page Down Go down one page. Arrows Move in the direction of the arrow. Ctrl+Left Go to start of next word. Ctrl+Right Go to start of previous word. Shift+Any... Hilite the text while moving, use any key sequence above. Delete Delete char to right of cursor. Backspace Delete char to left of cursor. Insert Toggle insert mode F1 Help Enable, then Help. ESC Abandon execution of parse, detab, find, or script. Others... ...Shown next to menu item Note: Not all menu items have a shortcut key. ═══ 11. The Status Line ═══ The status line at the bottom of the text page displays information relevant to the current position in the file. Status Information 1. OVR or INS, indicates whether you are in insert or overtype mode. If you are in overtype mode, the cursor changes from a line to a box. You cannot overtype the end of the file. 2. Display Line, indicates the line number of the top visible line on the screen. As you can look at a point in the file unrelated to the cursor position, this number is usually different to that of the cursor. 3. Cursor, indicates the current cursor vertical, and horizontal position. This is where to look if you cannot find your cursor on the screen. 4. @, indicates the current file position in characters, counting from zero at the start of the file. 5. Brackets, indicates the number of mismatched brackets in the file. If you have more open brackets than close brackets, the number of odd brackets and their type are displayed. With practice, this is a great way of checking bracket nesting in "C". (but sadly no use for scripts) ═══ 12. Hints and Tips ═══ Parse Profile The easiest way to set up a parse profile is probably as follows.-  Create a source file full of errors.  Run your compiler and make a note of the options used.  Check that the compiler displays a list of errors.  Open the source file with program editor.  Setup the parse profile to run the compiler with the same options as before.  Type a dummy script in the script entryfield of the parse profile. eg abs[0,,]  Parse the file.If no error list is created experiment with the redirection buttons.  View the error list, select all, and copy.  View the file, and select new. Select Paste.  Save the error list with a new name using Save As. You can now experiment with the Error list. The first, next, and previous error menuitems function like this.- First Error Goto line 1 Next Error Go down a line Previous Error Go Up a line What you do next is rather dependant on the error list. The script file must be able to position itself on the error linenumbers so that you can use txtset[,,] to read them. Do not use sysptr[,,] yet, you will add that later. If your compiler does not issue error line numbers you cannot proceed. Develop and test your script using the execute script dialog. Satisfy yourself that the script will find the error number from the start of the line, and then use home[,,] to put you there. You should end up with something vaguely like this.- home[,,] find["???",true,txtset[scr1,,] find["???",true,txtset[scr2,,] If your compiler numbers lines from 0, you will have to use add[,,] to add 1 to the line number. Copy the script to the parse profile and add the sysptr[,,] command. If you don't have a horizontal error position leave it blank. Your final parse script will look something like.- home[,,] find["???",true,txtset[scr1,,] find["???",true,txtset[scr2,,] sysptr[scr1,scr2,] Script Path Program Editor uses the script path setting to obtain associated files. 'Scrip Path' is really an inadequate name, because not only scripts should be placed here, but any future internal files that may be issued for later versions. The file pmproged.eas is placed here for example. When you save a New file, Program Editor calls EAUTIL to set the extended attributes to those contained in pmproged.eas. If the file is not found, or EAUTIL fails for some reason, the new file will not have the correct extended attribute. AND YOU WILL NOT BE WARNED. It is not inconceivable that someone may wish to create their own version of pmproged.eas, but if you get it wrong, you may create 'orphan' files. eg 'Caveat Emptor'!! BEWARE. If you use the supplied install utility, you should not go far wrong. But don't forget to set the script path, it does more than you think!! Script Menu There are several ways in which script menu's are used. You can have a main script which allow you to select a whole new menu. The main script would load a script which first deletes all or some of the menuitems, and then adds it's own. Bear in mind that anything complex soon becomes burdensome, keep it simple. Have a look at killmenu.scr and main.scr to see how menu's can be controlled. If you use exec[,,] it must be the last command in a script, unless the script resides in the execute script entryfield the executed script overwrites the calling script. You can consider exec[,,] to be like a goto, not a gosub. When you select a script menuitem, the editor calls exec[,,] itself. Use the truncspc.scr script to strip trailing spaces. This can substantially shrink file sizes. ═══ 13. The Problem Page ═══ Not many so far..  Mouse pointer sometimes shows a clock. Moving the mouse outside the text area restores the cursor. This appears to be a bug in VIEW.EXE the help system.  If line ends are incorrect please ensure that you do not confuse the file by having CR without LF, or worse, LF then CR, in the file. This can theoretically happen with scripting or by using AltGr. The correct end of line is CR+LF in that order. You can 'workaround' by using the System Editor to open the file, modify, and then save it. Typing space followed by backspace modifies the file. Or, you can transfer the file through the clipboard.  (fixed?)If the bracket counters get confused, going to the start of file will reset them.  (V1.20)Opening Find or Detab during a parse dramatically slows down the parse but allows Find or Detab adequate time to function. (Fix.. get a Cray!)  Please report problems to me. Fixes in V1.20 1. Improved text selection mechanism. 2. Improved handling of cursors and pointers during focus and activation changes. 3. Fixed bug in bracket counters. 4. Fixed memory deallocation failure in parse command. 5. Rewritten parse runs in background. 6. Updated this file. 7. New and updated script commands. Backward compatible. 8. Improved detab with dialog. 9. Added Statistics dialog. 10. Faster load times. Note: CR and LF are carriage return (AltGr+13) and line feed (AltGr+10). ═══ ═══ eg. gethpos[,,] Set by.  gethpos  Maths functions Used by.  All. ═══ ═══ eg. getvpos[,,] Set by.  getvpos  Maths functions Used by.  All. ═══ ═══ eg. set[scr1,20,] Set by.  Maths functions Used by.  All. ═══ ═══ eg. set[scr2,20,] Set by.  Maths functions Used by.  All. ═══ ═══ Size of a tab eg. set[scr1,tab,] Set by.  tabsize  System. Used by.  All. ═══ ═══ Size of file eg. loop[file,,] Set by.  System. Used by.  All. ═══ ═══ Number of lines in the file eg. loop[fpos,,] Set by.  System. Used by.  All. ═══ ═══ Current absolute cursor position eg. loop[abs,,backsp[,,] /delete to start of file/ Set by.  System. Used by.  All. ═══ ═══ Start of hilite eg. abs[hst,,] Set by.  hilst  System (eg. using the mouse). Note: hst is always less than hend. Used by.  All. ═══ ═══ End of hilite eg. abs[hend,,] Set by.  hilend  System (using the mouse). Note: hend is always greater than hst. Used by.  All. ═══ ═══ True equals 1 eg. loop[true,,] /loops once/ Set by.  System. Used by.  All. ═══ ═══ False equals zero eg. abs[false,,] /goto start of file/ Set by.  System. Used by.  All. ═══ ═══ bklr, bkrr, bklc, bkrc, bkls, bkrs Bracket counters bk(l,r = left or right)(r,s,c = round, square, or curly) Set by  System. Used by.  All. ═══ ═══ Zero eg. abs[zero,,] /goto start of file/ Set by.  System. Used by.  All. ═══ ═══ paste[,,] Paste from Clipboard.Deletes hilited area. Returns clipboard data valid(eg success). ═══ ═══ instxt[,,] Insert text from clipboard. Does not delete hilited area. Returns clipboard data valid(eg success). ═══ ═══ cut[,,] Copy text to clipboard and delete hilited area. Returns hilited flag. ═══ ═══ copy[,,] Copy text to clipboard. Leaves hiliting unaffected ═══ ═══ clear[,,] Delete hilited area. Returns hilited flag. ═══ ═══ find[value,flag,] eg. find["hello",true,] Find text in file and hilite it. If flag is true the find is case sensitive, otherwise it isn't. Returns TRUE if found ═══ ═══ ishil[,,] and !ishil[,,] Check to see if hiliting is on or off. Returns TRUE if condition is met. ═══ ═══ exec["filename",,] Load the script file into memory and execute it. Exec must be the last command in a script because the new script overwrites the old. Returns false on failure. ═══ ═══ true[,,] and false[,,] Return 1 and 0 respectively. Ignore Previous Flags !! ═══ ═══ eof[,,], !eof[,,], stf[,,], and !stf[,,] Test to see if at the end or start of the file. Returns TRUE if condition is met. ═══ ═══ eoln[,,] and !eoln[,,] Test to see if at the end of a line. Returns TRUE if condition is met. ═══ ═══ stln[,,] and !stln[,,] Test to see if at the start of a line. Returns TRUE if condition is met. ═══ ═══ del[,,] Delete character to right of cursor. ═══ ═══ backsp[,,] Delete character to left of cursor. ═══ ═══ istxt[value,flag,] and !istxt[value,flag,] eg. istxt["hello",true,] Test text in file. If flag is true the test is case sensitive, otherwise it isn't. Returns either TRUE or FALSE if the text strings match. ═══ ═══ inhil[,,] and !inhil[,,] Test to see if the cursor is in the hilited area. Returns TRUE if condition is met. ═══ ═══ paint[,,] Repaints the text screen. Use sparingly as this slows scripts down a great deal. No return flag specified ═══ ═══ sysptr[vertical,horizontal,] Currently only used by parse scripts, Sets the vertical and horizontal position for the First, Next, and Previous Error commands. Ignores the previous flag state. No return flag specified ═══ ═══ abs[value,,] Goto the absolute file position specified in value. eg. abs[0,,] /go home/ ═══ ═══ menuitem[menuitemtext,filename,] eg. menuitem["Insert {..}","insbkt.scr",] Insert new menuitem into script menu. note that the menuitem must be able to find the named script file in the SCRIPT PATH and load it into memory. Note: false[,,menuitem[,,] deletes the last menuitem. ═══ ═══ leftwrd[,,], rightwrd[,,] Move the cursor to the start of the previous or next word ═══ ═══ left[,,], right[,,], up[,,], and down[,,] Move the cursor in the direction indicated. ═══ ═══ tabmov[,,] Move the cursor to the next tab position. Will not cross to the next line. ═══ ═══ backtab[,,] Move the cursor to the previous tab position. Will not cross to the previous line. ═══ ═══ home[,,] and end[,,] Goto the start and end of the current line. ═══ ═══ txthome[,,], txtend[,,] Positions the cursor at the start or end of text. txthome[,,] works like Ctrl+Home on the keyboard by moving to the start of a line and skipping all leading whitespace. txtend[,,] stops at the beginning of any trailing whitespace. ═══ ═══ line[vertical,horizontal,] Goto Line number. Vertical must be 1 or greater. Horizontal starts at 0 and must not be greater than the line length. ═══ ═══ hilst[,,], hilend[,,], and hilall[,,] Set hilite start or end to current position. Start can be greater than End. There are no restrictions. Hilall hilites the entire file. ═══ ═══ hilite[flag,,] Turns on hiliting if flag is not equal to 0. Else turns off hiliting. ═══ ═══ ins[text,quantity,] and ovr[text,quantity,] Inserts or overtypes text, quantity number of times. eg. ins["hello",1,] ═══ ═══ crins[quantity,,] and crovr[quantity,,] Insert or overtype quantity number of new lines eg. crins[5,,] /insert 5 new lines/ ═══ ═══ tabins[,,] and tabovr[,,] Insert or overtype a tab. Tabsize can be set by tabsize[size,,] ═══ ═══ tabsize[value,,] Set default tab size.This is not system wide and is restored on exit. ═══ ═══ gethpos[,,] and getvpos[,,] Load current cursor horizontal or vertical cursor position into hpos and vpos. ═══ ═══ set[variable,value,], add[variable,value,], and sub[variable,value,] Mathematical operation affects variable by adding, subtracting or setting with value. eg. add[hpos,20,] ═══ ═══ txtset[variable,,] If there is a number in the File (or Error List), then variable is set to that number, else zero. Used mostly by Parse scripts. eg. txtset[vpos,,] ═══ ═══ loop[value,,] The command chain repeats until quantity is reached or a command returns FALSE. eg. loop[1000,,!eof[,,right[,,] will step right 1000 times or to end of file, whichever occurs first. Note loops can be flagged on entry OR on exit, or both. Because instructions are executed in turn, odd results may occur if some care is not taken with complex looping scripts. Remember, the flag is passed from instruction to instruction within the chain. eg. This is not valid.. false[,,loop[20,,true[,,ins["hello",1,] /never notices loop instruction at all/ ... equivalent to.. ins["hello",1,] But this is valid.. loop[2,,ins["hello",1,right[,,!eoln[,,] /will insert at least 1 "hello"/ This is also valid.. eoln[,,loop[2,,crovr[1,,] /do loop if end of line / Or.. loop[file,,istxt["{",,del[,,true[,,!eof[,,] /force loop to do whole file/