
			   JEd V2.07 16-Jan-93
		     Yet another programmer's editor
		     Copyright (c) 1992-3 John Harper


Contents:
    Introduction
    Disclaimer
    Distribution
    Installation
    Startup
    Command Language
    Keyboard Mappings
    ARexx
    Title Bar
    Miscellaneous Notes

    Command Index
    Command Groups
    Provided Macros
    MakeRefs

    History
    Known Bugs

    Contact Address


Introduction.
*************

JEd is a text editor best suited to programming, it has no text formatting
capabilities (except for a dumb wordwrap). I wrote it because I found that
no available editor suited me perfectly - this one does (maybe). You may
have seen my previous attempt at this goal, JEd 1.something, version 2 is
similar in some respects but completely different in others.

If you are looking for a straightforward, user-friendly editor -- look
somewhere else :) but, if you want a non-restrictive editor which can be
made to do almost anything you want then read on...

a quick feature list:
    * totally customizable, all keys may be made to do anything,
    user-definable menu bar, etc...
    * powerful programming language
    * multi-file/multi-view editing
    * number of windows is only limited by memory
    * clipboard support (cut/paste on any unit)
    * any window can have any (non-proportional) font
    * maximum number of lines in a file is 2147483648, each line can have up
    to 32768 characters in it.
    * fast enough, even when working with large files on a 68000 cpu
    * line-undo feature
    * windows can open on any public screen (usually the Workbench)
    * full Un*x-style regular expression support (searches & substitutions)

 JEd needs system 2.0 or later.


Disclaimer.
***********

