allbery@uunet.UU.NET (Brandon S. Allbery - comp.sources.misc) (06/11/89)
Posting-number: Volume 7, Issue 22 Submitted-by: fox@marlow.UUCP (Paul Fox) Archive-name: crisp1.9/part02 [My part # is out of step with the Subject: line -- why do people insist on using a part 0??? ++bsa] #!/bin/sh # shar: Shell Archiver (v1.22) # # This is part 1 of a multipart archive # do not concatenate these parts, unpack them in order with /bin/sh # # Run the following text with /bin/sh to create: # HLP.README # help/crisp/Abbrev.hlp # help/crisp/How.hlp # help/crisp/Intro.hlp # help/crisp/Prompt.hlp # help/crisp/concept/Regexp.hlp # help/crisp/concept/Buffers.hlp # help/crisp/concept/Files.hlp # help/crisp/concept/Windows.hlp # help/crisp/concept/Blocks.hlp # help/crisp/concept/Macros.hlp # help/crisp/concept/Register.hlp # help/crisp/concept/Proc.hlp # help/crisp/env/Env.hlp # help/crisp/env/Tree.hlp # help/crisp/env/Switches.hlp # help/crisp/env/Startup.hlp # help/crisp/env/Kbd.hlp # help/crisp/features/Compile.hlp # help/crisp/features/Filename.hlp # help/crisp/features/Grep.hlp # help/crisp/features/Options.hlp # help/crisp/features/Program.hlp # help/crisp/features/Region.hlp # help/crisp/features/Buflist.hlp # help/crisp/features/Spell.hlp # help/crisp/features/Wc.hlp # help/crisp/features/Shell.hlp # help/crisp/features/Abbrev.hlp # help/crisp/features/AbbFiles.hlp # help/crisp/features/Ascii.hlp # help/crisp/features/Calc.hlp # help/crisp/features/Mail.hlp # help/crisp/lang/Macros.hlp # help/crisp/lang/Vars.hlp # help/crisp/lang/Compiler.hlp # help/crisp/prim/A.cmd # help/crisp/prim/B.cmd # help/crisp/prim/C.cmd # help/crisp/prim/D.cmd # help/crisp/prim/E.cmd # help/crisp/prim/G.cmd # help/crisp/prim/I.cmd # help/crisp/prim/M.cmd # help/crisp/prim/Misc.cmd # help/crisp/prim/N.cmd # help/crisp/prim/P.cmd # help/crisp/prim/R.cmd # help/crisp/prim/S.cmd # help/crisp/prim/T.cmd # help/crisp/prim/U.cmd # help/crisp/prim/W.cmd # help/crisp/prim/F.cmd # help/crisp/prim/O.cmd # help/crisp/prim/K.cmd # help/crisp/prim/L.cmd # help/crisp/prim/V.cmd # help/crisp/prim/Q.cmd # help/crisp/roff/page1.mm # help/crisp/roff/Intro.mm # help/crisp/roff/Concepts.mm # help/crisp/roff/Features.mm # help/crisp/roff/Lang.mm # help/crisp/roff/Prim.mm # help/crisp/roff/Env.mm # help/crisp/roff/Install.mm # help/crisp/roff/ms.mac # help/crisp/sections/Arith # help/crisp/sections/Misc # help/crisp/sections/Debug # help/crisp/sections/List # help/crisp/sections/Kbd # help/crisp/sections/String # help/crisp/sections/Buffer # help/crisp/sections/Macro # help/crisp/sections/Movement # help/crisp/sections/Screen # help/crisp/sections/Env # help/crisp/sections/Window # help/crisp/sections/Proc # help/crisp/sections/Scrap # help/crisp/sections/Var # help/crisp/sections/File # help/crisp/sections/Search # if test -r s2_seq_.tmp then echo "Must unpack archives in sequence!" next=`cat s2_seq_.tmp`; echo "Please unpack part $next next" exit 1; fi echo "x - extracting HLP.README (Text)" sed 's/^X//' << 'SHAR_EOF' > HLP.README && XThis is the README file for the GRIEF Help Files. X XThe help files are mostly pure text files which can be accessed Xvia the <Alt-H> menus available in the MAC_1.* macro package. XThe macro makeman.m converts these macros to a troff input Xfile and can be used to print off a copy of the manual. X XAlternatively you can modify the macro to try and produce Xoutput suitable for your own favourite word-processing package. XThe Help files are in a format that is relatively simple to parse Xand perform global translations on. Look at makeman.m to see how Xand what it does. X XContext sensitive help is not yet supported and the kbd_help macro Xis unfinished. X XLate News: Macros can now accept C style comments /* */. X X=== XFile Version X============ ======= SHAR_EOF chmod 0444 HLP.README || echo "restore of HLP.README fails" mkdir help help/crisp >/dev/null 2>&1 echo "x - extracting help/crisp/Abbrev.hlp (Text)" sed 's/^X//' << 'SHAR_EOF' > help/crisp/Abbrev.hlp && XAbbreviations are a short-hand way of accessing certain Xvalue-added features of the CRISP macros. X XThere are two types of abbreviation macros - the first Xlevel abbreviation facility is as a short hand way of Xtyping in the names of macros, e.g. at the <F10> X"Command:" prompt; the other use of abbreviations is as Xa querying mechanism to certain prompts, e.g. the Xselection of files for the "Edit file:", and "Read Xfile:" prompts. X XThe abbreviations facility is accessed by hitting the X<Tab> key when prompted on the bottom line of the screen. X XIf the prompt is the "Command:" prompt, then the Xabbreviation facility can be used to select any CRISP Xbuiltin-macro, or user defined macro. The abbreviations Xmacro firstly compiles a list of all macros which start Xwith the prefix entered by the user. If there is only Xone macro, then the current input is replaced by the Xfull-name of the abbreviated macro. If there is more Xthan one unique macro name, then a pop-up window is Xplaced on the screen, with all the valid abbreviations Xin alphabetical order. The user can use the normal Xcursor movement keys to select an option (terminating Xthe selection with <Enter>), or using <Esc> to abort the Xselection. X XSome macros have different abbreviation facilities. For Xexample, the following macros provide for file-name Xabbreviations: X X (edit_file) X (read_file) X (output_file) X XIn this case, if the user hits <Tab> in response to the Xcommand prompt, then a window containing a list of all Xfiles in the current directory is popped up. If the user Xhas already typed in part of a filename, then the Xfile-name list will be all those files which start with Xthe characters typed in by the user. X SHAR_EOF chmod 0644 help/crisp/Abbrev.hlp || echo "restore of help/crisp/Abbrev.hlp fails" mkdir help help/crisp >/dev/null 2>&1 echo "x - extracting help/crisp/How.hlp (Text)" sed 's/^X//' << 'SHAR_EOF' > help/crisp/How.hlp && XHelp is normally accessible by typing <Alt-H>. When this Xis typed, a top-level menu is presented allowing the user Xto select different help options. The help is organised in Xan attempt to provide access to the different topics of Xthe help, with a minimal amount of menu hunting. X XHelp can also be accessed from any pop-up menu by pressing X<Alt-H>. Selection menus have help available for each Xtopic in the menu. X XWhen presented with a selection menu (current entry is Xhighlited, on color terminals this defaults to red Xbackground with green foreground), the <Up>, <Down>, X<PgDn>, <PgUp>, <Home>, and <End> keys may be used to move Xaround the menus. X XMenu items may also be selected by typing the first letter Xof the menu item. SHAR_EOF chmod 0644 help/crisp/How.hlp || echo "restore of help/crisp/How.hlp fails" mkdir help help/crisp >/dev/null 2>&1 echo "x - extracting help/crisp/Intro.hlp (Text)" sed 's/^X//' << 'SHAR_EOF' > help/crisp/Intro.hlp && XCRISP is an extensible programmers editor which has many Xfeatures which make the task of editing an enjoyable Xexperience. X XThis section describes how to use the help system. X XThe Help subsystem has a number of modes. Help is Xorganised into a number of different subject areas, and Xthe top level menus are aimed to make it easy to get Xhelp on the subjects you are interested in. X XThe help system is organised similarly to the printed Xreference manual - some topics are descriptive in Xnature, and describe some of the basic concepts and Xfeatures of CRISP. Other topics are used for quick Xon-line reference, eg syntax and usage of the macro Xlanguage primitives. X SHAR_EOF chmod 0644 help/crisp/Intro.hlp || echo "restore of help/crisp/Intro.hlp fails" mkdir help help/crisp >/dev/null 2>&1 echo "x - extracting help/crisp/Prompt.hlp (Text)" sed 's/^X//' << 'SHAR_EOF' > help/crisp/Prompt.hlp && XSome commands and macros prompt the user for extra input Xon the bottom line of the screen. This bottom line is Xreferred to as the prompt line. X XCRISP has a number of features to help in editing the Xprompt line. Some commands simply prompt for the data, Xand others supply a default. Default values to prompts Xare displayed in the highlite color. X XCRISP not only supports command line editing, but also Xsupports command history, ie every time the user types Xin text to a prompt, the response is saved and can be Xrecalled by using the <Up> and <Down> keys at subsequent Xprompts. X XCRISP also supports an abbreviations facility. When Xtyping in a response, if the user hits the <Tab> key, Xthen CRISP will try to fill in the partially typed word Xif this represents a unique abbreviation. (See also XAbbreviations). X XWhen typing in at the prompt line, the following Xcharacters may be used to edit what the user has typed in: X X<Backspace> Used to delete previous character. X X<End> Move cursor to end of input text. X X<Enter> Terminate input. X X<Esc> Abort input. CRISP responds with X 'Command cancelled.' on bottom line of X screen. X X<Home> Move cursor to start of input text. X X<Left>, <Right> Allows user to move backwards and forwards X along current input. X X<Ctrl-Left>, X<Ctrl-Right> Move left and right one word at a time. X X<Up>, <Down> Allows user to scroll through previous X responses to prompt. This is a command X history mechanism. X X<Alt-D> X<Ctrl-U> Delete all input text. X X<Alt-I> Toggle between insert and overtype mode. X X<Alt-L> Recalls the last prompt that was typed by X the user. This is useful if user types X in a response to the wrong response. X X<Alt-Q> Quote next input character. This allows user X to type things like <Tab> and <Esc> as part X of the input text. SHAR_EOF chmod 0644 help/crisp/Prompt.hlp || echo "restore of help/crisp/Prompt.hlp fails" mkdir help help/crisp help/crisp/concept >/dev/null 2>&1 echo "x - extracting help/crisp/concept/Regexp.hlp (Text)" sed 's/^X//' << 'SHAR_EOF' > help/crisp/concept/Regexp.hlp && XThis section describes what a regular expression is, and Xwhat the syntax is for regular expressions in CRISP. X X> What is a Regular Expression X XA Regular expression is a term used to describe a string Xof characters used in pattern matching. Regular Xexpressions allow certain classes of strings to be Xmatched, and provide a very flexible way of matching X'token's. X XCRISP provides a variety of features when performing Xpattern matching: X X - literal pattern matching. X - character class matching X - wild-card matching X - grouping X - alternation X - repeated expressions X XAll of these are described below. X X> Syntax of a Regular Expression X XA regular expression is a sequence of characters which are Xcompared against another string, or characters from the Xcurrent buffer. X XMost characters match themselves; some characters are Xspecial and are used to provide access to the pattern Xmatching structures mentioned above. X XThe special characters are as follows: X X <, ^ matches the beginning of a line. X >, $ matches the end of a line. X ? matches any single character. X * matches zero or more characters X [..] matches any character within the [..] X | performs alternation. X \c used to set the cursor after a match. X @ matches zero or more of the previous expressions. X + matches one or more of the previous expressions. X {..} groups a regular expression. X \x treat x as a normal character. X XA regular expression consists of a sequence of one or more Xsimple expressions. A simple expression (SE) is one of the Xfollowing: X X a sequence of characters X < or ^ X > or $ X [..] X ? X * X XA simple regular expression (SRE) is a simple expression, Xoptionally followed or enclosed in a modifier: X X {SE} X SE@ X SE+ X SE X XA regular expression is a sequence of simple regular Xexpressions as follows: X X SRE SRE (Concatenation) X SRE | SRE (Alternation) X X> Precedence of Regular Expression Operators X XThe following table gives the precedence of regular Xexpression operators, with the highest appearing first: X X \ X @, +, |, {..} X <, >, ?, *, [..] X concatenation X XThis means that if you have a regular expression as follows: X X cat | dog X Xthen this expression matches the pattern 'ca' followed by Xthe character 't' or 'd', followed by 'og', i.e. it is Xbracketed as X X {ca} {t|d} {og} X XTo match the word 'cat' or 'dog', brackets should be used: X X {cat} | {dog} X X> Character Escaping X XThe backslash character may be used to precede any Xcharacter to turn off any special effects the character Xhas. For example to match an asterisk in the text, the Xsequence \* would be used. X XA common form of error when writing macros is to forget Xthat the macro compiler strips off the first level of Xbackslash characters. For example, if the user wants to Xmatch an asterisk in a macro, he/she might write: X X (search_fwd "\*") X XHowever, this is wrong. The macro compiler strips off the X'\' and leaves the expression as "*" which matches every Xline. In order to escape this character properly, the Xfollowing should be used: X X (search_fwd "\\*") X XIn this case, the macro compiler strips off the first level X'\' leaving "\*" for the regular expression parser to Xtranslate. X X> Beginning of line operators: < and ^ X XThese operators match the beginning of a line. For Xexample, in order to match the word 'dog' only if it Xappears at the beginning of a line, use: X X <dog X XIf the '<' is omitted, then the first occurence of 'dog' Xwill be matched whether it occurs at the beginning of a Xline or in the middle. X XThe operator ^ is provided as a concession to Unix users. X X> End of line operators: > and $ X XThese operators are used to match the end of a line. For Xexample to match a comma followed by any sequence of white Xspace at the end of a line, the following can be used: X X ,[ \t\n]@> X XThis matches a ',' followed by zero or more occurences of Xspace, tab or newline, followed by the end of line. X X> The wild card operators: ? and * X XThe '?' operator matches a single character; '*' matches Xzero or more characters. X XThe number of characters matched by a '*' depends on what Xfollows the '*' and the search mode. (See section on XSearch Modes). X XFor example, the following expression: X X cat*dog X Xmatches any line which contains the word cat followed by Xsomewhere else on the line, the word dog. X X> Character Class: [..] X XThe square bracket operators are used to match one or more Xcharacters from a class of characters. If the expression Xis of the form '[..]' then a match is successful if the Xcharacter being matched is any of the characters within Xthe square brackets. If the first character after the '[' Xis either a '^' or '~', then the match is successful if Xthe character is NOT equal to any of the characters in the Xmatched class. X XThe characters within the square brackets form either an Xenumeration or a range of characters. '[ABC]' is an Xexample of an enumeration. It matches the single character X'A', or 'B', or 'C'. X X'[a-z]' is an example of a range. It matches any lower Xcase alphabetic character. X XRanges and enumerations may be combined, for example the Xfollowing may be used to match a C symbol: X X [_A-Za-z][_A-Za-z0-9]@ X Xwhich defines a regular expression expression consisting Xof a single character of '_', an upper or lower case Xalphabetic, followed by zero or more characters from the Xclass '_', A-Z, a-z or 0-9. X XSpecial characters may be enclosed in the character class Xconstruct using the \ syntax. Eg \n matches a new-line; \t Xmatches a tab. X XThe characters -, and ] may be included in the class by Xpreceding them with a backslash (e.g. \- or \]). X X> Repetition: @ and + X XThe @ and + are used to indefinitely match a previously Xspecified pattern. A simple regular expression followed by X'@' will be matched zero or more times; an SRE followed by X'+' will be matched one or more times. X XFor example, the following regular expression can be used Xto match a sequence of words followed by a comma (e.g. a Xsub-phrase of a sentence): X X {[A-Za-z]+[ ]+}+, X X[A-Za-z]+ matches any word of one or more alphabetic Xcharacters; the [ ]+ matches one or more spaces between Xeach word. The final }+ sequence means repeat the previous Xexpression one or more times. X XThe following example shows how to match the last word of Xone sentence and the first word of the following sentence: X X [A-Za-z]+.[ ]@[A-Z] X X[A-Za-z]]+ matches the final word in a sentence. The '.' Xmatches the full-stop after it. The expression [ ]@ Xmatches zero or more spaces which may separate the Xfull-stop and the first letter of the next sentence. X X> Regular Expression Grouping: {..} X XThe regular expression grouping characters are used for Xone of two purposes - alter the precedence in which the Xregular expression is parsed, and to define groupings of Xregular expressions for use by the translation mechanism. X XBy and large, the regular expressions: X X xyz and {xyz} X Xare equivalent. The major use is for bracketing in the Xpresence of the following operators: @, +, and |. For Xexample: X X {hello}@ X {cat}|{dog} X XThe other use for the bracket operators is to define a Xsub-part of a regular expression for use in translation. XEach occurence of brackets is defined as a grouping. The Xfirst occurence of {..} is group 1, the next is group 2. XBy grouping parts of a regular expression, translations Xcan be made which swap fields around. X XFor example, say we have a piece of C code which defines a Xtable as follows: X X "string1", number1, X "string2", number2, X .. X XIf we need to swap the fields around so that we have the Xnumbers first on the line, and the strings following them, Xthen the regular expression search pattern can be defined Xas: X X <[ \t]@{"[^"]@",}[ \t]@{[0-9]+,} X XThis breaks down as follows: <[ \t]@ matches the spaces Xand tabs at the beginning of the line. {"[^"]@",} matches Xthe string field (quote followed by zero or more non-quote Xcharacters terminated by a quote and a comma). This is the Xfirst group. [ \t]@ matches the zero or more spaces or Xtabs between the columns. {[0-9]+,} is the second grouping Xand matches the number followed by a comma. X XIf the translation replacement pattern (see (translate)) Xis defined as follows: X X \t\2\t\1 X Xthen this effects the field swap. The sequence \N where N Xis in the range 1-9 means insert the matched group Xdesignated by N. If N is zero, then the entire matched Xstring is inserted. X X> Minimal and Maximal Matching X XAll Unix regular expression parsers use the '*' and '+' Xoperators to mean repeat the previous expression zero or Xmore, or one or more times respectively. CRISP uses the X'@' and '+' operators for the same effect. X XHowever, all Unix parsers, when matching repeated groups Xwill always try to match the longest string. Under Unix, Xif we have the string: X X abbbbbbbc X Xand issue the search pattern: X X b* X Xthen this will match the 7 b's between the 'a' and 'c'. By Xdefault, CRISP (and BRIEF) perform a shortest match. This Xmeans that the regular expression: X X b@ X Xwill match only the first 'b' after the 'a'. For pure Xsearches, the difference hardly ever matters, but when Xtranslations are performed the different is very Ximportant. In the above example, using the following Xtranslation from 'vi' will result in the following string: X X s/ab*/X/p X Xc X XThis is what happens with CRISP: X X (translate "ab@" "X") X Xbbbbbbbc X XThis is simply because the Unix parsers try to match the Xlongest string, whereas CRISP tries to match the shortest Xstring. X XCRISP provides the ability to modify this default Xbehaviour. BRIEF calls this behaviour minimal/maximal Xmatching and backward matching. BRIEF tries to combine Xthese concepts without clearly explaining what they are Xdoing. X XCRISP operates in a compatible manner to BRIEF, and so the Xsame terminology will be adhered to. X XThe search macros - search_fwd, search_back, translate, Xsearch_string and search_list have a parameter, labelled X're' which is used to control the minimal/maximal Xmatching. This parameter can have one of seven valid Xvalues: -3, -2, -1, 0, 1, 2, 3. X XThe seven case are as follows: X X -3 maximal, backward X -2 maximal, same as search direction X -1 maximal, forward X 0 forward X 1 minimal, forward X 2 minimal, same as in search direction X 3 minimal, backward X X0 is used for non-regular expressions. The maximal Xmatching modes are compatible with Unix. X X> Matching Direction X XIn the table above, the values show what form of matching Xis to be performed. BRIEF and CRISP support the concept of Xa forward and backward matching mechanism. This Xterminology comes from BRIEF. The terminology is actually Xnot a very good one. X XThe difference between the two mainly comes into effect Xwhen performing a backward match. Consider the following Xline: X X the cat sat on the mat X _^ X Xwith the cursor placed on the 'h' of the first word, X'the'. In forward matching, if we are searching for the Xword 'the', then the string 'he cat sat on the mat' will Xbe searched, and the match will be on the word 'the' Xbefore 'mat'. In backwards matching mode, the search can Xstart before the cursor, and will match the word 'the' at Xthe start of the line. X X> Differences between BRIEF and CRISP X XBRIEF was developed under DOS and provides a rich set of Xregular expression operators. However, Unix already has a Xde facto set of regular expression operators, which are Xshared among programs, such as 'vi', 'ed', 'awk' and 'sed'. X XIt was felt unwise to force a different set of operators Xonto Unix users. I have tried where possible to support Xboth sets of operators under Unix, i.e. the ones that BRIEF Xsupports, and those that are familiar to Unix users. X XThe full set of BRIEF operators are supported so that XBRIEF macros can be run under CRISP with no modification. XIn some places extensions have been made to the regular Xexpressions accepted by CRISP to make Unix users more at Xhome. The following sections describe the differences a Xregular BRIEF user will see when using CRISP regular Xexpressions, and the differences a Unix user will see when Xusing the CRISP regular expressions. X X> Differences for BRIEF users X XThe following extensions have been added: X XThe ^ operator is valid as an alternative to '<' to match Xthe beginning of a line. X XThe sequence [^..] is equivalent to [~..] (matches all Xcharacters not in the character class). X XThe character $ is valid as a match for the end of line Xcharacter, and is an alternative to '>'. X XCRISP cannot perform regular expression matches over line Xboundaries. X X> Differences for Unix users X XThe following describes the differences between Unix Xregular expression syntax and the CRISP regular expression Xsyntax. If the user has selected Unix regular expression Xsyntax, then see the next section for further details. X XThe character '<' may be used as an alternative to '^' to Xmatch the beginning of a line. X XThe character '>' may be used as an alternative to '$' to Xmatch the end of line. X XThe sequence [~..] is equivalent to [^..] and is used to Xmatch all characters not in the character class. X XUsers of egrep will note that the precedence of '|' is Xdifferent in CRISP. In egrep the expression 'dog|cat' is Xbracketed as '{dog}|{cat}'; in CRISP, the implied Xbracketing is '{do}{g|c}{at}'. X XThe \c pattern is available for cursor positioning; this Xis not available under other Unix regular expression Xparsers. X XUnder Unix, '*' is usually used as a postfix operator to Xmean one or more occurences of the previous expression, eg X.* matches zero or more characters. In CRISP, '*' is Xequivalent to .*, and is an operator in its own right. X XThe '?' in CRISP is equivalent to '.' in Unix. X XThe operator '@' in CRISP is equivalent to the '*' Xoperator in other Unix parsers. X XOther Unix program bracket regular expressions using the X\(..\) syntax. CRISP uses '{..}' instead. X X> Regular Expression Syntax Mode X XCRISP allows the user to select between pure CRISP regular Xexpression syntax, as described above, or the more Xfamiliar Unix syntax. This is done by calling the X(re_syntax) primitive. In CRISP mode, regular expressions Xare exactly as described in the previous sections of this Xchapter. X XIn Unix mode, the following features are enabled/disabled: X XThe '.' character replaces the '?' wild-card character. X XThe '*' character means zero or more iterations of the Xprevious expression. This disables the CRISP '@' zero or Xmore character. X XThe sequence \(..\) replaces the use of {..}. The { and } Xcharacters become normal characters. X SHAR_EOF chmod 0644 help/crisp/concept/Regexp.hlp || echo "restore of help/crisp/concept/Regexp.hlp fails" mkdir help help/crisp help/crisp/concept >/dev/null 2>&1 echo "x - extracting help/crisp/concept/Buffers.hlp (Text)" sed 's/^X//' << 'SHAR_EOF' > help/crisp/concept/Buffers.hlp && XThis section describes what a buffer is and some of the Xproperties of buffers. X X> What is a Buffer ? X XA buffer is an object within CRISP used to hold the Xcontents of files. CRISP supports the dynamic creation of Xa buffer. X XBuffers are like dynamic string arrays. Each line in the Xbuffer is a variable length string (terminated with a \n Xcharacter). The buffer grows and contracts as data is put Xinto the buffer. X XBuffers can either be created empty, using the X(create_buffer) macro, or a file may be placed into the Xbuffer, (create_buffer) and (edit_file). X XA buffer has a number of attributes associated with it: X X - buffer name X - filename X - contents of buffer X - permissions X - status flags X - current position X - symbol table. X - undo information X X> The Buffer and File Names X XEach buffer is given a name. This name is used to uniquely Xidentify the buffer. These names usually correspond to the Xfile names which are also associated with a buffer. X XA buffer may have an optional filename associated with it. XThis file name is usually specified as the result of Xreading a file into a buffer. The filename is used when Xsaving the contents of a buffer (via (write_buffer)). X X> The Contents of a Buffer X XThe buffer contents is an array of lines. Lines are stored Xinternally as a line header, plus a pointer to the data Xwithin the line. A buffer can contain arbitrary ASCII Xcharacters - each line has a length associated with it. XThe C standard of using a NULL terminator is not used, Xsince this is too inefficient. X XCRISP works best at editing normal ASCII files, but can be Xused to edit binary files. X XEach line in the buffer has a pointer to the next and Xprevious lines in the buffer, ie the lines in the buffer Xare stored as a linked list. This structure makes it easy Xto move from the beginning of the buffer to the end of the Xbuffer - very little work is involved. Jumping to a line Xin the middle of the buffer involves more work. X XThe line headers and data parts of the line are allocated Xseparately. The idea here is that line headers are Xallocated in big chunks, and the data for each line is Xheld elsewhere in memory. This helps in virtual memory Xsystems. When walking down the linked list of lines, only Xthe pages which contain the line headers need be resident Xin memory. The data stored for each line does not need to Xbe in memory unless the line is being modified or being Xdisplayed. X XA buffer always contains a place-holding line at the end Xof the buffer. This line has no data but acts as a place Xholder for the begin/end markers of the buffer. When an Xattempt is made to modify this 'pseudo-line', CRISP Xallocates a new line header. This allows the user to move Xthe cursor to one line past the end of the buffer and Xstart typing. X XCRISP keeps track of how many lines there are in the Xbuffer. This allows the percentage marker to be displayed Xon the status line. (See (echo_line)). X X> Permissions X XWhen a file is read into a buffer, a note is made of the Xoriginal protection bits on that file. This is needed so Xthat when the file is written away, it can give the output Xfile the same protection bits as the original file. For Xexample, when editing an executable shell script, the Xexecute bits are turned on for the modified file. X XCRISP understands the concept of a read-only file, e.g. a Xfile checked out from SCCS via a 'get' command. CRISP does Xnot allow any editing to be performed on the file. X X> Status Flags X XCRISP maintains a number of status flags for each buffer, Xe.g. whether a backup of the file associated with the buffer Xis to be made when a (write_buffer) is performed, etc. X XThese flags can be inquired via the (inq_buffer_flags) Xmacro. X X> Current Position X XCRISP maintains two separate cursor for each buffer - the Xnormal cursor, as displayed on the screen, and a parallel Xcursor for process buffers. (See the section on Processes). X XIf a buffer is not being displayed in a window, then the Xcursor position changes as a result of text insertions, Xdeletions, pattern searches, etc. When the buffer is Xattached to a window, the cursor is copied into the Xwindows data structure. X XThus, each window onto a buffer maintains an independent Xcursor. This allows different parts of a buffer to be Xviewed in different windows. X XWhen a buffer is detached from a window, the cursor is Xcopied into the buffers data structure. X X> Symbol Tables X XCRISP supports the concept of a symbol table associated Xwith a buffer. These symbols are defined via X(make_local_variables). These symbols are in scope Xwhenever the buffer is set to the current buffer. This Xallows buffer specific state information to be associated Xwith each buffer. X X> Undo Information X XIf a buffer is marked as a normal buffer (ie non-system), Xthen all changes to the buffer are recorded in a file. XThis allows the (undo) command to function. The (undo) Xinformation is discarded when the buffer is deleted. X XCRISP also supports a (redo) facility. This allows an X(undo) operation to be undone. The only restriction with Xredo is that you cannot use redo unless the last operation Xwas an undo itself. X X> System Buffers X XSystem buffers are the same as normal buffers, except no Xundo information is maintained for them. This makes them Xsignificantly faster at performing operations which modify Xthe buffer. System buffers are designed for use by macros X- ie they are not normally directly modifiable by the user. X X> The Scrap Buffer X XThe scrap buffer is a special buffer used to hold the Xresult of scrap operations. Internally, it is just like Xany other buffer, and looks much the same as a system Xbuffer. However, whenever a (cut), (copy) or (paste) Xoperation is performed, the data is explicitly taken or Xput into the scrap buffer. X XAlthough the scrap buffer is an internal buffer, you can Xwatch the contents of this buffer by exploiting a Xmis-feature of CRISP. X XIf you edit the file "/-scrap-//" then CRISP will attach Xyou to the scrap buffer. If you create another window on Xthe screen and copy text to the scrap, you will see the Xscrap window change its contents. X SHAR_EOF chmod 0644 help/crisp/concept/Buffers.hlp || echo "restore of help/crisp/concept/Buffers.hlp fails" mkdir help help/crisp help/crisp/concept >/dev/null 2>&1 echo "x - extracting help/crisp/concept/Files.hlp (Text)" sed 's/^X//' << 'SHAR_EOF' > help/crisp/concept/Files.hlp && XThis section describes what files are and how they are Xmanipulated within CRISP. X X> What are Files ? X XFiles are used to store long term information. Files may Xbe edited by CRISP. This is done by reading a file into a Xbuffer. (See section on Buffers). X XOnce a file is read into a buffer, it may be edited using Xany of the primitives which affect buffers. When a file is Xread into memory, it is actually part of the address space Xof CRISP. CRISP does not perform any dynamic paging - Xinstead it relies on the virtual memory system within the Xoperating system. X XThis is important to bear in mind, since editing a large Xfile increases the process size of CRISP by an amount Xproportional to the size of the file. X XIn practise, CRISP can always edit a file, and usually Xdoes a better job of it, than say, vi, which usually Xlimits the size of files it can edit, based on the number Xof lines in the file. X XCRISP limits the editing of files based on the amount of Xvirtual memory a process can acquire. X XThis makes it much faster to do certain operations on Xfiles, e.g. global substitutes. X XCRISP can edit an arbitrary number of files concurrently, Xagain limited by virtual memory. X X> Text and Binary Files X XCRISP knows how to edit binary and text files. For most Xoperations buffers containing binary and text files are Xtreated the same, however, the two exceptions are reading Xa file into a buffer, and writing the file away. X XWhen a file is read into a buffer (via (edit_file) or X(read_file)), CRISP examines the first two bytes of the Xfile. If either byte is zero (0x00), or has the top bit Xset, then CRISP assumes that the file must be binary. In Xthis case CRISP does not treat new-line characters as line Xterminators, but instead treats them as part of the line Xof text. CRISP chops the lines in the file into 32 byte Xchunks, so that you dont end up with a one line buffer Xpossibly containing tens of thousands of characters. X XWhen a buffer containing a binary file is written away, XCRISP does not insert new-line characters between Xboundaries, but just writes the lines away as they are X(possibly including any embedded new-lines in the buffer Xcontents). X XThese two features ensure that a user can edit a binary Xfile -- although care should be taken not to insert Xnew-lines into the buffer, since these will be treated as Xline terminators and ignored when the file is written away. X XThe state of a buffer can be tested via the (inq_buffer_flags) Xprimitive to see if the buffer contains a binary or text file. X X> Operations on Files X XCRISP contains a number of primitives for manipulating Xfiles. Files may either be associated with a buffer, or Xmay be operated on independently of any buffer. X XThe buffer-independent file operations are limited to the Xfollowing: X X - check for existence of file X - delete a file X - perform directory look up. X XA buffer may be created which is associated with a file. XBuffers are the main editing areas for CRISP. Buffers are Xlike dynamic arrays of strings, each line is a separate Xstring, and allows for efficient editing, e.g. inserting and Xdeleting characters, and for moving blocks of text around, Xe.g. inserting and deleting entire lines. X XBuffers are more completely described in the section on XBuffers. Buffers have two names associated with them - a Xbuffer name which is used to uniquely identify each Xbuffer, and a filename. The buffer name is usually the Xlast part of the full path name of a file. The association Xof a file with a buffer is done so that when the buffer is Xsaved the buffer will be written to the same file that was Xoriginally read in. X X> Backing up a File X XCRISP supports automatic backup of files. When a file is Xedited, (i.e. read into a buffer), a flag is set to say that Xwhen the file is written away, a copy of the original file Xshould be saved. X XCRISP supports a number of mechanisms for saving these Xbackup files. X XBacking up files are performed for a number of reasons - Xfirstly so that the user can make a whole load of changes Xto a file, and if during the editing session the user Xdecides to abandon the editing, he/she can revert to the Xoriginal version of the file. Backing up also avoids files Xbeing lost if CRISP or the system crashes whilst saving a Xfile. X XBacking up files is also useful if users do something Xstupid, like accidently type something like 'rm * .o' when Xthey should have typed 'rm *.o'. X XCRISP allows the user to turn on or off backup generation. X(See the (set_backup) macro primitive). X XWhen CRISP comes to save a file, it performs the following Xalgorithm in trying to decide how and where to save the Xfile: X X 1. If the file has multiple links to it, the file X is copied to the destination directory. (See below). X If the file has only a single link, then it X may be link()ed to the destination directory. X 2. For each directory in the BBACKUP environment X variable, try to link() the file to the X specified directory. This operation may fail X if the directory is on a different file X system. X 3. If step 2 fails, then for each directory in X the BBACKUP environment variable, try and copy X the file to the resultant directory. This may X fail because of permissions. X 4. If steps 2 & 3 fail, try and create a file with X a .bak extension. If the file has multiple links, X then the old file is copied to the new file. If the X file has a single link, then it is link()ed to the .bak X file. X XThe overall aim of the algorithm is to use the link() Xsystem call to save the old file where possible. This is Xmuch faster than copying the file block-by-block. By Xspecifying a directory or directories in a global Xenvironment variable, then all backup files can be saved Xin a single directory. This is better than cluttering up Xdirectories with .bak files. This allows the user to Xeasily clear away all .bak files with an 'rm *' command, Xrather than having to issue a X X find -name \*.bak -exec rm {} \; X XHaving a global backup directory is my preference. CRISP Xgives you the user, a personal choice as to how you want Xto do this. X XOnce a backup file has been made (as a result of a X(write_buffer) macro call), no other backups will be made Xfor that file. This is done so that a user can always go Xback to the state a file was in when CRISP was entered, Xnot back to the last (write_buffer) command. X X> Autosaving X XAutosaving is a mechanism in CRISP which causes all Xcurrently modified buffers to be written to disk when XCRISP is idle, so that in the event of a system crash, Xetc, then an upto date copy of the files can be restored. X XCRISP itself does not directly implement autosaving; Xinstead, it is a macro which is supplied with CRISP. CRISP Xsupports the mechanism for implementing the autosave Xfeature. If any user does not like the mechanism, then Xhe/she can modify the macro to make it do what the user Xreally wants. X XThe existing autosave macro is there because it is useful, Xand for serious user's, they can use it as a guide for Xwriting their own. X XAutosaving is implemented via the idle timer. The idle Xtimer is a timer which is maintained by CRISP. The idle Xtimer goes off when the user hasn't typed anything for 60 Xseconds. (This is configurable via the command line). The Xautosave macros looks at each non-system buffer, and Xwrites out the buffer if it has the buffer modified flag Xset. X XThe autosave file is a function of the real file name. If Xthe file is called foo.c, then the file is saved in a file Xcalled '@foo.c@'. The use of the '@'s is to make the files Xstand out when performing a directory listing. The prefix X'@' is useful since if for some reason CRISP doesnt delete Xthe autosaved files, then it is easier and safer to issue Xan 'rm @*' command than an individual rm for each file. XThe trailing '@' is added on so that if the user issues a Xcommand such as: X X ls *.c X Xthen the autosaved files dont get included in the list. XThe major objective here is to avoid sticking on a long Xsuffix (e.g. .asv) to a file name on systems such as V.3 XUnix, which only have 14 character file names anyway). XAdding suffixes to a filename is a dangerous game since Xthe original filename may already be at the 14-character Xfilename limit, and the suffix would get ignored. Having a Xprefix and suffix seems to be the best of both worlds. X XAny autosaved files should be deleted when CRISP exits. X XWhen the autosave macro runs, it prints the message X'Autosaving...' followed by 'Autosave complete.' when it Xhas finished. X X> Editing Binary Files X XCRISP supports the ability to edit binary files. Binary Xfiles may be treated as a normal ASCII file. CRISP makes a Xreasonable attempt to display binary characters on the Xscreen. On displays which support the ability to display Xcharacters with the top bit set, CRISP will use this. On Xdisplays which cannot distinguish these characters, CRISP Xwill display the characters in octal or hexadecimal. (See X(display_mode)). X SHAR_EOF chmod 0644 help/crisp/concept/Files.hlp || echo "restore of help/crisp/concept/Files.hlp fails" mkdir help help/crisp help/crisp/concept >/dev/null 2>&1 echo "x - extracting help/crisp/concept/Windows.hlp (Text)" sed 's/^X//' << 'SHAR_EOF' > help/crisp/concept/Windows.hlp && XThis section describes what a window is and how they are Xused. X X> What is a Window ? X XA window is an area of the screen, through which part of a Xbuffer may be viewed. All windows on screen have a buffer X'attached' to them. X XWindows are very useful for viewing more than one file at Xthe same time, or different parts of the same file. X XWindows and buffers are separate entities. Various macro Xprimitives allow buffers to be mapped to various windows. XA window can never be displayed on its own, it must always Xbe attached to a buffer, otherwise CRISP gets confused. X XA buffer may be attached to more than one window, in which Xcase each window can be set up to view a different part of Xthe buffer. X X> Tiling and Overlapped Windows X XCRISP supports two forms of windows - tiled and Xoverlapping. Tiled windows are windows which do not Xoverlap or obscure each other. Initially CRISP starts up Xwith a single window which occupies the whole of the screen. X XThis window can be split horizontally or vertically, thus Xat all times the entire screen contains a window mapping a Xbuffer. X XOverlapped windows are usually used in a pop-up mode, e.g. Xthe buffer list macros pops up a window onto the screen Xwhich obscures any windows sitting behind it. When the Xmacro has terminated the window is destroyed and the Xwindows behind it are refreshed. X X> Cursor Positioning X XEach window maintains an independent cursor onto the Xbuffer below it. Any changes to a buffer made in one Xwindow are displayed in the other windows displaying the Xsame part of the same buffer. X SHAR_EOF chmod 0644 help/crisp/concept/Windows.hlp || echo "restore of help/crisp/concept/Windows.hlp fails" mkdir help help/crisp help/crisp/concept >/dev/null 2>&1 echo "x - extracting help/crisp/concept/Blocks.hlp (Text)" sed 's/^X//' << 'SHAR_EOF' > help/crisp/concept/Blocks.hlp && XThis section describes blocks (otherwise referred to as Xregions and anchors). It also discusses the scrap, and the Xtypes of anchors. X X> What is a Block/Region ? X XA block, or region, is a marked area of a buffer. This Xmarked area is highlited when it is displayed on the Xscreen so that the user can easily see exactly what has Xbeen marked. X XThis following summarises the operations that may be Xperformed on a block: X X - it may be copied to the scrap. X - it may be deleted. X - it may be written out to a file. X - it may be indented. X - it may be formatted. X XCRISP supports a number of basic operations which may be Xperformed on blocks. The other functions are higher level Xmacros which are built from these primitives. X X> Types of Regions X XThere are four types of regions: X X - non-inclusive X - inclusive X - line X - column X X> Inclusive and Non-inclusive Region X XInclusive and non-inclusive regions are similar, except Xfor non-inclusive regions, the character under the cursor Xis not considered to be part of the marked region. The Xeffect of this is illustrated by the following. X XConsider a buffer with two lines in it: X X This is line one. X And this line two. X XFor an inclusive region, if the cursor starts out on the X'T' and is moved down a line, then the whole of the first Xline is highlited as well as the 'A' at the beginning of Xthe second line. For a non-inclusive region, the region is Xhighlited the same, except the 'A' is not highlited as Xwell. If the inclusive region is deleted then whole of the Xfirst line will disappear as well as the 'A' at the start Xof the second line. For the non-inclusive region, only the Xfirst line will be deleted. X X> Column Regions X XA column region is treated internally the same as an Xinclusive region, except the display code knows only to Xhilite a rectangular block of the buffer. (cut)-ing or X(copy)-ing the column mark will be treated the same as if Xit were an inclusive mark. X XColumn regions are provided for manipulating rectangular Xregions of the buffer. The only currently supported high Xlevel macro for use with column regions is column-delete. XSupport for the other types will be included in a later Xrelease. X X> Line Regions X XLine regions are used to select the entirety of a line Xirrespective of where the cursor is on the line. Line Xregions are very useful for moving entire lines of text. XUsing the inclusive or non-inclusive regions is very Xfiddly when copying lines since the cursor has to be in Xthe correct position for (cut), (copy) and (paste) to have Xthe desired effect. X SHAR_EOF chmod 0644 help/crisp/concept/Blocks.hlp || echo "restore of help/crisp/concept/Blocks.hlp fails" mkdir help help/crisp help/crisp/concept >/dev/null 2>&1 echo "x - extracting help/crisp/concept/Macros.hlp (Text)" sed 's/^X//' << 'SHAR_EOF' > help/crisp/concept/Macros.hlp && XThis section describes what a macro is and how they are Xused. X X> What is a Macro ? X XA macro is a sequence of instructions which performs a Xhigh-level function. Different people have different ideas Xabout what a programming editor should look like. Some Xpeople want simple options, others need complicated macros Xwhich can perform tasks as complicated as sort the Xfunctions in a .c file into alphabetical order. X XCRISP is designed to allow it to be easy to customise the Xediting tasks that a user wants, no matter how complicated Xthe editing facility required. X XRather than complicate CRISP internally with hard to Xchange ideas about what facilities should be available, XCRISP provides a set of builtin primitives which Xmanipulate the objects CRISP knows about, e.g. files, Xbuffer, windows, etc. X XCRISP has a programming language which allows users to Xcombine these primitives into more complex functions. X XFor example, CRISP provides a set of functions to search Xthe current buffer for a string. One of the high level Xmacros provided with CRISP matches braces, i.e. it checks Xthat there are an equal number of opening and closing Xbrackets. This is an example of a macro. The macro is Xbuilt from the primitives which CRISP has compiled into Xits code. X XIf you do not like the way these macros are written, then Xyou may easily customise them. X X> Tools for Writing Macros X XCRISP provides a number of facilities to aid in writing Xand debugging your own macros. These include a compiler Xwhich optimises the layout of the code so that CRISP can Xthen execute the macro as efficiently as possible. X XMacros are usually stored in files, and commonly have a X'.m' extension so that their purpose stands out. X XCRISP comes with a macro compiler, called 'cm'. cm is used Xto compile the macros to a more compact internal format. XThis format allows CRISP to load the entire file in one SHAR_EOF echo "End of part 1" echo "File help/crisp/concept/Macros.hlp is continued in part 2" echo "2" > s2_seq_.tmp exit 0 -- ===================== Reuters Ltd PLC, Tel: +44 628 891313 x. 212 Westthorpe House, UUCP: fox%marlow.uucp@idec.stc.co.uk Little Marlow, Bucks, England SL7 3RQ