To Ted Nelson home page
To Xanadu home page

Xanadu(R) ZigZag(tm) Hyperstructure Kit

THE ZIGZAG COMMANDS for Version 0.49

(c) 1997, 1998 Project Xanadu.
System designed by Ted Nelson, programmed by Andrew Pam.
These instructions by TN.

 The fact that it works quite well has been kind of a surprise.

This is not "the final system" in any sense.

The later system *as designed*  will do many more things,
 much more easily.

However, this implementation works surprisingly well,
 and demonstrates some of the real powers of the general system.

So we can say "imagine a better interface."  As well as
 some of the more advanced functions.
 But you don't have to imagine-- you can see-- the
 fascinating space and structures this system makes

- - - - -


Basic principle of command capitalization:
 lower-case is for the more important and more often used
 places and functions (esp. right window, but also forward)
 upper-case (which is slightly more trouble)
 is for the slightly less important and slightly less often used
 places and functions (esp. left window, but also backward).

- - - - -

You must have Perl 5 and the curses/perl interface installed.
 (See installation instructions at www.xanadu.net/zigzag.)

To fire it up: Long form invocation:
perl zigzag.txt dataset-name[optional]

This can be easily aliased for convenience,
 shortening the invocation into (for example)
 "zigzag" or "zz".

You then see whichever data set you have named
 in exactly the view you last saw it (including cursor positions).

If you do not specify a data set (zigzag.data)
 and a file by that name does not exist,
 such a file will be created when the system is fired up.

If you do not specify a data set (zigzag.data)
 and a file by that name already exists,
 it will come up in exactly the view you last saw it
(including cursor positions).

- - - - -

Control k opens a cell for editing.  It opens in
 some Unix editor, such as vi, emacs or mule
 (specifiable in the code).

- - - - -


You may quickly see the text contents of a cell in the
 right-hand window by typing q and in the left-hand
 window by typing Q.  These are toggles,  closed again
 with the same key.


There are three viewing axes: x, y and z.
 The current view in each window maps the cell structure
 to the viewing axes, assigning these three axes to
 whatever structure dimensions you specify.


The cell structure may have any number of dimensions,
 though the system begins with only seven (d.1, d.2, d.3,
 d.cursor, d.clone, d.mark, d.contain, d.contain2).
 (The functions of these are explained at the end.)


You may quickly change the mapping of the ZigZag world's
 dimensions to the window's viewing axes.

Typing x, y or z in lower case causes the view in the
 right window to step by one dimension on the
 specified viewing axis (x, y or z).  Typing X, Y or Z in upper
 case causes the view in the left window to step by one
 dimension in the specified viewing axis (X, Y or Z).

VIEW MODES (presentation sequences, or "rasters")

A window currently has two possible view modes:

"I view" (rows connected by a single column, like the
 capital letter I) and "H view" (columns connected by a
 single row, like the capital letter H).

Changing the view mode does not change the structure,
 or the mapping of the structure to the viewing dimensions.
 It changes the sequence of presentation of the cells,
 beginning with the accursed cell (center of presentation)
 and following some chosen presentational sequence outward.

I and H views are very simple and basic, but many other
 programmable viewing modes are possible.

- - - - -

The "arrow" keys are--
 (these make more sense to your hand than reading them):

REAL arrows (which control the right cursor) or
 esfc (which control the left cursor) or
 ijl, (which control the right cursor) or
 d (forward left cursor = negward on Z)
 or D (backward left cursor = posward on Z) or
 k (forward right cursor = negward on Z) or
 K (backward right cursor = posward on Z).


The number of the accursed cell appears in the lower right
 corner of its window.

If you type a number as the argument for a command,
 that number appears at the lower left in the left window.

Backspace can correct a mistyped cell number.

- - - - -

Some of these commands may be used with arguments--
 arrows, numbers or both.

In some cases you may type a number before a key,
 affecting the result.

In other cases typing a number before a key has no result.

 Go Home (right cursor)
# g
 Go to cell of that number (right cursor)
 Go Home (left cursor)
# G
 Go to cell of that number (left cursor)

 Move cursor
# arrow
 Connect specified cell to accursed cell.  If nothing is connected
 to the cursor in that direction and the appropriate side
 of the specified cell is free, the connection will take place.
If the cursor already has a neighbor in the specified direction,
 *but* the specified cell is *unconnected on both sides*
 of the specified direction, the cell will be connected between
 the cursor and its present neighbor.
Note that if "# arrow" is one of the following, it may be difficult
 to see the result: # d, # D, # k, # K.  These connect the accursed
 cell to the specified cell in the forward or back direction.

 Clone ("transclude"), right window.
 Clone ("transclude"), left window.
 What it does is make a new instance of the left or right
 accursed cell.  The new instance becomes accursed,
 but unconnected to anything and alone in its window.

(Since it is easy to lose this cell, you may want to
 write down its cell number before doing anything else.)

- - - - -

The "delete" key deletes a cell, as does the delete cell
 on the menu.  However, deleted cells are not actually
 annihilated; they become stored +d.2ward from the "Midden" cell.
 ("Midden" is a name still used in Australia for "trashheap".)

- - - - -

Structure dimensions d.1, d.2 and d.3 have no assigned
 functions.  Think of d.1 as useful for headings, d.2 as useful
 for virtual lists, d.1 and d.2 together for ordinary tables
 and very interesting basket-weave structures, and d.3
 as a third dimension.

The "Cursor" dimension, d.cursor,  is the dimension
 on which a cursor (actually a cell) is connected to
 the cell it's on (the accursed cell); the user cannot change
 connections on the cursor dimension, except by explicitly
 moving the cursor, but the cursor dimension can be viewed
 like any other dimension.

The "Clone" dimension, d.clone,
 is the dimension on which a cloned cell
 is always connected to its original; this connection is
 enforced by the system, so you cannot disconnect a clone
 from its master, though you can rearrange clones on the
 clone dimension.  NOTE THAT EDITING ANY
 OF ITS CHAIN-- i.e., any clones of that same master,
 and the master itself, all are changed identically if any
 is changed.

The "Mark" dimension (not implemented) will be for
 marking cells, especially strips and groups of cells, in
 preparation for some operation.  The marked cells will
 have other cells (marking cells) connected to them on the
 Mark dimension.

The "Contain" dimension, d.contain, is the dimension
 representing containment: we represent cell A as being
 inside cell B by connecting it posward from B on the Contain
 dimension.  (In the next version it will be called d.inside.)

The "Contain2" dimension (which willl be called "d.contents"
 in tne next version) allows a given cell to contain more than one thing.
 Anything contained after the first cell contained is posward on
 d.contain2 from the first cell contained.

By looking at these specific connections, the system quickly
 determines what a cell contains or is contained by.
NOTE: you can see the contents of all the cells inside a cell
 when you look at it in a quad window.

BUG: currently subcell contents are not shown correctly
  in quad  windows.

It is easy to mauipulate the dimensions.  Go to the dimension list,
 which is negward from the home cell on d.1 and begins with "d.1".

To add a dimension: create a new cell with the dimension
 name you choose.  We recommend beginning it with "d.".

To rearrange the dimensions (the order in which they will
 cycle when you hit keys xyzXYZ: simply rearrange the
 dimension list using the "hop"command.

To delete a dimension: put the righthand cursor on a
 particular cursor name and hit "delete."

WARNING: deleting d.1, d.2, d.cursor or d.clone will
 probably have disagreeable results.

Note that the connections of a cell in a particular dimension
 remain, whether that dimension is deleted or not.  It is possible
 to delete a dimension and restore it later with a dimension
 of the same name, rendering those same connections operative