[comp.sys.amiga] DME1.25, part 2 to 3

dillon@CORY.BERKELEY.EDU (Matt Dillon) (04/27/87)

	
DOC.TXT

DME V1.25 (c)CopyRight 1987, Matthew Dillon.  All Rights Reserved. This
software may be distributed for non profit only.  This software is
shareware, but I won't get on anybody's case or whine if I don't make any
money from it.

    Matthew Dillon	    contribute if you wish.
    891 Regal Rd
    Berkeley, Ca. 94708

    USENET   ihnp4!ucbvax!dillon
    ARPANET  dillon@ucbvax.berkeley.edu

---------------------------------------------------------------------------

I   Overview
II  Keymapping		keymapping
III Command Sequences	DME commands
IV  File Particulars	notes on loading and saving files
V   Revision Summary	revision numbering
VI  Compiling		compiling instructions

				    I
				 OVERVIEW

See REVISIONS section for revisions.  DME is a WYSIWYG editor designed
mainly for programmers.  Although it is not a word processor, it does
include some word processing features such as Word-Wrap and automatic
paragraph formatting.  Here is a quick 'features' list:

	-control language based on a rich command set accessed manually
	 or via arbitrary mapping of keys.  (Every key may be mapped to 16
	 different things)

	-fast visual response (it scrolls quickly)

	-title-line statistics showing your current position in the file,
	 file name, whether the file has been modified or not, etc...

	-Multiple Windows, ability to iconify windows

	-Word Wrap and automatic paragraph formatting.

DME has been designed to allow easy expansion, and I intend to make many
future improvments.  It has not been designed for user friendliness, but is
straight forward if you read this document fully.

DME can take any number of arguments.  Any argument without a '-' in front
of it is considered to be a file.   Normally, DME will automatically SOURCE
two script file, S:.EDRC, and the .EDRC in your current directory. These
files do not have to exist. These script files usually contain mappings and
do things like turn on word wrap and set the right margin.

    FLAGS:
	    -ffilename	    -source this script file instead of .EDRC
	    -b		    -normally when multiple files are specified,
			     DME opens them with small windows.  This opens
			     them with normal sized windows.

	    -tN     -Open the window on scan line N
	    -lN     -Open the window offset N scan columns
	    -wN     -Make the window N pixels wide
	    -hN     -Make the window N pixels high



				    II
				 KEYMAPPING

MOUSE SELECT (LEFT ) BUTTON:
    There is no designation to map the left button.

    positions cursor at the indicated spot.  The cursor now tracks the
    mouse.


MOUSE MENU (RIGHT) BUTTON:
    There is no designation to map the right button.

    This button iconifies the current active window if not iconified, and
    de-iconifies the window if iconified (Try IT!).  The iconification
    features:
	-Remembers original window size and placement
	-Remembers placement of iconified window when you re-iconify later.

    Currently, you will crash the machine if you run out of memory and DME
    is unable to open the icon window or original window, so be careful.


KEYBOARD:

The rest of the Functional interface for DME is based on keymappings and a
rich command set.  Unlike other text editors, any non-qualifier key in DME
may have any meaning whatsoever.  It just so happens that the default
keymappings assign such things as the `return' key to the RETURN function,
the `up' key to the UP function, etc...  Keys are named by their keycap
labels with the following exceptions:

    the name for Back-Space is	BS
    the name for numeric keypad keys are prepended with an NK, except for
    the Enter key which is named 'ENTER'.
    The four cursor control keys are labeled UP, DOWN, LEFT, and RIGHT

*NOTE*	You must type commands in lower-case, except for text, which can be
either lower or upper case, and for upper-case alpha keys when specifying
keymaps (i.e.  A and s-a are the same key).  The exception is the AMIGA
qualifier key, which uses 'A' instead of 'a'(Alt).

Each key may be qualified with any combination of CTRL, ALT, SHIFT, or
AMIGA Keys.  With four qualifier keys, you can assign up to 16 different
meanings per physical (except qualifier keys) key on the keyboard.

NOTE: The CAPS-LOCK, when lit, is equivalent to SHIFT only for Alpha keys.

