; LPAGE.CMD: LISP language MENU Page ; for MicroEMACS 3.11 and above ; (C)opyright 1989 by Gregory Wilcox ; modified by Daniel Lawrence ; set the clean procedure up store-procedure clean delete-buffer "[Macro 10]" delete-buffer "[Macro 11]" delete-buffer "[Macro 12]" delete-buffer "[Macro 13]" delete-buffer "[Macro 14]" delete-buffer "[Macro 15]" delete-buffer "[Macro 16]" !endm ; make sure the function key window is up set %rcfkeys FALSE toggle-fkeys write-message "Loading..." ; Write out the page instructions save-window 1 next-window beginning-of-file set $curcol 25 overwrite-string " F1 forward sexpr F2 previous sexpr " next-line set $curcol 25 overwrite-string " F3 forward function F4 previous function " next-line set $curcol 25 overwrite-string " F5 mark sexpr F6 indent sexpr " next-line set $curcol 18 overwrite-string "LISP" set $curcol 25 overwrite-string " F7 find unmatched parens F8 " next-line set $curcol 25 overwrite-string " F9 F10 " unmark-buffer beginning-of-file !force restore-window update-screen set %tab 9 set %newline 13 set %space 32 set %lparen 40 set %rparen 41 set %indent " " ; forward-sexpr ; this function (and its twin, backward-sexpr) only work on lists - ; it would be difficult to make them work on atoms, ; since forward-word and backward-word skip over parentheses 10 store-macro !if ¬ &equal $curchar %lparen search-forward "(" backward-character !endif goto-matching-fence !endm ; backward-sexpr ; unfortunately, this won't work on a top-level sexpr ; there must be some stupid C rule about braces not allowed in column 1 ; thus, when you goto-matching-fence, it can't be found ; hence the !force and following !if clause 11 store-macro !if ¬ &equal $curchar %rparen search-reverse ")" !endif !force goto-matching-fence !if &seq $status FALSE search-reverse "~n(" !endif !endm ; forward-function 12 store-macro !force search-forward "~n(" !if &seq $status FALSE end-of-file write-message "Last function" !else backward-character !endif !endm ; backward-function 13 store-macro !force search-reverse "~n(" !if &seq $status FALSE beginning-of-file write-message "First function" !else forward-character !endif !endm ; mark-sexpr 14 store-macro !if ¬ &equal $curchar %lparen search-reverse "(" !endif set-mark goto-matching-fence forward-character exchange-point-and-mark !endm ; indent-sexpr 15 store-macro write-message "Indenting S-expression. . ." forward-character execute-macro-26 ; backward-function ; are we really here? !if ¬ &equal $curchar %lparen write-message "Can't find S-expression." !return !endif set %parens 0 *nest !if &equal $curchar %lparen ; if sexpr is on one line, swallow it set %cline $curline set %ccol $curcol goto-matching-fence !if ¬ &equal %cline $curline set $curline %cline set $curcol %ccol set %parens &add %parens 1 !endif !else !if &equal $curchar %rparen set %parens &sub %parens 1 !endif !endif !if &equal $curchar %newline forward-character ; trim leading whitespace !while &or &equ $curchar %space &equ $curchar %tab delete-next-character !endwhile ; now do the indenting set %count %parens !while ¬ &equ %count 0 insert-string %indent set %count &sub %count 1 !endwhile backward-character !endif forward-character !if ¬ &equ %parens 0 !goto nest !endif write-message "Finished." !endm ; find-unbalanced-parentheses 16 store-macro ; save cursor position set %cline $curline set %ccol $curcol write-message "Searching forward for mismatched parentheses. . ." beginning-of-file *loop !force search-forward "(" !if &seq $status FALSE !goto misup !endif backward-character !force goto-matching-fence !if &seq $status FALSE write-message "Too few close parentheses in this function." !return !endif !goto loop *misup write-message "Searching backward for mismatched parentheses. . ." end-of-file *loopr !force search-reverse ")" !if &seq $status FALSE !goto ok !endif ; forward-character not needed - asymmetry here !force goto-matching-fence !if &seq $status FALSE write-message "Too many close parentheses in this function." !return !endif !goto loopr *ok write-message "All parentheses appear balanced." ; restore cursor position set $curline %cline set $curcol %ccol !endm bind-to-key execute-macro-22 A-F ; forward-sexpr bind-to-key execute-macro-23 A-B ; backward-sexpr bind-to-key execute-macro-24 ^@ ; mark-sexpr bind-to-key execute-macro-25 A-E ; forward-function bind-to-key execute-macro-26 A-A ; backward-function bind-to-key execute-macro-27 A-I ; indent-sexpr bind-to-key execute-macro-28 A-U ; find-unmatched-parentheses write-message "[LISP page loaded]"