H [0+8+FQ(+4)[1 0FO10F"G+Q1 'W+FQ()+4U1 FQ1"L0' ,Q1:M(Q1+4(]1]0)) e. .-T-:E39r%T%$$%","u+(+o'Y'i('(2)I)/****}4f4.:..{9_k y _E_*CC1[[7Z_Z?==J7JNNlLVLjMMrIILLeSeSDRROOUXfXTyTTfTtUVUVVXXE\Y\>\ \6g6q==j>?E8E@@k8J8Y;S;8HbHuFwG6D6N6q6bubBLISS Modem(m.m & Init Buffer Locals) 1,:i*!m.LComment Startw 1,:i*! m.LComment Beginw 1,:I* )%M.LImbedded Comment Endw 1,:I*%( M.LImbedded Comment Beginw 1,m.m& Indent Without Tabsm.LMM & Indentw 1,m.m& XIndent Without Tabsm.LMM & XIndentw 1,40m.lComment Columnw 1:"N m(m.m& Default Init BLISS Mode)' m.vBLSIND ..Dw ^:IBLSIND ..D\ A A A A AA AA A ' ( ) A A A A / AA AA AA AA AA AA AA AA AA AA A ; A A A A A AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA A A A A AA A AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA AA A | A A \ q.0,1M(M.M& Set Mode Line)BLISS ^R Indent BLISS Stmt[.2[.3[.4[.5 :i*m.vLast BLISS Indenterw .m(m.m& BLISS Tokens to Leftp)"N f^m(m.m^R BLISS Indent Relative)' ff"G :iLast BLISS Indenter(^R Indent Nested) f^m(m.m^R Indent Nested)' .[.1 1m(m.m& BLISS End Prev Stmt)u.2 q.2j m(m.m& BLISS Next Token)u.5u.3 q.5-."Lq.2jm(m.m& BLISS Next Token)u.5u.3' q.3-q.1"L q.3,q.5x.4 1:"N q.1,q.3m(m.m& BLISS Indent Unfin Stmt)u.3u.1 '' "# .-b"N 1m(m.m& BLISS End Prev Stmt)u.2 q.2j m(m.m& BLISS Next Token)u.5u.3 q.5-."Lq.2jm(m.m& BLISS Next Token)u.5u.3' q.3,q.5x.4' "# bu.3bu.5:i.4' 1:"N q.1,q.3m(m.m& BLISS Indent After Stmt)u.3u.1 '' fsrgetty"nq.1,q.3' fsechodisAfsechodis 0t^R Insert BLISS Endv 0,0a- "N0,0a- "N ^m(m.m^R Indent BLISS Stmt)f'' .,(iEND;).f .: .[.1fnq.1j 4r.[.6 [.2[.4[.50[.3 q.4,q.5x.4' q.2j fwx.5 5f~MACRO"E .[.6q.1ji %.u.1].6j Onamit' 6f~MODULE"EOnamit' .m(m.m& BLISS Get Statement Label)u.3 q.3"E7f~ROUTINE"EOnamit' "#5f~BEGIN"N fwx.3 :i.3.3-.4' "#fwx.3''' Ocomend !namit! fw+.m(m.m& BLISS Next Token)x.3 :i.3.5 .3 !comend! q.1ji %( .3 )% q.1-fku.1 q.2j 0^v *30:w 1& BLISS Get Statement Labelq.[.0fnq.0j 1m(m.m& BLISS End Prev Stmt)j 1,.m(m.m& BLISS Next Token)[.2[.1 q.2j0,1a-:"N0' q.1,q.2x*Indent BLISS Region:[.1.u.2[.3[.4[.5 q.1,q.2fu.2u.1 q.1j 1[9q.1,q.2x.5 q.1,q.2m(m.m& Kill Text) g.5 q.1jz-q.2u.2 <0l m(m.m& BLISS Next Token)u.4u.3 q.3j z-.-q.2:; ^m(m.m^R Delete Horizontal Space)w ^m(m.m^R Indent BLISS Stmt)w l > q.1 z-q.2j q.1,.^R BLISS Indent RelativeqLast BLISS Indenter[.1 :iLast BLISS Indenter.1(^R BLISS Indent Relative) [1^:I1|qLast BLISS Indenteru.1 :iLast BLISS Indenter.1(^R Tab to Tab Stop) :M(M.M^R Tab to Tab Stop)| 0,1af  +1"G 0,0af  +1"G fshpos-1( -d)m(m.m& Indent)w '' .[PFSHPOS[0 ^-f  L .[QFSHPOS[2 0L Q0"G1:<0,Q0+1:FM>"ER' "#0L1:<0,Q2+1:FM>"ER' "#QPJ:M1'''  FSHPOS(QQ,QPK ):M(M.M& Indent)^R Global BLISS Comment0fo..qGlob of Comments Flag"N f:^m(m.m^R Indent for Comment)' 1m.vGlob of Comments Flagw fn0m.vGlob of Comments Flagw [.1[.2 m.m^R End Comment[..\ :i*Global Comment[..j 10[Comment Column :i*%(*[Comment Start :i* )%[Comment End :i*%(*[Comment Begin 1[Space Indent Flag fsqpptr [Auto Fill Mode m(m.m Auto Fill Mode) :lgComment Start 1m(m.m^R Indent for Comment) .-z"L-l':l w 0l :fb%(*"L ' fsz-.f[vzw m(m.m& Align Global BLISS Comment Ends) zjf]vzw .f[vbw m(m.m& Align Global BLISS Comment Ends) bjf]vbw qQfsqpunwindw m(m.m& Process Options) m(m.m& Set Mode Line) & Align Global BLISS Comment Ends[.1[.2[.3 bj <:s%(*;fkc 0u.1 0u.2 0u.3 .(<:fb%(*; %.3w .-1f  4f=* )%"E1u.2' :fb)%; fshpos,q.1fu.1w l> fsz-.f[vzw )j q.3-1"E q.2"N -^f  bk 51fo..qBLISS Star Line Widthu.1'' q.1-2u.1 q.2"N (q.1-qComment Column-3&1)+q.1u.1' <:s)%; -7f=%( * )%"E 2r q.1-(fshpos)/2 2c' 2rq.1m(m.m& Indent)f l> zjf]vzw > ^R End Global BLISS Comment^m(m.m^R End Comment)f ff"G .(bj <:s%(*;.-1f > )j' fs^R Exit^R Slurp BLISS to Char[.1[.2[.3[.4[.5[.6 m.ifiu.5 z-.u.1 0l^f  r z-.u.6 0:lz-.u.3 .m(m.m& Back Over BLISS Line Comment)j .u.2 <.,(0l).:fb.5;> .,q.2f(fx.4)f z-.-q.3"N ^m(m.m^R Indent for Comment)f' z-q.6j .,(g.4i).f 0l ^m(m.m^R Indent BLISS Stmt)f z-q.1jw1^R Print Last BLISS IndenterqLast BLISS Indenter[.0 fsechodisplayw Cfsechodisplayw ^ft.0 0fsechoactivew & BLISS Indent After Stmt{qLast BLISS Indenter[.1 :iLast BLISS Indenter.1(& BLISS Indent After Stmt) u.1 [.2 [.3 q.2-b"E 4u.3 1:' "# q.2jfshposu.3' q.1j q.3-(fshpos)-1"L^m(m.m^R BLISS Indent Relative)' q.3m(m.m& Indent)& BLISS Indent After CompoundqLast BLISS Indenter[.1 :iLast BLISS Indenter.1(& BLISS Indent After Compound) u.1 [.2 1:"N 0m.vCOMP BLOCK Indentationu.3' q.2jfshpos[.6 q.2m(m.m& BLISS Last Sub-Stmt Token)[.5[.4 q.4,q.5f~BEGIN"Eq.4jfshpos+q.3u.6' q.4,q.5f~DO"Eq.4jfshpos+q.3u.6' q.4,q.5f~UNTIL"Eq.4jfshpos+q.3u.6' q.4,q.5f~WHILE"Eq.4jfshpos+q.3u.6' q.4,q.5f~INCR"Eq.4jfshpos+q.3u.6' q.4,q.5f~DECR"Eq.4jfshpos+q.3u.6' q.1j q.6-(fshpos)-1"L^m(m.m^R BLISS Indent Relative)' q.6m(m.m& Indent)& BLISS Indent Unfin Begin Stmt,m(m.m& BLISS Indent After New Block)& BLISS Indent After New BlockqLast BLISS Indenter[.1 :iLast BLISS Indenter.1(& BLISS Indent After New Block) u.1[.2 q.2j fshpos+4[.3 q.1j q.3-(fshpos)-1"L^m(m.m^R BLISS Indent Relative)' q.3m(m.m& Indent)& BLISS Indent After Routine Stmt[.1[.2[.3 qLast BLISS Indenter[.4 :iLast BLISS Indenter.4(& BLISS Indent After Routine Stmt) 0fo..q1st Routine Stmt Indentationu.3 q.1j q.3-(fshpos)-1"L.,.' q.3m(m.m& Indent)& BLISS Indent After End StmtqLast BLISS Indenter[.1 :iLast BLISS Indenter.1(& BLISS Indent After End Stmt) u.1[.2[.4[.5 0[.3 q.2j !Putinsometimesearchformatchinglabelsubr...*! q.2j fshpos[.3 q.1j q.3-(fshpos)-1"L^m(m.m^R BLISS Indent Relative)' q.3m(m.m& Indent)& BLISS Indent Unfin StmtqLast BLISS Indenter[.1 :iLast BLISS Indenter.1(& BLISS Indent Unfin Stmt) u.1 [.2 [.4 [.3[.5 1:"N q.1j-l q.2-."g 5*.,5*.+1:g..d[.6 5*.:f..d 2:fwlfshposu.5 5*.:f..d.6' "# 0u.5'' q.1j 1:<-:ful ^f  jw fshposu.5 > q.1j q.5-(fshpos)-1"L^m(m.m^R BLISS Indent Relative)' q.5m(m.m& Indent)& BLISS Indent Unfin If StmtqLast BLISS Indenter[.1 :iLast BLISS Indenter.1(& BLISS Indent Unfin If Stmt) u.1 [.2 fsqpptr[.0 fsz-q.1f[vzw q.2j .,zm(m.m& BLISS Token Search)THEN"N .,1m(m.m& BLISS Token Search)IF"E q.0fsqpunwindw q.1,q.2m(m.m& BLISS Indent Unfin Stmt)' 2r' q.0fsqpunwindw fshpos[.3 q.1j q.3-(fshpos)-1"L ^m(m.m^R BLISS Indent Relative)' q.3m(m.m& Indent)& BLISS Indent Unfin CompqLast BLISS Indenter[.1 :iLast BLISS Indenter.1(& BLISS Indent Unfin Comp) u.1 [.2 [.4[.5 q.2,q.1f[hboundw bm(m.m& BLISS Last Sub-Stmt Token)u.5u.4 q.4j f]hboundw q.4,q.5f~IF"EOcfound' q.4,q.5f~INCR"EOcfound' q.4,q.5f~DECR"EOcfound' q.4,q.5f~DO"EOcfound' q.4,q.5f~UNTIL"EOcfound' q.4,q.5f~WHILE"EOcfound' q.1,q.4m(m.m& BLISS Indent Unfin Stmt) !cfound! q.4jfshpos[.3 q.1j q.3-(fshpos)-1"L^m(m.m^R BLISS Indent Relative)' q.3m(m.m& Indent)& BLISS Next Non-Begin Token|[.1[.2 m(m.m& BLISS Next Token)u.2u.1 !BEGLP! q.1,q.2F~BEGIN"Em(m.m& BLISS Next Token)u.2u.1q.2joBEGLP' q.1,q.2& BLISS Next Token.[.1 [.2[.3 qBLSIND ..D[..D ff"Gj' z-b"Eq.1jz,z' < :s%(!"E zj0a"Bq.1jz,z' .u.2 -fwl.u.31;' 0a-!"E1@l!' -1a-%"E:s)%"Ezu.3zu.21;'' "#.-1u.2 (ff&2)1a-:"N q.2j-fwl.u.31;' ' > q.1j q.3,q.2& BLISS Skip Decl0[.1.[.2j0[.3 < :s=%(;!()"E1;' 0a-;"E1;' 0a-!"E1@l' -1a-%"E:s)%"E1;'' 0a-("E%.1' 0a-)"Eq.1-1u.1' 0a-="Eq.1"E1u.31;'' > q.3"Eq.2j' q.3& BLISS Token Search:i*[.1.[.2j0[.3 qBLSIND ..D[..D f' -1a-%"E:s)%"Ef;DONE' r1u.3' >> q.3"Eq.2j' q.3& BLISS Tokens to Leftp[.1.[.2[.3[.4 q.1j0l m(m.m& BLISS Next Token)u.4u.3 q.2j q.3-q.1"L1' "#0'& BLISS Last Sub-Stmt Token[.1.[.2[.3[.4 q.1j f > q.3,q.4(q.2j)& BLISS End Prev Stmt.[.1 < < -:s;)%!"Ebj1;' "#1a-!"E!' 1a-;"E1;' -:s%(' > > .(q.1j)& Back Over BLISS Line Comment.[.1j .,(0l).:fb%(!"E' -^fq  [.2j .(q.1j)& Setup BLISS Library m.m& BLISS End Prev Stmtm.vMM & BLISS End Prev Stmtw m.m& BLISS Next Tokenm.vMM & BLISS Next Tokenw m.m& BLISS Indent After Stmtm.vMM & BLISS Indent After Stmtw m.m& BLISS Indent After New Blockm.vMM & BLISS Indent After Begin Stmtw m.m& BLISS Indent After Endm.vMM & BLISS Indent After End Stmtw m.m& BLISS Indent Unfin Stmtm.vMM & BLISS Indent Unfin Stmtw m.m& BLISS Indent Unfin If Stmtm.vMM & BLISS Indent Unfin If Stmtw m.m& BLISS Indent Unfin Compm.vMM & BLISS Indent Unfin Else Stmtw m.m& BLISS Indent Unfin Compm.vMM & BLISS Indent Unfin Do Stmtw m.m& BLISS Indent Unfin Compm.vMM & BLISS Indent Unfin Incr Stmtw m.m& BLISS Indent Unfin Compm.vMM & BLISS Indent Unfin Decr Stmtw m.m& BLISS Indent Unfin Compm.vMM & BLISS Indent Unfin While Stmtw m.m& BLISS Indent Unfin Compm.vMM & BLISS Indent Unfin Until Stmtw m.m& BLISS Last Sub-Stmt Tokenm.vMM & BLISS Last Sub-Stmt Tokenw m.m& BLISS Indent After Compoundm.vMM & BLISS Indent After If Stmtw m.m& BLISS Indent After Compoundm.vMM & BLISS Indent After Else Stmtw m.m& BLISS Indent After Compoundm.vMM & BLISS Indent After Do Stmtw m.m& BLISS Indent After Compoundm.vMM & BLISS Indent After Incr Stmtw m.m& BLISS Indent After Compoundm.vMM & BLISS Indent After Decr Stmtw m.m& BLISS Indent After Compoundm.vMM & BLISS Indent After While Stmtw m.m& BLISS Indent After Compoundm.vMM & BLISS Indent After Until Stmtw m.m& BLISS Token Searchm.vMM & BLISS Token Searchw m.m& BLISS Indent After Routine Stmtm.vMM & BLISS Indent After Routine Stmtw & Default Init BLISS Mode1,q1,q..Qw)m.Q. 1,m.m^R Indent BLISS Stmtm.QI 1,m.m^R Print Last BLISS Indenterm.Q...? 1,m.m^R Indent for Commentm.Q..; 1,m.m^R Insert BLISS Endm.Q..\ 1,m.m^R Global BLISS Commentm.Q...; 1,m.m^R End Global BLISS Commentm.Q...\ 1,m.m^R Slurp BLISS To Charm.Q..{ 0fo..qBLISS Auto Fill Default( )m(m.m Auto Fill Mode) 1,1m.LSpace Indent Flagw ~FILENAME~BLISS~DOC~ ~FILENAME~Package for editing BLISS code (BLISS Mode). ~DOC~ BLISS ModeC Set up for editing BLISS code. $BLSIND ..D$ is set up for use by BLISS indent macros. (E.g. no special Lisp characters, and "words" are $, _, and alphanumerics. Calls user-providable macro, INIT BLISS MODE, which can put BLISS macros into desired qregs. If no macro exits, calls & Default Init BLISS Mode. See the description of that subr for more details on what it does and how to construct your own. ~DOC~ ^R Indent BLISS Stmt^R Indentation via previous statement type. If there are non-label tokens to left, then just calls ^R BLISS Indent Relative. If non-null arg, calls ^R Indent Nested. Calls macros to indent statements after prev stmt's type, e.g. looks for macro named & BLISS Indent After Begin Stmt. None found, it will call & BLISS Indent After Stmt. If the previous statement was unfinished (i.e. we are not indenting a new statement really), then macros such as & BLISS Indent Unfin If Stmt are called. The default unfinished-stmt macro is & BLISS Indent Unfin Stmt. ^R Print Last BLISS Indenter will print the name of the indentation macro called. ~DOC~ ^R Insert BLISS End^R Insert end and show matching block. Indents if no whitespace to left of cursor. Displays buffer around matching block statement. ARG = number of seconds to display there. Inserts a comment after the "end;" to show what was ended, e.g. "%( begin-name )%" or "%( if-begin )%". The MARK is left before this comment, point after so you can easily delete it with ^R Kill Region. ~DOC~ & BLISS Get Statement LabelS Return label for statement at ARG. ARG: Point within statement. Returns string containing label, or Returns 0 if no label found. ~DOC~ Indent BLISS RegionC Indents each line from here to MARK. On each line it: moves past labels, comments to first token, then calls ^R Delete Horizontal Space, then calls ^R Indent BLISS Stmt. Leaves mark and point around changed region, and old text in kill stack. ~DOC~ ^R BLISS Indent Relative^R BLISS Indent Relative to last line's words. Successive calls get successive indentation points; each call aligns under ARGth next word in previous line. Words are separated by spaces, tabs, underscores, commas, periods. To facilitate moving into a line, and changing an indentation, if there is whitespace to the right and left (i.e. this is a new indent call here), then the cursor is moved one column left. ~DOC~ ^R Global BLISS Comment^R Call ^R for large comment. While in global comment ^R: Comment column is set to 10, ^R Indent for Comment is called initially, MM Auto Fill Mode$ is entered with auto-indent, $Comment Begin$ is set to "%(*" to mark global comments. "%(** )%" (comment with just a *) expand into %( * * *... )%, aligned with any surrounding global comments (for boxes), or if no surrounding comments expand into $BLISS Star Line Width$ wide (default is 51). When ^R returns, comment-ends within each global comment will be vertically aligned. ~DOC~ & Align Global BLISS Comment EndsS Ends within contiguous global comments. Contiguous global comments are comments starting with "%(*", on successive lines. Contiguous global comments have their comment-ends aligned vertically. If a global comment consists soley of "*", i.e. it is "%(** )%", then it will expand out into a "%( * * * * ...* )%" comment, aligned with its contiguous global comments. If no contiguous comments, expands out into %( * *...)%, $BLISS Star Line Width$ wide, default 51, and extending to left margin. After alignment, "%(*" is replaced by "%( ". ~DOC~ ^R End Global BLISS Comment^R Exit large comment ^R. Calls ^R End Comment, then exits ^R, so that global comment ^R is ended, and comment column will be reset to its old (one-line comment form) value. If given an ARG, will inhibit alignment of global comment-ends, by replace all global comment-starts ("%(*") by regular comment-starts ("%( "). ~DOC~ ^R Slurp BLISS to Char^R Prev line back to CHAR moved to point, indented. Non-comment text from previous line (back to CHAR typed) is moved onto the current line, after indentation, and then ^R Indent BLISS Stmt is called to re-align. Now that the prev line is changed, things might look better. Any comment on prev line is left there, and ^R Indent for Comment is called on it to align it after the text is removed from before it. ~DOC~ ^R Print Last BLISS Indenter^R Print macro name in echo area. ~DOC~ & BLISS Indent After StmtS Default after-indent, same as prev stmt. If no prev stmt (i.e. 1st stmt in buffer), then indentation is given by the variable $1st Stmt Indentation$, default = 10. ARG1 -> where to indent. ARG2 -> token for previous statement. Returns two vals surrounding insertion. Leaves pointer after indentation. ~DOC~ & BLISS Indent After CompoundS Handle indentation for stmt after IF etc. Compound stmts are IF-, ELSE-, INCR-, WHILE-, ... ARG1 -> where to indent. ARG2 -> token for previous statement. Returns two vals surrounding insertion. Leaves pointer after indentation. If (e.g.) IF ... BEGIN, then indent aligns with BEGIN, + $COMP BLOCK Indentation$, i.e. $...$ over from BLOCK. (Default $COMP BLOCK$ is 0.) If non-BLOCK, aligns with IF. ~DOC~ & BLISS Indent Unfin Begin StmtS Indent after BEGIN. ARG1: where to indent. ARG2: BEGIN token. ~DOC~ & BLISS Indent After New BlockS Next statement indented more, for BEGIN etc. ARG1 -> where to indent. ARG2 -> BEGIN token. 2 Vals returned, around indentation. Pointer left after indentation. Indentation aligns with whatever follows the BEGIN, etc. ~DOC~ & BLISS Indent After Routine StmtS Indent $1st Routine Stmt Indentation$ amount. If no $...$ then default 0. ARG1 -> where to indent. ARG2 -> ROUTINE token. Returns two vals around indentation. Leaves pointer after indentation. ~DOC~ & BLISS Indent After End StmtS Insert indentation by matching BEGIN/ROUTINE ARG1 -> where to indent. ARG2 -> END token. Returns 2 vals around indentation. Returns with pointer after indentation. ~DOC~ & BLISS Indent Unfin StmtS Indent new line of unfinished statement. Default for indenting unfinished statements. Does: Case1: If there is an open paren, aligns with next non-white. Case2: If $Unfin Stmt Indentation$ is defined it will indent $Unfin Stmt Indentation$ more than the start of the stmt. Case3: If prev line contains start of stmt, aligns with 1st word after beginning of stmt token (which may be part of token). Case4: Calls ^R BLISS Indent Relative. ARG1 -> where to indent. ARG2 -> token starting unfinished statement. Returns 2 vals around indentation. Point left after indentation. ~DOC~ & BLISS Indent Unfin If StmtS Indent new line of unfinished IF statement. Indents same amount as the IF if the THEN hasn't occured yet. If THEN has occured, just calls & BLISS Indent Unfin Stmt. ARG1 -> where to indent. ARG2 -> token starting unfinished statement. Returns 2 vals around indentation. Point left after indentation. ~DOC~ & BLISS Indent Unfin CompqS Indent new line of unfinished compound. Indents same amount as the last sub-statement so far. ARG1 -> where to indent. ARG2 -> token starting unfinished statement. Returns 2 vals around indentation. Point left after indentation. ~DOC~ & BLISS Next Non-Begin TokenC Returns next token which isn't BEGIN. ~DOC~ & BLISS Next TokenS Return ptrs around next token in buffer. ARG gives place to start from in buffer. No ARG means here. ARG,: Labels are skipped unless pre-comma argument given. Comments are skipped. ~DOC~ & BLISS Skip DeclS Searches for = , but not within parens. Comments are skiped. ARG1 is point in buffer to start from. Returns 0 if search unsuccessful: end of statement (;) or end of buffer reached first, non-0 if successful. ~DOC~ & BLISS Token SearchS Searches for a token in a statement. Comments are skipped. ARG1 is point in buffer to start from. ARG2 is iteration: i.e. search for ARG2th token. STRINGARG is token to search for. Returns 0 if search unsuccessful: end of statement (;) or end of buffer reached first, non-0 if successful. Returns with pointer after token if successful. ~DOC~ & BLISS Tokens to LeftpS Returns 0 if no tokens to left on line. ARG is pointer into line where to look left from. Labels or comments are not counted. ~DOC~ & BLISS Last Sub-Stmt TokennS Finds last stmt in compound stmt (if, on). If current statement is "IF a THEN IF b THEN c;" this subr will return ptrs surrounding c's statement token. ARG1 points to statement token from where to start, i.e. the compound statement's token (IF). If ARG1 points to a non-compound statement token, pointers around that token are returned. ~DOC~ & BLISS End Prev StmtS Return ptr to end prev ARG'th statement. Value returned points to the semicolon. ARG = 1 means find first end-; looking back from here. ~DOC~ & Back Over BLISS Line CommentS From point, move left on line past comment. ARG is ptr into some line to check left from. Returns ptr to before comment and white-space before it. If no comment on line, no movement: ARG is returned. ~DOC~ & Setup BLISS LibraryS Put macros into $MM ...$ qregs for speed. ~DOC~ & Default Init BLISS ModeS Default setup for BLISS mode. It sets up the following characters for this mode and buffer: RUBOUT Tab-hacking rubout, C-RUBOUT Normal rubout, TAB ^R Indent BLISS Stmt, C-M-? ^R Print Last BLISS Indenter, M-; ^R Indent for Comment, M-\ ^R Insert BLISS End, C-M-; ^R Global BLISS Comment, C-M-\ ^R End Global BLISS Comment, M-{ ^R Slurp BLISS To Char. Turns on Auto Fill if $BLISS Auto Fill Default$ is non-0. Users who want to provide their own MM Init BLISS Mode$ can make ^R keys (q-registers) and variables local to this mode and buffer by using the following subroutine which is global to Init BLISS Mode: .Q: Make Local Q-register ~DIRECTORY~BLISS Mode ^R Indent BLISS Stmt ^R Insert BLISS End & BLISS Get Statement Label Indent BLISS Region ^R BLISS Indent Relative ^R Global BLISS Comment & Align Global BLISS Comment Ends ^R End Global BLISS Comment ^R Slurp BLISS to Char ^R Print Last BLISS Indenter & BLISS Indent After Stmt & BLISS Indent After Compound & BLISS Indent Unfin Begin Stmt & BLISS Indent After New Block & BLISS Indent After Routine Stmt & BLISS Indent After End Stmt & BLISS Indent Unfin Stmt & BLISS Indent Unfin If Stmt & BLISS Indent Unfin Comp & BLISS Next Non-Begin Token & BLISS Next Token & BLISS Skip Decl & BLISS Token Search & BLISS Tokens to Leftp & BLISS Last Sub-Stmt Token & BLISS End Prev Stmt & Back Over BLISS Line Comment & Setup BLISS Library & Default Init BLISS Mode ~INVERT~[1Q1