NOTE: The AMIGA-ALT (aA) combination isn't very usable since Intuition uses
the sequence to duplicate a Mouse SELECT.  Other AMIGA sequences are used
by intuition for mouse movement and other things.

    ***EXAMPLES:***

    tab tab
    a-a ALT a
    A-a AMIGA a
    sA-a	SHIFT AMIGA a
    s-tab	SHIFT tab
    c-tab	CTRL tab
    ac-?	ALT-CTRL ?
    s-f5	SHIFT F5
    nk0 Numeric Keypad 0
    cs-nk0	CTRL SHIFT Numeric Keypad 0

    ***************

The Default Mappings are as follows:

    All Printable Ascii keys mapped to their ascii equivalent
    BS, DEL, UP, DOWN, LEFT, RIGHT, TAB, S-TAB, ENTER mapped properly

    `s- '       Shift Space is Mapped to space
    backspace	Back Space
    tab Tab
    s-tab	Back tab
    enter	the RETURN command
    return	`return insline up firstnb down'
    esc Escape into command mode
    del Delete character
    s-del	Delete line
    c-del	Remove to end of line
    up		cursor up
    down	cursor down
    left	cursor left
    right	cursor right
    s-up	top of text
    s-down	bottom of text
    s-left	first column
    s-right	last column (one past the last non-blank on a line)
    c-up	page up
    c-down	page down
    c-q Quit
    c-w TOGGLE WORD WRAP MODE
    f1		Prompts for file to insert
    f2		Prompts for new file to replace current text with
    f3		Prompts for new file to place into new window
    f7		Prompts for filename to save marked block to
    f8		Saves current text and then does an 'f2'
    f9		Saves current text, but does not quit
    f10 Saves current text and quits.
    c-r Word Right
    c-l Word Left
    c-i insert mode on
    c-o insert mode off
    c-/ Prompts for search pattern
    c-p search previous occurance
    c-n search next occurance
    c-s `split first down' ... fancy split line
    c-u Unblock a block
    c-b Mark start/end of a block
    a-s SOURCE a block of text as if it were a script file
    sa-s	SOURCE the current line of text as if it were a script file
    a-d delete block
    a-c copy block
    a-m move block
    c-f reformat paragraph
    c-g Prompts for line to GOTO to.
    c-j join next line to this line.


				    III
			     COMMAND SEQUENCES

DME has a rich command set which allows you to embed commands within
commands, or specify multiple commands in a row.  A command consists of a
KEYWORD followed by a FIXED number of arguments (0, 1, 2...).  The argument
delimeter in DME is a SPACE.  Therefore, to embed strings containing spaces
as a single argument, you must surround the string with `string'
(backquote-string-quote).  TEXT to be written as if typed is also specified
via a string in backquote-quotes.  For example:

    right right `hello' right right `hello' enter down
    map f4 `right right' map f5 `left left'
    map f4 ``hello''

Reiterating (because this is important!)... If a command expects ONE
argument, then it really does expect a single argument, and any remaining
arguments are thought to be the next command... so:

    map f4 right
				    -right is only one word, so no need
				     for `'.
    map f4 `right right'
				    -we want to map f4 to two rights... we
				     need the `' or the second right will
				     not be part of the map.

    map c-del `repeat cright del'
				    -this is already implimented as REMEOL,
				     but shown here for clarity.

