(DEFINE-FILE-INFO READTABLE "INTERLISP" PACKAGE "INTERLISP")(FILECREATED "10-Nov-87 08:49:22" {DSK}<LISPFILES>ADD-SEDIT-COMMANDS.;2 12581        changes to%:  (FUNCTIONS ADD-COMMAND)      previous date%: "14-Oct-87 15:30:42" {DSK}<LISPFILES>ADD-SEDIT-COMMANDS.;1)(* "Copyright (c) 1987 by Beckman Instruments, Inc.  All rights reserved.")(PRETTYCOMPRINT ADD-SEDIT-COMMANDSCOMS)(RPAQQ ADD-SEDIT-COMMANDSCOMS ((FUNCTIONS ADD-COMMAND COPY-EditENV EXAMPLE-NEW-SEDIT-COMMANDFN                                       EXAMPLE2-NEW-SEDIT-COMMANDFN GET-SEDIT-ROOT-STRUCTURE                                       GET-SEDIT-SELECTION-STRUCTURE)                               [DECLARE%: EVAL@COMPILE                     (* ;; "This hackery is necessary since these DATATYPE definitions are not in EXPORTS.ALL")                                      (P (for DT in '(EditContext EditENV EditNode EditSelection) do                                              (EVAL (SYSRECLOOK1 DT]                               (PROP MAKEFILE-ENVIRONMENT ADD-SEDIT-COMMANDS)))(CL:DEFUN ADD-COMMAND (TheENV CHARCODE COMMANDFN &REST EXTRA-COMMANDFN-ARGS)                                                       (* ; "Edited 14-Oct-87 10:52 by Matt Heffron")                    (* ;; "The EXTRA-COMMANDFN-ARGS will be passed to the COMMANDFN (after the |context| and |charcode| arguments) unEVALuated.") (LET ((CommandTable (fetch (EditENV CommandTable) of TheENV)))      (PUTHASH (\\charcode CHARCODE)             (CONS COMMANDFN EXTRA-COMMANDFN-ARGS)             CommandTable)))(CL:DEFUN COPY-EditENV (SOURCE-ENV)                   (* ; "Edited 13-Oct-87 17:28 by Matt Heffron") (LET ((ENV (NCREATE 'EditENV))       OrigHashTable HashTable)      (replace (EditENV ParseInfo) of ENV with (fetch (EditENV ParseInfo) of SOURCE-ENV))      (replace (EditENV ParseInfoUnknown) of ENV with (fetch (EditENV ParseInfoUnknown) of SOURCE-ENV                                                             ))      (replace (EditENV UserData) of ENV with (fetch (EditENV UserData) of SOURCE-ENV))      (replace (EditENV DefaultFont) of ENV with (fetch (EditENV DefaultFont) of SOURCE-ENV))      (replace (EditENV ItalicFont) of ENV with (fetch (EditENV ItalicFont) of SOURCE-ENV))      (replace (EditENV KeywordFont) of ENV with (fetch (EditENV KeywordFont) of SOURCE-ENV))      (replace (EditENV CommentFont) of ENV with (fetch (EditENV CommentFont) of SOURCE-ENV))      (replace (EditENV BrokenAtomFont) of ENV with (fetch (EditENV BrokenAtomFont) of SOURCE-ENV))      (replace (EditENV SpaceWidth) of ENV with (fetch (EditENV SpaceWidth) of SOURCE-ENV))      (replace (EditENV DefaultLineSkip) of ENV with (fetch (EditENV DefaultLineSkip) of SOURCE-ENV))      (replace (EditENV DefaultIndent) of ENV with (fetch (EditENV DefaultIndent) of SOURCE-ENV))      (replace (EditENV MinIndent) of ENV with (fetch (EditENV MinIndent) of SOURCE-ENV))      (replace (EditENV MaxIndent) of ENV with (fetch (EditENV MaxIndent) of SOURCE-ENV))      (replace (EditENV MaxWidth) of ENV with (fetch (EditENV MaxWidth) of SOURCE-ENV))      (replace (EditENV CommentWidthPercent) of ENV with (fetch (EditENV CommentWidthPercent)                                                            of SOURCE-ENV))      (replace (EditENV InitCommentSeparation) of ENV with (fetch (EditENV InitCommentSeparation)                                                              of SOURCE-ENV))      (replace (EditENV LParenString) of ENV with (fetch (EditENV LParenString) of SOURCE-ENV))      (replace (EditENV RParenString) of ENV with (fetch (EditENV RParenString) of SOURCE-ENV))      (replace (EditENV DotString) of ENV with (fetch (EditENV DotString) of SOURCE-ENV))      (replace (EditENV QuoteString) of ENV with (fetch (EditENV QuoteString) of SOURCE-ENV))      (replace (EditENV CommentString) of ENV with (fetch (EditENV CommentString) of SOURCE-ENV))      (replace (EditENV DefaultCharHandler) of ENV with (fetch (EditENV DefaultCharHandler)                                                           of SOURCE-ENV))      (replace (EditENV HelpMenu) of ENV with (fetch (EditENV HelpMenu) of SOURCE-ENV))                    (* ;; "The CommandTable field must have a new HashTable created for it")      (SETQ OrigHashTable (fetch (EditENV CommandTable) of SOURCE-ENV))      [SETQ HashTable (HASHARRAY (HARRAYPROP OrigHashTable 'SIZE)                             (HARRAYPROP OrigHashTable 'OVERFLOW)                             (HARRAYPROP OrigHashTable 'HASHBITSFN)                             (HARRAYPROP OrigHashTable 'EQUIVFN]      [MAPHASH OrigHashTable #'(CL:LAMBDA (VAL KEY)                                      (PUTHASH KEY VAL HashTable]      (replace (EditENV CommandTable) of ENV with HashTable)      ENV))(CL:DEFUN EXAMPLE-NEW-SEDIT-COMMANDFN (context charcode &REST EXTRA-COMMANDFN-ARGS)                                                       (* ; "Edited 13-Oct-87 17:30 by Matt Heffron")                    (* ;; "The EXTRA-COMMANDFN-ARGS are ignored in this example, but can be anything you want to have passed to this function.") (LET ((PromptWindow (GETPROMPTWINDOW (fetch (EditContext DisplayWindow) of context)))       RootStructure RootNode NewStructure NewStructureSymbol)                    (* ;; "Get the Root Structure of this edit. (i.e. the WHOLE structure being edited).")      (CL:MULTIPLE-VALUE-SETQ (RootStructure RootNode)             (GET-SEDIT-ROOT-STRUCTURE context))                    (* ;; "Clear the PromptWindow & go to the beginning of the line.")      (TERPRI PromptWindow)                    (* ;; "Read the STRINGP name of a symbol from the user")      [SETQ NewStructureSymbol (PROMPTFORWORD "RPLACD of entire structure with value of: " NIL NIL                                       PromptWindow NIL NIL '(13 24]      [CL:WHEN                     (* ;; "This reads the symbol from the string read in above.  Of course, if you want the string (as a string), then you don't need to do this(but don't do the CL:SYMBOL-VALUE below either!)")             (SETQ NewStructureSymbol (IGNORE-ERRORS (READ (OPENSTRINGSTREAM NewStructureSymbol                                                                  'INPUT]      (CL:IF NewStructureSymbol (CL:IF (BOUNDP NewStructureSymbol)                                       (PROGN                     (* ;; "Making a copy of the RootStructure make this safe, in that it's effects are confined to the edit, and don't affect the outside world.")                                              (SETQ NewStructure (CL:COPY-TREE RootStructure))                    (* ;; "Do the structure modification.")                                              (CL:SETF (CDR NewStructure)                                                     (CL:COPY-TREE (CL:SYMBOL-VALUE                                                                           NewStructureSymbol)))                    (* ;; "Replace the RootNode with the newly parsed NewStructure")                                              (\\replace.node context RootNode (\\parse.new                                                                                       NewStructure                                                                                       context)))                                       (CL:FORMAT PromptWindow "~&Error: Unbound SYMBOL: ~S"                                               NewStructureSymbol))             (CL:PRINC "...aborted" PromptWindow))      T))(CL:DEFUN EXAMPLE2-NEW-SEDIT-COMMANDFN (context charcode &REST EXTRA-COMMANDFN-ARGS)                                                       (* ; "Edited 14-Oct-87 10:52 by Matt Heffron") (* ;;; "This is almost the same as the EXAMPLE-NEW-SEDIT-COMMANDFN, but it RPLACD's the current selection using the sub-function of the Mutate command that does all the work..") (LET ((PromptWindow (GETPROMPTWINDOW (fetch (EditContext DisplayWindow) of context)))       CurrentSelection NewStructure NewStructureSymbol)                    (* ;;       "Get the CurrentSelection of this edit.  It is an EditNode datatype, NOT the actual structure.")      (SETQ CurrentSelection (fetch (EditSelection SelectNode) of (fetch (EditContext Selection)                                                                     of context)))      (CL:IF CurrentSelection             (PROGN                     (* ;; "Clear the PromptWindow & go to the beginning of the line.")                    (TERPRI PromptWindow)                    (* ;; "Read the STRINGP name of a symbol from the user")                    [SETQ NewStructureSymbol (PROMPTFORWORD                                                     "RPLACD of current selection with value of: " NIL                                                     NIL PromptWindow NIL NIL '(13 24]                    [CL:WHEN                     (* ;; "This reads the symbol from the string read in above.  Of course, if you want the string (as a string), then you don't need to do this(but don't do the CL:SYMBOL-VALUE below either!)")                           (SETQ NewStructureSymbol (IGNORE-ERRORS (READ (OPENSTRINGSTREAM                                                                          NewStructureSymbol                                                                          'INPUT]                    (CL:IF NewStructureSymbol                           (CL:IF (BOUNDP NewStructureSymbol)                                  (PROGN                     (* ;; "Use \\do.mutation to do the structure modification.")                                         (CL:UNLESS [\\do.mutation context CurrentSelection                                                           #'(CL:LAMBDA (X)                                                                    (CL:SETF (CDR X)                                                                           (CL:SYMBOL-VALUE                                                                                   NewStructureSymbol]                    (* ;; "\\do.mutation returns NIL if it failed (e.g. an error occurred)")                                                (CL:FORMAT PromptWindow                                       "~&Error during RPLACD of current selection.  No changes made."                                                       ))                    (* ;; "If the \\do.mutation succeeded, the it will have updated the internal structure and displayed the new structure in the edit window.")                                         )                                  (CL:FORMAT PromptWindow "~&Error: Unbound SYMBOL: ~S"                                          NewStructureSymbol))                           (CL:PRINC "...aborted" PromptWindow)))             (CL:FORMAT PromptWindow "~&Select whole structure to RPLACD."))      T))(CL:DEFUN GET-SEDIT-ROOT-STRUCTURE (context)          (* ; "Edited 13-Oct-87 14:32 by Matt Heffron") (LET (Node)      [SETQ Node (CADR (fetch (EditNode SubNodes) of (fetch (EditContext Root) of context]      (CL:VALUES (fetch (EditNode Structure) of Node)             Node)))(CL:DEFUN GET-SEDIT-SELECTION-STRUCTURE (context)     (* ; "Edited 14-Oct-87 14:30 by Matt Heffron") (LET (Node)      (SETQ Node (fetch (EditSelection SelectNode) of (fetch (EditContext Selection) of context)))      (CL:WHEN Node (CL:VALUES (fetch (EditNode Structure) of Node)                           Node))))(DECLARE%: EVAL@COMPILE (for DT in '(EditContext EditENV EditNode EditSelection) do (EVAL (SYSRECLOOK1 DT))))(PUTPROPS ADD-SEDIT-COMMANDS MAKEFILE-ENVIRONMENT (:READTABLE "INTERLISP" :PACKAGE "INTERLISP"))(PUTPROPS ADD-SEDIT-COMMANDS COPYRIGHT ("Beckman Instruments, Inc" 1987))(DECLARE%: DONTCOPY  (FILEMAP (NIL)))STOP