THIS PROGRAM IS PROVIDED ON AN `AS IS' BASIS, NO WARRANTIES ARE MADE, EITHER
EXPRESSED OR IMPLIED. IN NO EVENT WILL I, JOHN HARPER, BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING FROM ANY USE
OR MISUSE OF THESE PROGRAMS. THE ENTIRE RISK AS TO THE RESULTS AND
PERFORMANCE OF THIS PROGRAM IS ASSUMED BY YOU.


Distribution.
*************

Distribute these files as much as you want, from now on and until further
notice they are classed as freeware and may not be sold for more than a
nominal fee to cover disks, etc.

You should be able to get the latest version by anonymous ftp from
amiga.physik.unizh.ch or any of its mirrors, probably in the aminet
directory util/edit.

I certainly won't refuse any donations sent to me but there is no
obligation.

If you want the latest version send me a disk and return postage and you'll
get it. If you just send a disk you probably won't see it again (I'm only a
poor student you know :-)


Installation.
*************

Copy the executables, jed, makerefs and pubman, to somewhere in your path.
Create a directory s:jed and copy the contents of the macros directory into
it.

These system libraries are needed in libs:
    asl.library
    diskfont.library
    iffparse.library

The clipboard.device is usually needed in devs:
If you want to use the ARexx interface ARexx should be running.

Note:
    If you want to increase the editor's scrolling speed make sure that the
    commodities.library hasn't installed it's input handler. As long as no
    program has the library open it should be OK, ie, don't have any
    commodities installed, use DMouse or something similar instead. If you
    don't believe me try scrolling through a file with no cx, then 'run
    exchange' and try it again. I think that you only need to do this if you
    have a 68000 cpu, it certainly works on my Amiga.


Startup.
********

JEd can be run from the CLI or the Workbench, no files or options can be
specified when running from Workbench but CLI command line has this format,

    FILES/M,PUBSCREEN/K,DTAB/N/K,CD/K

the individual keywords represent,

    FILES	files to load/create
    PUBSCREEN	public screen to open on
    DTAB	size of tabs in files
    CD		editor's current directory (see cd)

The first window's preferences are loaded from the file s:jed.config, this
file is created whenever the last editor window is closed. As well as
containing all options set by the 'setpref' command it stores the dimensions
of the last window as well.

After loading any files specified by the command line the script file
jed-startup is executed, this can contain any normal JEd command strings, it
is looked for first in the current directory and then (only if not already
found) in the s:jed/ directory and then the s: directory. This file is
normally used to create keybindings, macros, maybe load a menu if you want,
etc...

If you don't supply a startup file the editor will be totally unusable (but
you can quit :-) since initially all keys (except the cursor keys) just
insert the characters that they are mapped to by the system keymap.


Command Language.
*****************

Although it is possible to use JEd without understanding its script language
*much* more power can be got with a full understanding. That is what this
chapter tries to give.

There are only two data types to deal with, these are strings and numbers.
The language heavily enforces data typing in that it is (almost) impossible
to pass a number when a string is needed, if you do manage to do this (maybe
when formatting a string) you could well pay a visit to the guru's
replacement.

Variables, on the other hand, have less typing, they assume the type of
whatever is assigned to them.

Programs are stored in command strings, which are built up from clauses.

See also,
    Value, String, Number, Command String, Clause.


Value.
======

A "value" is an item of data, either a number or a string.

See also,
    Number, String


String.
=======

A "string" is an array of characters.


Number.
=======

A "number" is a signed 32-bit integer, ie, any whole number from -2147483648
through zero to +2147483647.


Command String.
===============

A command string is a collection of clauses, one after the other. The value
of the command string is the value of the last clause in the string.

Some examples of valid command strings are,

    (settitle `foo')
    (global `date' (info `date'))(settitle (date))

Note that comments may be inserted between any clauses in a command string.

Also note that just because I have called command strings _command_ strings
they don't have to contain symbol (or command) clauses. It is totally
acceptable to have a string of string clauses or any other clause type. This
is often very useful, for example by putting string or number clauses into
the command strings of the if command you can simulate the C languages
ternary operator, ie,

(settitle (if (getpref `scrollhack') ``s'hack is on'' ``s'hack is off''))

this sets the title bar to a string representing the status of the
'scrollhack' preference option.

See also,
    Clause, Value, Comments


Comments.
=========

Comments may be inserted between any clauses in a command string (the same
is also true about whitespace characters).

Comments are introduced by the ';' character, when a ';' is encountered the
rest of the current line is disreguarded. ie,

    (move `l' 20)   ; this is a comment,
    (settitle	    ; and so is this.
	`foobar')

Actually there is a problem with comments, if they are inside a string, eg,
in a command string which is to be a macro the comments will not be stripped
until the command string is executed. If the comment contains un-escaped
quotes or braces the string will be prematurely terminated and things will
go wrong. eg,

    (macro `amacro'
    {
	(settitle `hello')  ; this is ok until I put in a ' or a ` or {}
    })

to fix this you can put in escape characters like,

    (macro `amacro'
    {
	(settitle `hello')  ; this is ok until I put in a \' or a \` or \{\}
    })

alternatively just don't put these characters in comments inside strings.


Clauses.
========

Clauses are the most elementary part of a command string, every clause has a
clearly defined value (even if that value is defined as being void, ie, no
value).

There are several different types of clauses, each with their own syntax
structure, these are,

    Symbol Clause
    String Clause
    Number Clause
    Character Clause
    Null Clause

See also,
    Command String, Value


Symbol Clause.
--------------

Two possible types of symbols, variables and commands, so two similar clause
syntaxes,

variable clauses:

    (symbol_name)
or
    symbol_name

    eg, If you have set up a variable, foo, to access it's contents you
    would use the clause,
	(foo)
    or,
	foo

    Note that if no symbol of "symbol_name" is found internal to JEd, the
    editor will look to see if a standard DOS variable (local or ENV:) of
    that name exists. If so, the value of the clause will be whatever that
    variable contains and will have type string.

command clauses:

    (symbol_name optional_argument_clauses)
or,
    symbol_name

    eg, To use the command global to create a variable called foo (as
    accessed above) you would need the clause,
	(global `foo' @)
    The '@' (null clause) is used so that the contents of the variable are
    void.

    Note that if no symbol of name "symbol_name" is found internal to JEd,
    the REXX: directory will be checked for a file called "symbol_name.jed".
    If this file is found it is assumed to be an ARexx macro for JEd and it
    will be executed accordingly. The value of the clause will be non-zero
    if the macro was invoked successfully.

    Note that command clauses don't have to have any arguments, so they can
    be similar to variable clauses.

    The value of a symbol clause is the value of either the referenced
    variable or the value returned by the executed command.

See also,
    Clause, Symbol


String Clause.
--------------

A string clause is defined syntactically as,
    `string-value'
or
    {string-value}

The value of this clause is "string-value" (of type string).

The quotes or braces nest so if you gave a clause of
    `an example of `nested \tstrings'!'
you would get a value of,
    an example of `nested \tstrings'!

At present quotes and braces are considered equivalent so you can't surround
one by the other (This may change soon).
The braces are provided for two reasons,
    1) So that the quotes don't get screwed up by ARexx.
    2) If you use braces to enclose command strings everything is much easier
       to read in complex statements (macros, loops, etc)

IMPORTANT:
Unlike similar languages (LISP, the Wack script language, etc) all clauses
are evaluated -- this means that when you give a command string as an
argument to a command (eg, macro, while, etc) it must be enclosed in quotes
(or braces) to stop it being executed too early.
eg,
    (macro `name'
    {
	(somecommand)
    })

NOT,
    (macro `name'
	(somecommand)
    )
this would assign the value of (somecommand) to the macro "name" not the
actual command string itself.

The text enclosed by the quotes, or braces, may enclude any of the standard
escape sequences supported by JEd.

See also,
    Escape Sequences, Strings


Number Clause.
--------------

Number clauses always produce a value of type number.

The syntax is,

    0xhex_number
    0octal_number
    decimal_number

Each variation may optionally have a minus sign '-' preceding it.


Character Clause.
-----------------

Value is of type number.

Syntax is,

    ~c

Value produced is ascii value of character 'c', ie, ~a would produce a value
of 97. Escape sequences may be used instead of a character.

    ^c

Value is control-'c'


Null Clause.
------------

The null clause has no value, it is mainly used to create variables without
giving them a value.

Syntax is
    @


Symbols.
========

JEd maintains one large symbol table which contains all global symbols, this
includes,
    commands
    variables
    macros

Each command string interpreted is also given a symbol table (actually a
list :) which contains symbols local to that string. Local symbols can
contain the same thing as global symbols.

The idea is that you can reference any local symbol which is either on the
same depth of recursion as where it is being referenced from or on a
previous level of recursion.

When a local variable goes out of scope (when the command string it was
declared in has been left) it will be automatically removed.

All symbols are case sensitive.

See also,
    Symbol Clause, addsym, remsym, global, local, macro, symboldump


Escape Sequences.
=================

An escape sequence is introduced by the backslash '\' character, the
supported sequences are,

    \n	     insert a newline character
    \t	     insert a tab character
    \f	     insert a form feed character
    \0xFF   insert a hex byte
    \0377   insert an octal byte
    \255    insert a decimal byte

Any other character after the backslash is just copied into the text (or
whatever). So to have a literal '\' character in a string you would need the
sequence '\\'. This feature can also be used to suppress clause-inducing
characters such as, quotes, parentheses, braces, @, ^, etc...


Keyboard Mappings.
******************

This is what the startup script in macros/ binds to each key.

    esc			prompt for command string and execute it
    help		sleep/unsleep window
    ctrl 		close window

    up			up one line
    down		down one line
    left		left one column
    right		right one column
    shift up		up one page
    shift down		down one page
    shift left		to sol
    shift right		to eol
    ctrl up		first line
    ctrl down		last line
    ctrl left		previous word
    ctrl right		next word

    tab			next tab stop
    shift tab		previous tab stop
    ctrl tab		insert a tab
    return		split line
    backspace		delete char behind cursor
    delete		delete char under cursor
    shift backspace	delete to sol
    shift delete	delete to eol
    ctrl delete		delete line
    ctrl backspace	delete word

    ctrl b		toggle block marks
    alt b		set start of block
    alt B		set end of block
    ctrl alt b		clear block
    ctrl i		insert block
    ctrl z		delete block
    ctrl x		cut block to clipboard unit 0
    ctrl c		copy block to unit 0
    ctrl v		insert clipboard unit 0
    ctrl q		delete to end of line
    ctrl y		delete all of line
    ctrl u		undelete line (from ctrl q/y)

    ctrl l		undo line (only if cursor is on correct line)
    ctrl L		always undo line

    ctrl o		open file from string prompt
    ctrl alt o		open file from file req.
    ctrl I		insert file from prompt
    ctrl alt I		insert file from file req.
    ctrl O		open file in new window from prompt
    ctrl alt O		open file in new window from file req.
    ctrl n		open new view of this file
    ctrl w		save file to where it was loaded from
    ctrl W		save file as result of string prompt
    ctrl alt W		save file as result of file req.
    ctrl N		rename this file
    ctrl d		change current directory
    ctrl k		clear file

    ctrl F		set find string, and find next occurrence
    ctrl f		find next occurrence
    ctrl alt f		find previous occurrence
    ctrl R		set replace string
    ctrl r		replace and find next
    ctrl g		find reference for word under cursor
    ctrl G		find reference for specified word
    ctrl h		find matching bracket
    ctrl j		jump to a line

    ctrl ,		activate next window
    ctrl .		activate previous window

    ctrl s		execute script file
    ctrl alt s		execute the current line
    ctrl S		execute the marked block
    ctrl alt S		execute the whole of the current file

    f1			move to bookmark 1
    f2			move to bookmark 2
    f3			move to bookmark 3
    f4			move to auto-mark
    shift f1		set bookmark 1
    shift f2		set bookmark 2
    shift f3		set bookmark 3

    alt d		insert current date
    ctrl e		prompt for AmigaDOS commandstring and execute it


ARexx.
******

All copies of JEd run will try to create an ARexx message port, the first
will be called 'JED.1', subsequent ports will be 'JED.2', 'JED.3'...

Command strings can be sent to JEd, they will probably need to be enclosed
in quotes so ARexx doesn't try to interpret them.

The way that results are returned to ARexx is slightly different to most
ARexx supporting applications, successful commands return 1 not zero in the
RC variable. If the result of a command is a string RC will be zero and the
RESULT variable will contain the string.

ARexx macros can be implicitly invoked simply by specifying their name in a
symbol clause, any arguments given to the clause will be resolved into
strings and passed to the macro as its arguments.
So, if you had a REXX macro called "foo" and it wanted an argument of "bar"
you could execute it with the command string,

    (foo `bar')

If you want to start a macro in this way it _MUST_ reside in the REXX:
assignment.
Also, the value of the clause which implicitly calls a REXX macro will only
represent whether or not it was possible to _start_ the macro running, see
the next paragraph...

Currently there's no way to receive a result from an ARexx macro. This fact
probably won't change since they have to be run asynchronously with the
editor.

See also,
    rexx


Title Bar.
**********

The title bar of a window is used to display some useful information about
the file being edited in this window. It will be something like,

			    Word-wrap____     __Block is fully marked
					 \   /
filename+ (col,line) total_lines line(s) AWNBbx	 <-- `savetabs' setting
	|			      __/  |  \__
when present denotes	   Auto-indent	   |	 Block is partially marked
that file contains		       Window position won't
unsaved changes.		       be saved on exit

eg,
jed.doc+ (11,1318) 1383 line(s) AN2

The title bar is also used to display messages (use the settitle command to
do this).


Miscellaneous Notes.
********************

The maximum length of any line is 32768 characters, there are no problems
loading lines this long either (anymore). The maximum number of lines you
can have is 2147483648. I think that these limits won't be too restrictive.
Currently no checking is done to make sure that these limits aren't broken,
this means that you can crash the system if you do. (Actually if these are
too restrictive it would be relatively easy to double them.)

Sometimes error messages will be shown (on the titlebar) which may seem to
be a bit strange. These will normally be of the type "syntax error: argument
n should have been a xxx" and they are normally encountered when you cancel
a requester or prompt (or when some command types fail). These just show
that the command that wanted the input you didn't give is complaining at
being given nothing (huh?).

JEd appears to be mungwall-clean and to not permanently steal any resources,
I haven't been able to run it under Enforcer (no mmu!), if any hits are
found please send me the output together with information as to the version
of jed you're using and how to recreate the hit.

The prompt mechanism used by the commands cli, getstr and getnum responds to
these keypresses,
    return  --	accepts the string
    esc	    --	cancel the prompt
    bs	    --	delete the character behind the cursor
    up/down --	recall the string entered in the last prompt
    (any other keys are just inserted into the string)

Any of the executable files may be made resident (they are pure).

If you find that the editor just exits back to the CLI, with no error
messages when executed, it means that the required disk-based libraries
aren't available or that there is insufficient memory.

It is now possible to mark blocks with the mouse, every time the left mouse
button is double-clicked the command,
    (block `t')
is executed.


MakeRefs.
*********

usage:
    makerefs [-new] [-full] <reffile> {<files>}

    -new	create <reffile>, don't append to it
    -full	write fully qualified filenames to the <reffile>, not
		relative to the current directory.
    <reffile>	the file to write the index in
    {<files>}	files to scan for references, standard AmigaDOS
		wildcards are acceptable.

This program calculates the reference indexes for use with JEd 2.x. The type
of reference scanned for depends on the suffix of each file, there are three
methods,

    1) Files which end in .h This is very poor, all structure definitions
    which have "struct " in the first column of the file will be referenced.
    The reference created will load the whole header file and put the cursor
    on the first line of the structure definition. Hopefully this will
    enable you to reference all system structures (actually the only
    structure it can't handle is ExtendedNode in graphics/gfxnodes.h,
    spurious references are generated since it's formatted strangely). You
    shouldn't attempt to reference the *_protos.h files. So to reference all
    include files cd to the directory holding them and type,

	1> makerefs .jrefs ~(clib)/#?.h

    then put your include file directory in the path jed searches with the
    addpath command.


    2) Files which end in .c These are assumed to be C source code files,
    all function definitions are referenced if they are in this format,

    rtn-type
    funcname(args...)
    {
    ...code

    3) Any other files These are scanned for autodoc style sections of text,
    ie, things like,

    a.library/AFunction				     a.library/AFunction

    This will produce a reference for AFunction.

See also,
    addpath, getref, rempath.


Command Index.
**************

    +                   addition
    -                   subtraction
    *                   multiplication
    /                   division
    %                   modulus
    <<                  left shift
    >>                  right shift
    ~                   bitwise NOT
    !                   logical NOT
    |                   bitwise OR
    ||                  logical OR
    &                   bitwise AND
    &&                  logical AND
    ^                   bitwise EOR
    ^^                  logical EOR
    =                   set value of a variable
    ==                  test for equality
    !=                  test for inequality
    >                   greater than
    <                   less than
    >=                  greater than or equal to
    >=                  less than or equal to
    activatefile        activate a named file
    addpath             add a directory to the path searched for references
    addsym              make a new global symbol
    arg                 get argument to macro
    atol                convert ascii string to number
    bind                bind a command string to a keypress
    block               control block marks
    break               break out of command strings
    car                 extract first item in list
    cd                  change current directory
    cdr                 extract all but first item in a list
    changecase          toggle case of some characters in the file
    changes             set change counter
    clear               reset file
    cli                 prompt for command string, then execute it
    close               close window
    copy                copy some of file to clipboard
    cut                 cut some of file to clipboard
    delete              delete some of file
    dlock               forbid/permit window refreshing
    dowhile             control structure
    export              increase the scope of local symbols
    extract             get some text from the file
    find                find a string
    format              'printf' style string formatting
    freq                file requester
    getnum              request number
    getpref             get value of a preference option
    getref              load reference description
    getstr              prompt for a string
    global              create a new global variable
    if                  control structure
    ilock               input lock
    info                get information about stuff
    insert              insert some text
    isalpha             test for an alphabetic character
    isalnum             test for alphnumerical character
    isdigit             test for a numerical character
    isspace             test for whitespace character
    join                join two lines
    local               create a variable local to this macro
    macro               define a macro (subroutine)
    match               wildcard string comparer
    menu                menu on/off
    move                move cursor
    nargs               number of arguments passed to macro
    newfile             open a new file in a new window
    newview             open a new view of this file
    nextwind            activate next window
    nop                 nothing
    openfile            open a new file in this window
    poke                put character into cursor position
    position            change window dimensions/position
    prevwind            activate previous window
    remsym              remove global symbol
    rempath             remove reference path
    rename              rename file
    renamesym           rename global symbol
    replace             replace string found by 'find'
    req                 requester
    return              return value from macro/command string
    rexx                send command to ARexx
    savefile            save file to where it was loaded from
    savefileas          save file to specified file
    saveprefs           set whether preferences will be saved on exit
    savesection         save part of file
    script              execute script file
    select              control structure
    setmenu             create menubar
    setpref             set a preference option
    settitle            set title-bar
    sleep               iconify window
    split               split line at cursor
    substr              extract string from another string
    symboldump          dump contents of symbol tables
    system              execute AmigaDOS command
    tolower             make some text lower case
    toupper             make some text upper case
    type                find the type of a value
    unbind              remove command string from keypress
    undo                undo changes to current line
    unsleep             un-iconify window
    while               control structure

See also,
    Syntax Definitions Explained, Section Type Definitions, Command Groups.


Command Groups.
***************

Window commands,
    activatefile, close, menu, newfile, newview, nextwind, position,
    prevwind, settitle, sleep, unsleep, setmenu.

File commands,
    activatefile, cd, changes, clear, newfile, openfile, savefile,
    savefileas, savesection.

Text manipulation,
    block, changecase, copy, cut, delete, extract, find, insert, join, move,
    poke, replace, split, tolower, toupper, undo.

Configuration,
    bind, getpref, macro, menu, saveprefs, setmenu, setpref, unbind.

Programming,
    +, -, *, /, %, <<, >>, ~, !, |, ||, &, &&, ^, ^^, =, ==, !=, >, <, >=,
    <=, addsym, arg, atol, break, car, cdr, cli, dowhile, dlock, export,
    format, freq, getstr, getnum, global, if, ilock, info, isalpha, isalnum,
    isdigit, isspace, local, macro, match, nargs, nop, req, remsym,
    renamesym, rexx, return, select, settitle, script, substr, symboldump,
    system, type, while.

Referencing,
    addpath, getref, rempath,

See also,
    Syntax Definitions Explained, Section Type Definitions, Command Index


Syntax Definitions Explained.
=============================

explanation of syntax definitions in command reference pages:

    (command arg1  arg2 ...)
rtn	     arg1  arg2
type	     type  type

The rtn type and the arg type show the kind of values the command returns
and expects to be given, they can be one of the following,

    ()	    --	anything (can be void)
    (S)	    --	string value
    (N)	    --	numeric value
    (S|N)   --	string or numeric value

Arguments surrounded by <...> are compulsory and must be provided for the
command to work, arguments surrounded by [...] are optional and arguments
surrounded by {...} mean one or more arguments can be given.

If I have shown that a command returns a number but have not documented what
it will be, then this scheme will apply, a zero means that the command
failed. If the return is non-zero (usually 1) the command was successful.

Another convention which I have used is that if a command is passed an
incorrect type of value (ie, a number instead of a string, or nothing at
all) the command will not return _any_ value. This will in turn make any
command using the value of this command as an argument fail, and so on...


Section Type Definitions.
=========================

Many commands which deal with parts of the text file expect what I have
referred to as a section type, often this is the argument <section>, this
should be one of the following strings,

    c	    --	character under the cursor
    p	    --	the character behind the cursor (previous)
    n	    --	the character after the cursor
    w	    --	the word under the cursor (alpha-numeric only)
    b	    --	the currently marked block (the block will then be unmarked)
    l	    --	the whole line that the cursor is on
    f	    --	the whole file
    sf	    --	from the cursor to the start of the file
    sl	    --	from the cursor to the start of the line
    ef	    --	from the cursor to the end of the file
    el	    --	from the cursor to the end of the line
    mX	    --	from the cursor to bookmark number X (ie, `m1')

eg, to copy a marked block,
    (copy `b' 0)


   (+ <value1> <value2>)
(N)    (N)	(N)

Returns <value1> + <value2>.



    (- <value1> [value2])
(N)    (N)	(N)

Returns <value1> - [value2]. If no [value2] is provided then <value1> is
negated and returned.


    (* <value1> <value2>)
(N)    (N)	(N)

Returns <value1> * <value2>.


    (/ <value1> <value2>)
(N)    (N)	(N)

Returns the quotient from <value1> / <value2>.


    (% <value1> <value2>)
(N)    (N)	(N)

Returns the remainder from <value1> / <value2>.


    (<< <value> <count>)
(N)	(N)	(N)

Returns the <value> left-shifted <count> bits.


    (>> <value> <count>
(N)	(N)	(N)

Returns the <value> right-shifted <count> bits.


    (~ <value>)
(N)    (N)

Returns the bitwise NOT of <value>.


    (! <value>)
(N)    (N)

Returns the logical NOT of <value>. ie, not_zero <=> zero.


    (| <value1> <value2>)
(N)    (N)	(N)

Returns the bitwise OR of <value1> and <value2>.


    (! <value>)
(N)    (N)

Returns the logical NOT of <value>. ie, not_zero <=> zero.


    (& <value1> <value2>)
(N)    (N)	(N)

Returns the bitwise AND of <value1> and <value2>.


    (&& <value1> <value2>)
(N)	(N)	 (N)

Returns the logical AND of <value1> and <value2>.


    (^ <value1> <value2>)
(N)    (N)	(N)

Returns the bitwise EOR of <value1> and <value2>.


    (^^ <value1> <value2>)
(N)	(N)	 (N)

Returns the logical EOR of <value1> and <value2>.


    (= <name> <value>)
(N)    (S)    (S|N)

Sets the contents of the variable <name> to <value>. Both global and local
variables may be set, but the variable must already have been created.

See also,
    addsym, global, local


    (== <value1> <value2>)
(N)	(S|N)	 (S|N)

Returns 1 if <value1> is equivalent to <value2>. Strings are compared case
insignificantly.


    (!= <value1> <value2>)
(N)	(S|N)	 (S|N)

Returns 1 if <value1> is not equivalent to <value2>. Strings are compared
case insignificantly.


    (> <value1> <value2>)
(N)    (N)	(N)

Returns 1 if <value1> is greater than <value2>.


    (< <value1> <value2>)
(N)    (N)	(N)

Returns 1 if <value1> is less than <value2>.


    (>= <value1> <value2>)
(N)	(N)	 (N)

Returns 1 if <value1> is greater than or equal to <value2>.


    (<= <value1> <value2>)
(N)	(N)	 (N)

Returns 1 if <value1> is less than or equal to <value2>.


    (activatefile <file>)
(N)		  (S)

Attempts to make a window holding <file> the active window, if <file> is not
already in memory an attempt will be made to load it into a new window.

See also,
    openfile


    (addsym {<name> <value> <sym-type>})
(N)	     (S)    ()	    (N)

Creates a new symbol called <name> with a value of <value>.

The <sym-type> argument determines whether the symbol is global or local,
and whether it is treated as a command or as a variable. <sym-type> can be,

    1/STF_GCOM	 global command
    2/STF_GVAR	 global variable
    3/STF_LCOM	 local command
    4/STF_LVAR	 local variable

The variable types always return their _literal_ value when accessed,
command types return their interpreted value, for example,

    (addsym
	`foo'   `foo'   STF_LVAR
	`bar'   {`bar'} STF_LCOM
    )
    (settitle (format `foo = %s, bar = %s' foo bar))

This creates two local symbols, foo and bar, foo is a variable string and
bar is a command string (ie, it will be interpreted), then displays their
values in the title bar of the window. This is a pathetic example.

See also,
    Symbol, global, local, remsym, renamesym, =, export


    (addpath {<dir>})
(N)

Adds a directory to the list of directoried scanned for reference indexes by
the getref command.

See also,
    MakeRefs, rempath, getref


    (arg <index> <type> <prompt>)
(S|N)	 (N)	 (S)	(S)

MACRO-ONLY.

Returns the <index>'th argument passed to the macro on invocation. If no
argument was supplied it is prompted for with the string <prompt>. If the
argument is not of the type specified by <type> (s = string, n = number, e =
either) the macro will be automatically aborted.

See also,
    nargs, macro


    (atol <string>)
(N)	  (S)

Returns the number represented by the ascii <string>. Decimal, hex and octal
bases are supported.


    (bind {<key> <command>})
(N)	   (S)	 (S)

Binds the <command> string to <key>. Remember that the command string must
be enclosed by quotes or braces.

<key> should be a string containing any number of qualifiers then one key.
The recognized words are,

    qualifiers
	SHIFT
	ALT
	CONTROL/CTRL
	COMMAND/AMIGA
	NUMERICPAD
	LMB			-- left mouse button
	MMB			-- middle mouse button
	RMB			-- right mb (currently unuseable)

    keys
	SPACE
	BACKSPACE
	TAB
	ENTER
	RETURN
	ESC/ESCAPE
	DEL/DELETE
	HELP
	UP
	DOWN
	RIGHT
	LEFT
	F1 ... F10
	and usual ascii characters (a,b,...)

some example commands

    (bind `shift tab' {(move `lt' 1)})

    (bind
	`j'                 {(req `hello' `world')}
	`lmb numericpad *'  {(settitle `foo')}
    )

If you bind onto a key which already has a binding the old command string
will not be lost, if you subsequently unbind the key the old binding will
come back into effect.

See also,
    Command Strings, unbind


    (block <type>)
(N)	   (S)

Set the block markings according to <type>, this is a standard section type
or,
    s	--  mark start of block
    e	--  mark end of block
    k	--  kill both block marks

    t	--  cycle through the above options

See also,
    Section Type, copy, cut, insert


    (break <depth>)
()	   (N)

Stops the execution of <depth> number of strings, execution will continue
with the next clause in the <depth> - 1 previous string.

In the following example the (break) will cause a branch to the req command
displaying the <depth> broken.

    (if 1
    {
	(if 1
	{
	    (if 1
	    {
		(break 2)
		(req `0' `zero')
	    })
	    (req `1' `one')
	})
	(req `2' `two')
    })
    (req `3' `three')

eg, if you change the '(break 2)' to '(break 1)' only the '(req `0'...)'
will be skipped. Test it out.

See also,
    dowhile, if, seclect, while,


    (car <list> <sep-char>)
(S)	 (S)	(N)

This command is used (in conjunction with cdr) to manipulate lists of words
separated by a single character, <sep-char>.

It returns the first item in <list>, ie, if you executed the command,

    (car `one,two,three' ~,)

you would get a value of,

    one

If <sep-char> does not occur in the list the whole <list> is returned.

See also,
    cdr


    (cd <dir>)
(N)	(S)

Makes <dir> the current directory for the editor.


    (cdr <list> <sep-char>)
(S)	 (S)	(N)

This command is used (in conjunction with car) to manipulate lists of words
separated by a single character, <sep-char>.

It removes the first item in the list and returns the remainder (without the
leading <sep-char>).

For example if you executed,

    (cdr `one,two,three' ~,)

you would get a value of,

    two,three

If <sep-char> does not occur in the <list> a null string ("") is returned.

See also,
    car


    (changes <number>)
(N)	     (N)

Sets the counter of changes to the current file to <number>.


    (cli)
()

Prompts for a command string and then executes it. Note that as with all
commands who use the prompt mechanism a sleeping window will be woken up.

Returns the value of the executed command.

This command is equivalent to
    (script `s' (getstr `cmd> '))

See also,
    Command String, getstr, script


    (close)
(N)

Closes the current window, if it is the only view of the file the file will
be unloaded. If it is the last window that the editor has open the present
command string will be terminated and everything will exit.

If using this from a script do NOT assume which window will be activated
when this one closes. It is left up to Intuition to decide which window to
activate. Until it does this (it may not even activate one of my windows, or
if it does I won't hear about it until after processing the script) the
window which the editor reguards as 'active' is guaranteed to be a view of
the file which closed (if there are any other views).

Be warned, this command is weird.

See also,
    newfile, newview,


    (copy <section> <unit>)
(N)	  (S)	    (N)

Copies a section of text to the clipboard device. <unit> is the clipboard
unit to copy to (usually 0). A <unit> of -1 means copy the text to my
internal clipboard unit, this can be useful for copying between windows of
the editor.

See also,
    Section Types, cut, insert


    (cut <section> <unit>)
(N)	 (S)	   (N)

The same as copy except that the section of text copied is then deleted from
the file.

See also,
    Section Types, copy, delete, insert


    (clear)
(N)

Clears everything to do with the current file, resetting its name to
"Untitled" as well.


    (changecase <section>)
(N)		(S)

Toggles the case of all alphabetic characters in <section>.

See also,
    Section Types, tolower, toupper


    (delete <section>
(N)	    (S)

Deletes <section> from the file.

See also,
    Section Types, cut


    (dowhile <body> <condition>)
(N)	     (S)    (S)

First executes the command string <body>, then executes command string
<condition>, if the result of <cond> is non-zero the loop is repeated. This
command has the same safeguards against infinite loops as while has.

Note that the <body> and <condition> are in the opposite order than in the
while command.

See also,
    Command Strings, while


    (dlock <status>)
(N)	   (N)

Sets the <status> of the display lock. When it is non-zero no rendering is
done in the current window (except for on the title bar) The intelligent use
of this command can significantly speed up macros.

There could be problems if a macro who has turned on the display lock is
aborted, by not being given the correct arguments perhaps, leaving the
display locked. If this happens get into the (cli) command and unlock the
display.

This command does NOT nest (yet). Each window has its own, independant,
lock.

When it is unlocked any queued refreshes are done.

See also,
    ilock


    (export {<symbol> <how-far>})
(N)	    (S)	     (N)

This command increases the scope of <symbol> so that <how-far> more command
strings can access it than before, the best way to explain this is with an
example, (the 'local' macro),

    ; create a macro called 'local'
    ;
    (macro `local' {

	; local symbol to count the number of arguments we've done
	;
	(addsym `__i' 0 STF_LVAR)

	; while we've got more arguments to do...
	;
	(while {(>= (- nargs __i) 2)} {

	    ; create a new local symbol...
	    ;
	    (addsym (arg (+ __i 1) `s') (arg (+ __i 2) `e') STF_LVAR)

	    ; and export it to the command string the macro was called from,
	    ; 2 strings "behind" (one for the body of this while loop and
	    ; one for the base level of the macro definition)
	    ;
	    (export (arg (+ __i 1) `s') 2)

	    ; increment argument counter
	    ;
	    (= `__i' (+ __i 2))
	})
    })

See also,
    Symbols, addsym, local, remsym


    (extract <section>)
(S)	     (S)

Returns the text from <section>.

See also,
    Section Types


    (find `s' <string>)
(N)

Sets the string which find will search for.


    (find `n')
(N)

Search for the next occurrence of the string set by (find `s'). This command
returns 1 if the string was found.


    (find `p')
(N)

Same as (find `n') but searches backwards.


    (find <switch> <status>)
(N)       (S)      (N)

Defines the behaviour of the find command, these <switch>'es are available,

    c -- case dependant search when <status> is non-zero

    w -- when <status> is non-zero the string set by (find `s') is parsed as
    a standard AmigaDOS 2.0 wildcard. Note that the search only extends to
    the end of each line in turn, and that '#?' will probably have to be
    added onto the end of the string to account for characters after the
    pattern that you are searching for.

    r -- enable regular expressions, when this <switch> is on the above two
    switches have no effect. The nearly-public-domain regexp library by
    Henry Spencer is used so refer to that for more details, basically these
    are the meta-characters recognized, (they can be un-recognized by
    backslash-escaping them),

    .       matches any single character
    
    [abc]   match a, b, or c
    [a-z]   match any character in range from a to z
    [^e]    match any char except e
            the above types of character classes can be combined, so,
                [a-zA-Z_]
            matches any alphabetical chacter or the underscore
    
    ^       matches the beginning of the line of text being compared
    $       matches the end of the line of text
    
    a|b     matches either expression a or expression b
    
    ()      the actual text that is matched by the RE between the
            parentheses is remembered. It can be recalled when substituting
            for an RE with the replace command.
    
    *       matches the preceding expression 0 or more times
    +       matches the preceding expression 1 or more times
    ?       matches the preceding expression 0 or 1 times
    
    Some examples of regular expressions could be,

    <[a-z]*/([a-z_]*).h>
    this would match "<clib/exec_protos.h>" saving "exec_protos" for recall
    as "\1" by replace, but would not match "<stdio.h>",
    "<Clib/Exec_protos.h>", etc.

    ^[a-zA-Z_]*\(
    note the escaped parenthese so that it takes its literal value, this
    could match "function(", "Func_tion(" or "(", all beginning at the start
    of a line, but not, "function", etc...

    There is a slightly confusing feature when searching _backwards_ for
    regular expressions, that is that instead of searching from right to
    left in a line it searches left to right (it still goes bottom to top
    though :), I don't believe that this is too much of a problem, just bear
    it in mind.

 See also,
    replace


    (freq <type> <title> <startpos>)
(S)	  (S)	 (S)	 (S)

Opens a file requester and asks for a filename. <type> can be `r' or `w',
these stand for read and write. <title> is the title of the requester window
and <startpos> is the file (and dir.) to start the requester from.

If the requester is cancelled no result is returned, this will probably
abort any commands who want it as an argument.

See also,
    getstr


    (format <fmtstring> {[values]})
(S)	    (S)		(S|N)

Returns a formatted string made from the format specification <fmtstring>
and the [values]. (Almost) standard C language formatting is done, these
substitutions can be performed,

    %s	    insert string
    %ld	    insert decimal value
    %lx	    insert hex value
    %lc	    insert char value

eg,
    (format `%s %ld' `string' 1000)


    (getref [refname])
(N)

This command searches all directories in the reference path (set with
(addpath)) for files called ".jrefs", these files should contain indexes to
all available references. If a reference matching refname (or the word under
the cursor if refname isn't given) is found a new window is opened and the
text for that reference is displayed. For example if you make a reference
file for all autodoc files you can, when programming, place the cursor on a
function name and then bring up the explanation of that function.

Each line in a .jrefs file which begins with a @ character is taken as a
valid reference, there are three types of line format,
	@refname@reffile@searchstring@
    reffile is loaded and searchstring is looked for in the start of each
    line. If found the cursor is set to the start of that line.

	@refname@reffile@#startpos@
    reffile is loaded and the cursor is moved to startpos (a decimal number)
    many bytes into the file.

	@refname@reffile@#startpos/#endpos@
    the section of text between startpos and endpos (both decimal offsets)
    is loaded into the window.

	@refname@reffile@^startline@
    cursor is positioned at startline (a decimal number).

In each case refname is the name of the reference, this is matched
case-significantly with what is being searched for. reffile is loaded
relative to the directory that the .jrefs file containing it is found in.

The program makerefs is provided for making references for autodocs, C
header files and C source files, see the file doc/makerefs.doc

See also,
    MakeRefs, addpath, rempath


    (getstr <prompt>)
(S)	    (S)

Prompts the user for a string, if the prompt is cancelled (<esc>) no value
will be returned.

See also,
    getnum


    (getnum <prompt>)
(N)	    (S)

Prompts the user for a numeric value, if the prompt is cancelled no value is
returned.

See also,
    getstr


    (getpref <pref>)
(N|S)	     (S)

Returns the current setting of preference option <pref>. Currently you can't
get the font settings.

See also,
    setpref


    (global {<name> <value>})
(N)	     (S)    ()

Creates a new global variable <name>, its value will be set to <value>.

This command is actually implemented as a macro, in the startup file.

See also,
    addsym, local, remsym, =


    (if <condition> [true-cmd] [false-cmd])
()	(N)	    (S)	       (S)

If <condition> is non-zero the command string [true-cmd] is executed, else,
[false-cmd] is executed. The result of this command is the result of the
string executed, or no value if the string which should have been executed
wasn't provided.

See also,
    dowhile, select, while


    (ilock <status>)
(N)	   (N)

Sets the status of the input lock. This is intended for use by ARexx macros
to lock out user input. Only commands from ARexx are received. Input through
the window just queues up until the <status> is set back to zero. (actually
the getstr and getnum commands are allowed to break the lock). The returned
value is the OLD status of the lock.

It is polite behaviour to reset the lock to whatever it was before you set
it, ie, from ARexx,

    '(ilock 1)'
    oldilock = rc
    ...your code...
    '(ilock 'oldilock')'

Unlike the dlock command this lock is global ie, it affects everywhere, you
can't just lock the input from one window.

See also,
    ARexx, rexx, dlock


    (insert <section>)
(N)	    (S)

Inserts section into the file at the current cursor position, since you
can't insert into the text to be inserted it is probable that only blocks
can be inserted with this command.


    (insert `f' <file>)
(N)		(S)

Inserts the file <file>.


    (insert `s' <string>)
(N)		(S)

Inserts the string <string>.


    (insert `a' <value>)
(N)		(N)

Inserts the ascii code <value> into the file.

See also,
    Section Types, copy, cut


    (info <type>)
(S|N)	  (S)

Returns some information about the editor and its current environment.
<type> can be,

    col		column number (N)
    cols	number of columns in this line (N)
    line	line number (N)
    lines	number of lines in this file
    char	ascii value of character under cursor (N)
    views	number of views open of this file (N)
    files	number of separate files open (N)
    windows	total number of open windows (N)
    time	current time "HH:MM:SS:" (S)
    date	todays date "DD-MMM-YY" (S)
    cd		current directory (S)
    fullname	fullname of current file (includes path) (S)
    filename	basename of current file (S)
    dirname	path of current file's directory (S)
    screenx	width of screen (N)
    screeny	height of screen (N)
    leftedge	x position of window (N)
    topedge	y position of window (N)
    width	width of window (pixels) (N)
    height	height of window (N)
    size	number of characters in file (no tab optimization) (N)
    offset	distance from start of file (1st char = 1) (N)
    asleep	1 if window is sleeping (N)
    port	name of ARexx port (S)
    rev		release number (N)
    barheight	height of title bar (N)


    (isalpha <char>)
(N)	     (N)

Returns non-zero if <char> is a member of the alphabet.

See also,
    isalnum isdigit


    (isalnum <char>)
(N)	     (N)

Non-zero if <char> is alphabetic or numeric.

See also,
    isalpha, isdigit


    (isdigit <char>)
(N)	     (N)

Non-zero if <char> is a digit.

See also,
    isalpha, isalnum


    (isspace <char>)
(N)	     (N)

Non-zero if <char> is a white space character.

See also,
    isalpha, isalnum


    (join)
(N)

Joins this line to the following one, if there is no line below this one it
has no effect.

See also,
    split


    (local {<name> <value>})
(N)	    (S)	    ()

Creates a variable local to this command string and any command strings
entered from this one, when this command string is exited all local symbols
associated with it are discarded.

The variable will contain <value>.

Local variables always take precedence over global variables of the same
name.

Note: This command is actually a macro in the startup file.

See also,
    addsym, macro, =, export


    (macro <name> <commands>)
(N)	   (S)	  (S)

Creates a macro symbol of <name> with an associated command string of
<commands>.

Macros are treated by jed (almost) exactly the same as normal (primitive)
commands, they are also kept in the same hash table so you could redefine a
primitive command as a macro :-). Macros are invoked in the same way as
commands and can have arguments given to them (through the arg command) and
return a value (return command).

An example macro could be,

    ; Word count macro.
    (macro `wc'
    {
	(dlock 1)			    ; lock display update
	(local `words' 0)                   ; word counter
	(move `sm' 0)                       ; save our position
	(move `sf')                         ; go to top of file
	(while {(move `nw' 1)}              ; loop till we get to last word
	{
	    (= `words' (+ words 1))         ; increment counter
	})
	(req `There are %ld word(s) in this file.' `wow!' words)
	(move `bm' 0)                       ; back to old position
	(dlock 0)			    ; unlock display
	(return words)			    ; return the number of words
    })
    ; To invoke this macro type (wc) at the command line
    ; prompt (normally <ESC>)


Note: This command is actually a macro definition in the startup file, yes
thats correct, the macro command is a macro ;)

See also,
    Command Strings, Symbols, addsym arg, local, nargs, return, renamesym


    (move <type> <number>)
(N)	  (S)	 (N)

Moves the cursor according to <type>, which can be,

    d	--  move down <number> lines
    dp	--  move down <number> pages
    u	--  move up <number> lines
    up	--  move up <number> pages
    ln	--  move to line <number>
    cn	--  move to column <number>
    nc	--  move <number> characters ahead
    nw	--  move <number> of words ahead
    pc	--  move <number> of characters back
    pw	--  move <number> of words back
    r	--  move <number> columns right
    rt	--  move <number> of tabs right
    l	--  move <number> columns left
    lt	--  move <number> of tabs left
    of	--  move <number> characters from sof

    bm	--  move to bookmark <number>
    sm	--  set bookmark <number>, there are 65535 bookmarks from -32767
	    through 0 to +32767. Bookmarks track any changes to the file
	    and are cleared when a new file is started. Bookmarks are shared
	    between all views of a file.

The difference between `nc' and `r' is that nc will move onto the start of
the next line at the eol whereas r will just keep moving right (to a maximum
of 32768 columns!).


    (move <type>)
(N)	  (S)

There also these move commands which don't take a <number> argument,

    ef	--  move to the last line
    el	--  move to the last column
    sf	--  move to the first line
    sl	--  move to the first column
    bs	--  move to block start
    be	--  move to block end
    am	--  move to the auto bookmark, this is set after a large(ish) move
	    command, or after the find command.
    mb	--  move to the next bracket which is at the same level of nesting
	    as the one under the cursor, this is what matches what,
		(   )
		{   }
		[   ]
		<   >
		`   '

If the specified position can't be moved to the command will return 0,
otherwise 1.


    (match <pattern> <string>)
(N)	   (S)	     (S)

Matches the AmigaDOS wildcard string <pattern> case-insignificantly with
<string> returning 1 if they are equivalent, 0 if they aren't.

See also,
    ==


    (menu <status>)
(N)	  (N)

Sets whether or not a menu is displayed in this window. If <status> is
non-zero the menu is on.

Currently this (probably) has a bug, in that when a window is slept the menu
status is not remembered for when it is un-slept.

Note that setmenu must have been successfully called for a menu to be
displayed.

See also,
    setmenu


    (nargs)
(N)

MACRO-ONLY.

Returns the number of arguments passed to a macro when it was invoked.

See also,
    macro, arg


    (newfile <file>)
(N)	     (S)

Opens a new window for <file>, if <file> exists it will be loaded into the
window.

See also,
    activatefile, close, newview, openfile


    (newview)
(N)

Opens an additional window for editing the current file in. The windows
share the same text buffer and bookmarks but are otherwise independant.

See also,
    close, newfile


    (nextwind <type>)
(N)	      (S)

Activates the next window in the list.
<type> can be,
    f	--  activate the next _separate_ file
    v	--  activate the next view of this file
    a	--  step through all windows

See also,
    prevwind


    (nop)
(N)

This command does absolutely nothing, it always returns 0.


    (openfile <file>)
(N)	      (S)

Tries to load <file> into the current window (and all other windows of the
same file), if it can't be loaded the window is cleared.

Sequential access files (ie, pipes and serial ports) can also be read (by
newfile as well). You'll probably need to rename the editor's copy after
reading it in, though.

See also,
    newfile


    (prevwind <type>)
(N)	      (S)

Activates the previous window in the list,
<type> can be,
    f	--  previous _separate_file
    v	--  previous view of this file
    a	--  step through all windows

See also,
    nextwind


    (poke <char>)
(N)	  (N:8)

Sets the current character to <char>, only the lower 8 bits of <char> are
used.


    (position <x> <y> <w> <h>)
(N)	      (N) (N) (N) (N)

Sets the position of the current window,
    <x> --  x position
    <y> --  y position
    <w> --  width
    <h> --  height

All values are in pixels.

If the window is currently sleeping the new position will not be used until
it's woken up.

See also,
    sleep, unsleep


    (replace `s' <string>)
(N)              (S)

Sets the replace string to <string>.


    (replace `r')
(N)

If the string under the cursor matches the string set by (find `s') it is
replaced with the string set by (replace `s') and the cursor is advanced to
the end of the replaced string.

Note that it probably isn't a good idea to replace text found with
wildcards.

When regular expression searching has been enabled (see find) the actual
piece of text which matched the expression is replaced, the replace string
can also include these meta-characters,

    &   --  insert the whole of the string which was matched
    \n  --  insert the n'th parenthesized string from the RE (n is a digit
            from 1 to 9).

 See also,
    find


    (remsym {<name>})
(N)	     (S)

Removes the symbol <name>, can be *any* type of symbol whatsoever.

See also,
    Symbols, addsym, global, macro


    (rempath {<dir>})
(N)	      (S)

Removes directories from the reference path list which were added by
addpath.

<dir>'s must be exactly the same string as what was given to addpath, it is
_not_ enough that the two <dir>'s point to the same place (ie, if the path
sys:man is addpath'ed and you try to rempath dh0:man it won't work, even
though sys: may well be dh0: ).

See also,
    addpath, getref


    (rename <name>)
(N)	    (S)

Change the name of the current file to <name>, this is where the file will
be saved to next savefile command.

See also,
    newfile, savefile, savefileas,


    (renamesym {<old-name> <new-name>})
(N)		(S)	   (S)

This command changes the name of the global symbol <old-name> to <new-name>.

The main reason I added this command was to make it very easy to add new
features to existing primitive (built-in) commands, for example, if you
always want the openfile command to use a file-requester if it is not given
a filename you could use this script,

    ; rename openfile command to _openfile
    (if (renamesym `openfile' `_openfile')
    {
	; create a macro of name openfile
	(macro `openfile'
	{
	    ; were we given a filename
	    (if (== nargs 0)
	    {
		; no, so request one and open it
		(_openfile (freq `r' `file...' (info `fullname')))
	    }
	    {
		; yes, so just open it
		(_openfile (arg 1 `s' `'))
	    })
	})
    })

See also,
    Symbols, addsym, remsym, macro


    (req <body> <gads> {[values]})
(N)	 (S)	(S)	(S|N)

Displays a requester containing <body> as its main text and <gads> as its
gadgets. The <gads> specification can define multiple gadgets by separating
each one by a vertical bar ('|') character.

Both <body> and <gads> can contain format characters (%s, %ld, etc), <body>
takes formatting arguments from [values] first. The value returned is the
number of gadget that was selected (starting at 1 for the leftmost gadget)
or zero if the rightmost gadget was selected.

See also,
    format


    (rexx <type> <string>)
(N)	  (S)	 (S)

Send a command to ARexx, <type> can be,

    m	--  <string> is the name of a macro-file to be executed by ARexx, it
	    should have a filename extension of ".jed".
	    If you want you can specify any arguments to the macro after
	    the macro name, ie,
		(rexx `m' `amacro arg1 arg2')

    s	--  <string> is a string of ARexx commands to be executed by REXX.

See also,
ARexx


    (return [result])
()	    (S|N)

MACRO-ONLY.

Returns control from a macro to whatever invoked it, the value of the macro
is [result], this can be any type of value.

This command never returns (for obvious reasons).

See also,
    macro


    (savefile)
(N)

Saves the current file as the file it was loaded from (or as what it has
been renamed to).

See also,
    openfile, rename, savefileas,


    (savefileas <name>)
(N)		(S)

Saves the current file as file <name>.

From now on the current file will be called <name> by JEd.

See also,
    openfile, rename, savefile


    (savesection <section> <file>)
(N)		 (S)	   (S)

Saves the specified section of text as file <file>.

If you're writing a macro or ARexx script for something like integrated
compilation this command makes more sense than savefileas since it doesn't
change the state of the 'changes' counter or the name of the file. ie, use

    (savesection `f' `t:???')

See also,
    savefile, savefileas, changes


    (saveprefs <boolean>)
(N)	       (N)

Allows you to set whether or not options set by the setpref command will be
saved into the file "s:jed.config" file when the editor is exited. By
default this command is always set to true (ie, non-zero), therefore saving
preference files.

Note that contrary to what the name suggests this command doesn't actually
save anything, this is only done by the cleanup code.

See also,
    Startup, setpref


    (select {<condition> <command>} [default-cmd])
()	     (N)	 (S)	    (S)

If <condition> is non-zero its corresponding <command> is executed, the
result of the executed <command> is returned. If none of the supplied
<conditions>'s are non-zero the [default] command string is executed (if it
is supplied).

An example,

    (select
	(== (info `char') ~a)
	{
	    (settitle `a')
	}
	(== (info `char') ~b)
	{
	    (settitle `b')
	}
	{
	    (settitle `neither')
	}
    )

See also,
    Command Strings, if, dowhile, while


    (setmenu <file>)
(N)	     (S)

Reads <file> and makes a set of menus from it, each line represents one part
of the menu, the format of the different types of lines are,

MENU "name"                     Creates a new menu block

ITEM "name" "key" "commands"    Creates a menu item, key is the command-key
				shortcut, commands is the command string
				which gets executed when the item is selected.

SUB "name" "key" "commands"     Creates a sub item on the last menu item.

BAR				Creates a separator bar in the menu block.

SBAR				Creates a separator bar in the sub item
				block.

END				Terminates the menu definition.

The "key" shortcut may be upper or lower case. Menu shortcuts are only
considered to be case-significant when two shortcuts of the same letter (but
different case) are defined.

See also,
    Command Strings, menu


    (setpref <pref> [arg1] [arg2])
(N)	     (S)

Sets one of the preference settings,

    pref		    arg1	    arg2
    ----------------------- --------------- ----------------
    tabsize		    size (N)
    leftmargin		    col (N)
    rightmargin		    col (N)
    autoindent		    bool (N)
    wordwrap		    bool (N)
    font		    name (S)	    size (N)
    disktab		    size (N)
    savetabs		    code (N)
    scrollhack		    bool (N)
    bakdir		    name (S)
    baknum		    number (N)
    saveprefs		    bool (N)
    nosnapshot		    code (N)
    pubscreen		    name (S)

Explanations:

    tabsize
	The size of tabs on the screen.

    disktab
	The size of tabs read from and written to disk.

    savetabs
	Controls whether or not TAB (0x09) bytes are saved in files, code
	can be,
	    0	--  no TABs are saved
	    1	--  leading spaces in each line are optimized to TABs
	    2	--  all spaces which can be are optimized into TABs are and
		    trailing whitespace is discarded (except after quotes)

    leftmargin
	Where the cursor is put horizontally after the split command, unless
	autoindent is on.

    rightmargin
	Where long lines are chopped when wordwrapping.

    font
	The font to use for this window. The <name> must have a ".font"
	suffix.

    bakdir
	The directory which backup files are saved to.

    baknum
	The maximum number of backup copies to keep of each file. Whenever a
	file is saved the previous copy (if it exists) is put into the
	backup directory.
	    eg, if bakdir is set to t: and baknum is set to three you would
	    get backups like,
		t:afile.bak1  - newest after actual file
		t:afile.bak2
		t:afile.bak3  - oldest

    nosnapshot
	Determines when (or if) the window's dimensions are stored for
	saving to the configuration file. The possible code's are,
	    0	--  when the window is closed
	    1	--  never
	    2	--  now (but never again)

    pubscreen
	Sets the name of the public screen which all new windows are to be
	opened on. The Workbench screen is "Workbench", to use the default
	public screen use a name of "" (a null string).

All the above preferences are local to each window, when a new window is
created it inherits its preferences from its parent. The following
preference settings are global to the whole editor.

    scrollhack
	When on (non-zero) scrolling speed is doubled (ish) when no blocks
	are being displayed. To do this Intuition is fooled into only
	scrolling one bitplane. This option is on by default but you may
	need to turn it off for newer os releases, (those supporting
	AGA???). Thanks to Adriaan van den Brand for this idea.

    saveprefs
	When on (non-zero) the preferences of each file saved will be stored
	in that file's filenote. This option is intelligent enough not to
	overwrite any existing comments which aren't preference
	specifications.

Each file that is loaded will have it's filenote checked to see if it
contains a string that defines some preferences (this is what the saveprefs
preference option does), the string should be formatted like this,

    @@ww<+|->\ai<+|->\ts<n>\dt<n>\st<n>\lm<n>\rm<n>

    ie,
    @@ww-\ai+\ts4\dt8\st2\lm1\rm77

the individual switches are,
    ww	--  wordwrap
    ai	--  autoindent
    ts	--  tabsize
    dt	--  disk tabsize
    st	--  save tabs
    lm	--  left margin
    rm	--  right margin

They can be specified in any order, not all of them have to be given. ie, to
make sure that a particular file _never_ has any tab characters saved in it
you can use the following CLI command,

    1> filenote filename "@@st0"

where filename is whatever the file is called.

See also,
Startup,
getpref,
saveprefs


    (settitle <title>)
(N)	      (S)

Sets the current window's title string to <string>, this string will remain
in view until the next IDCMP event.

See also,
    Title Bar


    (script <section>)
()	    (S)

Executes the text in the specified section of the current window.


    (script `x' <file>)
()		(S)

Executes the script file <file>. (`x' stands for eXternal). If <file> can
not be found relative to the current directory "s:jed/" will be prepended to
<file> and it will be looked for again.


    (script `s' <string>)
()		(S)

Execute command string <string>.

All the script variants return the result of whatever was interpreted, the
text that is scripted doesn't have to be a command clause, any clause-type
is acceptable.

An interesting use of this is to process escape sequences in a string (from
a prompt), ie, this will prompt for a 'find' string and interpret it to use
any escape sequences,

    (find `s'
	(script `s'
	    (format ``%s''
		(getstr `find> ')
	    )
	)
    )

the format command is necessary to make the string into the correct format
for a string clause (ie, in quotes).

See also,
    Command Strings, Clauses, cli


    (sleep)
(N)

Make the current window go to 'sleep', it will become a small window on the
screen title bar. It can be set back to normal by the (unsleep) command or
clicking the right mouse button when the window is active.

All commands (except for those which use the prompt, these will enlarge the
window) can be executed while the window is sleeping. Anything you type
while a window is asleep will be inserted!

See also,
    getstr, unsleep


    (split)
(N)

Break the line into two at the cursor.

See also,
    join


    (substr <string> <index> <len>)
(S)	    (S)	     (N)     (N)

Returns a string extracted from <string>, first character is <index>
characters from start of <string>, <len> characters are extracted.


    (symboldump <file> <type>)
(N)		(S)    (S)

Writes the symbol table's contents to <file>, <type> can be,

    globals --	all global symbols
    locals  --	all local symbols
    all	    --	all symbols

See also,
    Symbols, addsym


    (system <command>)
(N)	    (S)

Executes an AmigaDOS command string. The value of this command is the return
code of the executed command or -1 if the command couldn't be executed.


    (toupper <section>)
(N)	     (S)

Make all characters in <section> upper case.

See also,
    Section Types, changecase, tolower


    (tolower <section>)
(N)	     (S)

Make all characters in <section> lower case.

See also,
    Section Types, changecase, toupper


    (type <value>)
(N)

Returns the data-type of its single argument, return values can be,

    1/VTF_STRING    --	string type
    2/VTF_NUMBER    --	number type


    (unbind {<key>})
(N)	     (S)

Remove any command string bound to <key>.

See also,
    Command Strings, bind


    (undo <type>)
(N)	  (S)

This commands undoes changes, currently the only type of undo supported is
to reset the state of the last-edited line to what it was before being
edited, <type> can be,

    l	--  only undo line if cursor is on the line that the text in the
	    undo buffer was copied from.
    L	--  always undo line, don't worry if cursor isn't on line to be
	    undone.

When the undo-buffer is used the contents of the line it's used on is copied
into the buffer, what I mean is that undoing something twice gets you back
where you started.

This command has a limitation, sometimes after undo'ing a line any bookmarks
(or any other remembered coordinates) on that line may be slightly out, this
is _not_ a bug just a [mis]feature.


    (unsleep)
(N)

Wake up a sleeping window.

See also,
    sleep


    (while <condition> <body>)
(N)	   (S)	       (S)

First, <condition> is executed, if it returns a non-zero value <body> is
executed and the above steps are repeated, else abort the loop and return
the number of times that <body> was executed.

There are a couple of in-built protections against infinite loops, firstly,
if the number of iterations reaches a million the loop is aborted. Secondly
(and more usefully), the loop can be aborted by sending a ^c break signal to
the editor. This signal can be sent by the break command or, if you have the
software toolkit disks, the breaktask command.

example,
    (while {(move `dn' 1)}
    {
	...do something...
    })

See also,
    Command Strings, dowhile, if, select


Provided Macros.
****************

Some scripts of macros are included in the distribution (in the macros/
directory, you should copy them to s:jed/). These are mainly intended to
serve as examples of how you can program JEd to meet your own needs.

Macro files,

    blockstack
    stackwins
    make
    indent

To install any of the sets of macros you have to execute its file as a JEd
script, use the command,

    (script `x' <filename>)


blockstack
==========

This file provides commands for a stacking cut/copy & insert, the commands
are,

    (stkcopy <section>)
(N)	     (S)

Copy the text in <section> onto the stack.


    (stkcut <section>)
(N)	    (S)

Same as stkcut except the copied text is then deleted.


    (stkins)
(N)

Insert the text from the top of the stack.

See also,
    Section Types, copy, cut, insert


stackwins
=========

This is a command to arrange a specified set of windows into either a
vertical or horizontal stack (ie, adjacent to each other).

    (stackwins <direction> <type>)
()	       (S)	   (S)

<direction> is either "x" or "y", this specifies which direction to stack
them in. <type> can be,

    a	--  do all windows
    v	--  do all views of this file
    f	--  do one view of each file


make
====

This is a macro to asynchronously run make (or dmake) in a separate window.

    (make <args>)
()	  (S)

<args> are passed straight to the make utility, by default this macro uses
dmake, though it's very easy to change it.


indent
======

This file installs some keybindings to automate the indentation of C code,
it is also suitable for writing JEd scripts with.

If you type the following line (<..> is one keypress, spaces aroud <..> are
just for readability),

    if(expr) <alt {> break; <alt }>

you would get,

    if(expr)
    {
	break;
    }*

The cursor would be left where the asterisk is.

So, you type "alt {" to begin a new block and "alt }" to skip to the end of
the current block.


History.
********

Revisions:
    2.07
    2.06b
    2.06
    2.05
    2.04
    2.03
    2.02
    2.01
    2.0

warning:
    Revision history is updated in realtime -- as soon as a change is
    working I note it in here. This may lead to some disjointed, incorrect
    or just totally weird text.


2.07 (16-Jan-93)
================

* uses ReadArgs() interface to allow for standard AmigaDOS style command
line parsing. Some more options can be specified from the command line
(pubscreen, tabsize).

* added clause type ^x to allow easy use of control codes.

* added (info `barheight') command

* new command (saveprefs) to enable preferences to not be saved on exit.

* fixed bug with >= and <= commands being swapped.

* made main document into AmigaGuide format

* added renamesym command. Now you can easily add features to primitive
commands.

* fixed a killer bug. before, any attempt to assign a string to a variable
with the = command didn't bother to make a copy of the string, just used the
pointer it was given, deadly stuff, how come I only just found it :-(

* fixed bug in `ef' section type, it included one line to many.

* fixed problem of activated view not being refreshed when another view of
the same file closes.

* added car and cdr commands.

* rewrote a lot of command interpreter. now local variables are much more
useful (they can be used anywhere, not just in macros :). Also symbol
clauses which don't have any arguments don't have to be parenthesized, ie,
all variable referencing.

* addsym command has been RADICALLY altered, now any type of symbol, local
or global, with any type of value (excluding functions) can be created. This
means you can have such things as local macros :)

* removed global, local and macro primitives, they're now implemented as
macros in the startup file.

* new command, export, for fiddling with the scope of local symbols

* oops, call to AslRequestTags() in cmd_freq() didn't mark the end of its
taglist, until the changes detailed above were added the stack must have
been protecting me ;^)

* cleaned up a lot of the return values (now they all conform to what I set
out in the documentation!)

* the commands which can take more than one set of arguments now abort if
any argument is of the wrong type, not just go on to the next set like they
used to.

* new command, type, for examining the type of a symbol.

* fixed problem of not being allowed to insert sections when you should be
able to (mainly when trying to insert part of a line onto the same line).

* fixed bug in `mX' section type

* added undo command, only does single-line undo at the moment.

* added isspace command

* new option on command line "CD/K"

* added Un*x style regular expression search & substition, uses the
regexp(3) package (with a couple of modifications).


2.06b (10-Dec-92)
=================

* fixed the failure to open initial windows on the screen named by (setpref
`p')


2.06 (04-Dec-92)
================

* added some more stuff to title bar display

* added block-marking from the mouse, double-click to toggle block marks.

* added preference option to allow you to specify when (if at all) to
snapshot the window's position.

* changed ARexx message port naming convention

* added substr command

* fixed wordwrap crash when you type further than the right margin

* position command no longer unsleeps sleeping windows, just sets it so that
when they wake up they get the new dimensions.

* added support for opening on named public screens


2.05 (22-Nov-92)
================

* fixed below-mentioned reference problem, new reference type to specify the
_line_ to move to. makerefs now uses this when referencing .h files.

* removed 'oldprefs' preference setting, it's intended use has been built
into the main editor code :-) Preference settings embedded in filenotes now
work much more smoothly, the previous preference settings (last only) are
put into the next window opened or the next file loaded or into the
configuration file.

* added new 'm' section type (from cursor to a specified bookmark).

* insert command now sets the automark before moving the cursor.

* added DOS variable support, local and env: variables are looked for if an
internal symbol can't be found (they are checked for just before looking for
an ARexx macro).


2.04 (03-Nov-92)
================

* new section type `n'

* oh dear, getref command has problems when a single seek offset is given
and the referenced file contains tabs. Since jed expands all tabs into
spaces when it loads the file the seek offset (which isn't used until the
file has been loaded) is incorrect.

* disktab preference setting is now local to each window

* clear command now resets titles of sleeping views like it should

* put in some new preference options, mainly to allow individual files to
keep their preferences in their filenotes (I know filenotes are supposed to
be for the use of users only but I've done it in a nice, user friendly,
manner ;-)

* opening new windows from a sleeping window no longer crashes spectacularly
(or at all :-)

* when (savetabs == 2) single spaces are no longer `optimized' into tabs

* revised pubman's command syntax


2.03 (13-Oct-92)
================

* fixed slight cosmetic bug in replace command.

* added isalpha, etc, commands

* fixed makerefs (again) and now it references function definitions which
don't have the /*ref*/ heading that was previously required.

* added code to try and call REXX macros for unknown symbols, means that you
can refer to REXX scripts in the same way as JEd macros and commands (except
you can't return results from REXX)

* made all invocations of JEd have their own ARexx port.

* added (info `port') command


2.02 (03-Oct-92)
================

* oops, the setmenu command didn't actually look for the END keyword, it
gave an error and aborted if it was given.

* added mousebutton qualifier support.

* fixed some of arg command

* sigh... the OpenWindowTags() call in windows.c didn't mark the end of its
tag list with a TAG_END, now it does.

* all windows are now opened on the default public screen.

* included the pubman utility to make it easy to give JEd it's own screen

* new commands, ^, ^^, >>, <<

* savesection now saves tabs if savetabs is on.

* savetabs preference improved.

* now configuration data is automatically saved by DICE. As a result of this
the saveprefs command has been discarded.

* setmenu didn't recognize SBAR, it looked for SUBBAR... now it's fixed, I
suppose I shouldn't have written the documentation from memory :-(

* when the name of a sleeping window changes (openfile, rename, etc...) it's
title is now corrected.

* more of the move commands set the auto-mark now.

* added (move `of') command.

* IMPORTANT: before, reference seek positions started at 1, now they start
at 0. This means all .jrefs files containing seek offsets have to be remade.
This is to provide consistency with the (info `offset') command and (move
`of').


2.01 (20-Sep-92)
================

* removed (undocumented) 8 argument limit on commands - now commands can get
as many arguments as memory allows. (not quite, format and req are limited
to 20 formatting values).

* fixed bug in (saveprefs) command, didn't show up until version bump.

* position unsleep's a sleeping window before changing its position.

* fixed activatefile's refresh problems.

* makerefs failure to expand a a pathname when no -full is given has been
fixed. also, structure searching has been rewritten, it won't give 100%
success but will work on the system include files (or at least most of
them). typedef'ed structures are referenced by their typedef not any given
structure tag. makerefs can now be interrupted by ^c

* new commands, break, select, dowhile, symboldump, move `bs', move `be',
info `size', info `offset', script `s', ilock, info `asleep', setpref
`scrollhack', changes

* made poke and replace `r') increment change count

* extract can now get any amount of text (the whole file if you want!)

* the libraries; commodities, iffparse and asl are only kept opened when
needed. For commodities and iff this is only when they're being used. asl is
kept open after the first use of the file req. Under V37 iprefs keeps
iffparse open all the time anyway so this doesn't help much.

* wow, now commodities is kept closed, scrolling is faster. (as long as no
one else has cx open.) (i expect that this is only noticeable if you're
running a 68000 and v37 or less).

* oops, opening and closing the commodities.library so much sometimes
crashed the input.device. Wrote my own description -> key/qual bytes
function. See the (bind) description for more info. commodities isn't used
at all anymore.

* added 'global' as synonym for 'addsym', fits better with local.

* some commands now take more than one set of arguments at once (bind,
addsym, addpath, etc...)

* fixed bug in (move `nw') and (move `pw')

* scrolling speed doubled (when no block is on screen) due to a cunning tip
from Adriaan van den Brand.

* fixed bug when deleting from column 0 to column n (NOT 0). Line isn't
joined anymore.

* can now be started via the Workbench.

* fixed bug of \t characters being the size of disktab not tabsize when
inserting strings or characters.

* fixed some commands who didn't bother to check their arguments before
using them.

* fixed a bug in the menu creation function and added some new menus to the
jed-menus script.

* added code to create backups for each saved file, a configurable number of
backups can be stored in a configurable directory.

* oops, the command template checker didn't detect errors when a command was
passed an incorrect _number_ of arguments. Now it does.

* added null clause (@)

* fixed up readtx() (function to load text), removed possible array over-
stepping and made it so that lines up to the maximum of 32768 chars can be
read properly.

* added one-line history buffer to prompt stuff.


2.0 (08-Sep-92)
===============

* total rewrite from version 1, switched from assembler to C.


Known Bugs.
***********

System requesters (Please insert volume, etc...) only open on the correct
screen while the default public screen is the same as what we're open on.

The makerefs program is pretty inadequate (but slowly getting better :-)

Won't work satisfactorily on a single bitplane screen.


Contact Address.
****************

e-mail:
    jsh@ukc.ac.uk
    (hopefully valid until July '95)

paper-mail:
    John Harper,
    91 Springdale Road,
    Broadstone,
    Dorset BH18 9BW,
    ENGLAND.

If you can, please use email, if you don't get any reply it's because its a
University holiday and I'm at home, so try the snail-mail address.