Some arguments will eventually be fed through the command interpreter more
than once.  The MAP command is a good example.	When you execute a MAP
command, the first run through the command interpreter installs the map
string minus a set of quotes.  So, if you want to specify text, you must
enclose the text in two sets of ``text'' because the map string gets passed
through the command interpreter again when you hit the mapped key.  Here
are some more complex examples:

    map f4 `right right `hello' left left'      *RIGHT*
    map f4 right right hello left left		*WRONG*

    map f4 `map f4 ``hello'''
				    -the first time you hit F4, it's command
				     is to re-map itself to the TEXT `hello'.
				     (gads!).

    map c-i `repeat tr `` '''
				    -example of how to embed a space in a
				     map and repeat (goes through command
				     interpreter three times!).


An easy way to fool around executing commands or making maps is either to
use the ESC key (which enters command mode), or  a-S (alt-shift-s), which
EXECUTES the current DME line that the cursor is on.... so you can use DME
to edit and test your new keymappings.


!!!!!!!!!! NOTE NOTE NOTE NOTE NOTE !!!!!!!!!!!!!! You must type commands
in LOWER case. They are in upper case here for visibility.

    COMMAND LIST



    `text'          -enter text as if typed.
    key     -execute a keymap as a macro (example:  c-a)
    IF cnd act	    -IF/WHILE/IFELSE.. SEE BELOW
    WHILE cnd act
    IFELSE cnd ifact elseact

    ESC     -toggle manual command entry mode
    ESCIMM arg	    -go into command entry mode prompting with a predefined
		     string.
    LAST	    -move one beyond the last non-space in a line.
    FIRST	    -move to column 1
    DOWNADD	    -cursor down.  If at bottom of text, add a line.
    MAP key map     -map a key to a keymap
    UNMAP key	    -unmap a key
    UP		    -cursor up
    DOWN	    -cursor down
    LEFT	    -cursor left
    RIGHT	    -cursor right
    PAGEUP	    -pageup a partial page (see PAGESET)
    PAGEDOWN	    -pagedown a partial page (see PAGESET)
    PAGESET n	    -n PERCENT (0 to 100). page step size relative to the
		     current number of rows in the window.
    RETURN	    -same as `FIRST DOWNADD'
    WLEFT	    -move to beginning of previous word.  If in the middle
		     of a word, move to beginning of current word.

    WRIGHT	    -move to beginning of next word
    BS		    -backspace, moving text to the right of the cursor
		     leftward.
    BACK	    -same as BS
    DEL     -delete char under cursor (cursor does not move),
		     moving text to the right leftward.
    INSLINE	    -insert line
    DELINE	    -delete line
    TAB     -forward tab
    BACKTAB	    -backward tab
    TABSTOP N	    -Set tab stops every N
    NEWFILE name    -replace current text with new file
    INSFILE name    -insert a file into the current text.
    TLATE [+/-]N    -translate character by +N or -N, or set character to
		     exactly N if no + or -. (e.g. TLATE +65 TLATE 3)
    SAVEOLD	    -save current text under current name
    SAVEAS file     -save current text under a different name
    TOP     -Move to Top of File
    BOTTOM	    -Move to Bottom of File
    SOURCE file     -source a script file
    BSOURCE	    -source current text block as if it were a script file
    FIRSTNB	    -Move to first non-blank in line.
    REMEOL	    -Remove text under and beyond the cursor.
    QUIT	    -quit
    FINDSTR string  -SET the search string pattern
    REPSTR string   -SET the replace string pattern
    FIND string     -SET the search pattern and do a NEXT
    NEXT	    -find next occurance of search pattern
    PREV	    -find previous occurance of search pattern
    FINDR s1 s2     -Set find and replace patterns and do one find/rep.
    NEXTR	    -find next occurance and replace
    PREVR	    -find previous occurance and replace
    SPLIT	    -Split line at cursor
    JOIN	    -join next line to line at cursor
    REPEAT cnt comm -SEE BELOW
    INSERTMODE what -set INSERTMODE.  what = on, off, or toggle
    SCREENTOP	    -Move cursor to the top of the screen
    SCREENBOTTOM    -Move cursor to the bottom of the screen.
    GOTO BLOCK	    -Goto the beginning of the marked block
    GOTO [+/-]N     -Goto an absolute or relative line number
    BLOCK	    -Set start or end of block
    UNBLOCK	    -clear the block markers.
    BCOPY	    -copy block before cursor line
    BMOVE	    -move block before cursor line
    BDELETE	    -delete the block
    BSAVE file	    -save the block to a file
    SAVEMAP file    -save user keymappings
    SAVESMAP file   -save all keymappings, including system keymaps
    TOGGLE N	    -flip toggle array entry N	(See IF)
    SETTOGGLE N     -set toggle array entry N
    RESETTOGGLE N   -clear toggle array entry N
    NEWWINDOW	    -open newwindow
    SAVETABS on/off -Optimize file saves by crunching spaces to tabs.  The
		     default is OFF.
    LEFTEDGE N	    -set leftedge in pixels for any new window
    TOPEDGE N	    -set topedge in pixels for any new window
    WIDTH N	    -set width in pixels for any new window
    HEIGHT N	    -set height in pixels for any new window
    RESIZE cols rows-Resize current window. E.G:  `resize 70 23'
    MARGIN N	    -set WordWrap and paragraph formatting margin
    WORDWRAP on/off/toggle  -Word Wrap mode
    REFORMAT	    -reformat paragraph using the margin.


    -------------------------------------------------------------------
    Command which cause a command line to abort (e.g. in repeat, while):

    FIND[R]/NEXT[R]/PREV[R]  when the string is not found.  NEXT stops at
    the end of the file, PREV stops at the beginning.

    DOWN,LEFT,RIGHT,UP	when the operation cannot be done.
    -------------------------------------------------------------------


    REPEAT N arg    -Repeat `arg' N times.  Apart from being a number, N
		     can also be one of:

			line	Current line # (lines begin at 1)
			lbot	#lines to the bottom, including current line
			cleft	column # (cols begin at 0)
			cright	#chars to eol, including current char under cursor
			tr	#char positions to next tab
			tl	#char positions to next back tab

		    Certain commands can abort a REPEAT loop.  Specifically,
		    any FIND[R], NEXT[R], or PREV[R] in which the search
		    string is NOT found will abort a REPEAT.

		    Specifying -1 as N causes REPEAT to go on forever
		    (well, actually, 0xFFFFFFFF times) or until an abort.

    IF [!]condition arg
    WHILE [!]condition arg
    IFELSE [!]condition arg elsearg

	    If the specified condition is true, execute the argument.  For
	    WHILE, the argument is executed until the condition is false
	    (be careful!).

	    the optional '!' inverts the logic.

	    Conditions:

	    #	    if toggle entry # is SET
	    t	    if On line 1
	    b	    if On last line
	    l	    if At column 0
	    r	    if At end of line (spaces below and beyond)
	    m	    if Text has been modified
	    i	    if in insert mode
	    x[<=>]# if column position (starts at 1) is (any OR combo of
		    <, =, or >) than some number.  Example:   x<20
	    y[<=>]# if Line number (starts at 1) is (same as for x)
	    cl	    character under cursor is lower case alpha
	    cu	    character under cursor is upper case alpha
	    ca	    character under cursor is alpha-numeric
	    cn	    character under cursor is numeric
	    c[<=>]# character under cursor is ascii code # (# in decimal)
		    optional conditionals as in 'x' and 'y'.
	    cb	    cursor within a block

	Example: simulating an insert mode toggle: ALT-i (not CTL-i)

     map a-i `ifelse 0 `toggle 0 insertmode OFF' `toggle 0 insertmode ON''

	Example: while lower case, map to upper case and move right.

     map c-U `while cl `tlate -32 right''

     if c<32 ``char under cursor is smaller than 32''
     if c<>32 ``char under cursor is not equal to 32''
     while !b down


    WARNING:	It is possible to get into infinite loops with REPEAT and
		WHILE.	Currently, BREAK is *not* handled by the open
		window, but by whatever executed DME.  That is, you must
		either Ctl-C from your CLI, or send a BREAK to the DME
		process.  I hope to fix this soon.


				    IV
			     FILE PARTICULARS

No Matter what you set internal tabs to, tabs in disk files will be 8. DME
by default doesn't bother to optimize when writing out files and simply
uses spaces.  If you `SAVETABS on' before saving (or in your S:.EDRC,
etc...), DME will attempt to optimize the file by placing TABS in
appropriate places.  DME will not place any TABS after the first single,
back, or double quote is encountered in a line.  If this does not cover
every situation in your particular application that you want to be *sure*
no tabs will occur in sensitive sections, then you should not use `SAVETABS
on'.

The command to save the current document under the default name is SAVEOLD,
*not* SAVE.  SAVE is not a valid command.  This is to prevent people who
have not read the documentation from assuming 'save' takes an argument (and
screwing up their work).  SAVEOLD does NOT take an argument, SAVEAS does.


				    V
			      REVISION SUMMARY

Problems Still not resolved:

    -cannot block move/copy accross windows (must BSAVE to, say, the pipe:
     device)
    -still problems if you resize the window while DME is doing
     continuous screen operations (think it's the graphics library).
    -cannot type CTRL-C to break out of infinite loop... must use
     workbench C:BREAK command.
    -Blocks are not highlighted.
    -no 'dumb user' prompts.
    -no 'change working directory'... though this really isn't a bug.
     putting it in means that I would have to backtrace every filename
     so DME wouldn't get confused.  As it is, I think typing in paths
     isn't much of a big deal for people, so.... poof.


V1.25 RELEASE

    -BSAVE does NOT UNBLOCK after saving (switch in functionality yet again)
    -various bugs fixed (IF, tabs on file save)
    -New Commands: MARGIN, REFORMAT, WORDWRAP, RESIZE,
		   TOPEDGE, LEFTEDGE, WIDTH, HEIGHT
    -Command line options added for setting the window size and an optional
     specified script file (when specified, local .EDRC not sourced).

    -Enhanced Commands: IF  ..more control with conditions, addition of
			      a couple more specifications.
		       JOIN .. functionality slightly changed
    -keymaps may now be used as macros in other commands. (macros)
    -New keymaps added to the default set.
    -Mouse movement cleaned up a little.

V1.24 Internal

V1.23 RELEASE
    -S:.EDRC now sourced instead of C:.EDRC
    -User keymappings now work in COMMAND mode (when you hit ESC).
    -You can now map the Amiga keys ('A' for Amiga, since 'a' is alt).
    -Enhanced Commands: IF/IFELSE/WHILE (optional '!' in front of cond)
			new condition 'cb' 'character in selected block'
			GOTO (can now say `goto block')
    -NewCommands:    PAGESET SAVETABS
    -Writing TABS (always 8) out to disk to save space now supported.

V1.22 RELEASE (BUF FIXES FROM 1.20)
    -'newfile' fixed
V1.21 RELEASE (BUG FIXES FROM 1.20)
    -iconify and window handling fixed
    -left mouse button now tracks the mouse.
V1.20 RELEASE
    -bug fixes: bsave now unmarks the block, bdelete now sets 'modified' flag.
	    (other small fixes).
    -enhancements: overwrite mode status indicator, find, find-replace now
	    completely implemented (yahhoo!!!)
    -changed commands:	FIND NEXT PREV: no longer loop back to the top of
	    file or top->bottom in the case of PREV.  DELINE will now delete
	    text on the line if there is only one line of text.
    -enhanced commands: GOTO REPEAT
    -new commands: SAVEMAP SAVESMAP TOGGLE SETTOGGLE RESETTOGGLE TLATE
		   IF IFELSE WHILE BSOURCE
		   FINDSTR REPSTR FINDR NEXTR PREVR
		   NEWWINDOW
    -new keymappings: (see a-s, a-S, f3)
    -window iconification with mouse menu button.


V1.12 RELEASE
    -cursor is now pen #3 rather than #1.
    -changeover to AZTEC C, smaller executable.
    -now maps shift space to a space.
    -new commands: REMEOL, WLEFT, WRIGHT
    -display bug fixes (SPLIT)
    -FIND/PREV/NEXT will now abort a REPEAT if string not found.

V1.11 RELEASE NOTES
    -Bug fixes (mainly graphical mistakes).
    -User keymappings are disabled in command mode (so you can unmap
      single ascii characters you may have mapped).
    -Illegal key combinations no longer give garbage (e.g. ALT-CURSOR-DOWN)
      you can, of course, still map them to anything you wish.
    -Save now checks for error conditions on write.
    -Uses Default Console Keymap (i.e. no longer assumes USA)... but there
      *is* some stangeness.

V1.00 RELEASE NOTES
    -has find, but no replace function
    -marked blocks are not highlighted
    -assumes USA keyboard		    (fixed 1.11)
    -disk files written out use spaces instead of tabs&spaces
    -No scroll bar yet.


				    VI
				COMPILING


DME now compiles under AZTEC.  You must compile with the 32 bit int option,
but may use the small code/data model.	You must use V3.00 or above of
MY.LIB	(MY32.LIB), dated MARCH 1987

    cc +L -S NAME.c		(for each .C module)
    ln *.o -lmy32 -lc32 +Q


To compile DME under lattice requires the MY.LIB version 3.00 or above:

    lc1 -oram: -iinclude: NAME.C
    lc2 -s -v -oNAME.o ram:NAME.q

    blink lattice:Astartup.obj library lib:my.lib+lib:amiga.lib to ram:dme ND