]> code.delx.au - gnu-emacs/blobdiff - lisp/macros.el
(xscheme-control-g-synchronization-p): Doc fix.
[gnu-emacs] / lisp / macros.el
index 8a921ac8d0757e264582ff30035e40a51f740a7d..d834dca8806f5fad135fb4f697d7cf201f7f6851 100644 (file)
@@ -1,6 +1,6 @@
 ;;; macros.el --- non-primitive commands for keyboard macros.
 
-;; Copyright (C) 1985, 1986, 1987, 1992, 1994 Free Software Foundation, Inc.
+;; Copyright (C) 1985, 86, 87, 92, 94, 95 Free Software Foundation, Inc.
 
 ;; Maintainer: FSF
 ;; Keywords: abbrev
@@ -70,41 +70,90 @@ use this command, and then save the file."
       (insert "(fset '"))
     (prin1 macroname (current-buffer))
     (insert "\n   ")
-    (let ((beg (point)) end)
-      (prin1 definition (current-buffer))
-      (setq end (point-marker))
-      (goto-char beg)
-      (while (< (point) end)
-       (let ((char (following-char)))
-         (cond ((= char 0)
-                (delete-region (point) (1+ (point)))
-                (insert "\\C-@"))
-               ((< char 27)
-                (delete-region (point) (1+ (point)))
-                (insert "\\C-" (+ 96 char)))
-               ((< char 32)
-                (delete-region (point) (1+ (point)))
-                (insert "\\C-" (+ 64 char)))
-               ((< char 127)
-                (forward-char 1))
-               ((= char 127)
-                (delete-region (point) (1+ (point)))
-                (insert "\\C-?"))
-               ((= char 128)
-                (delete-region (point) (1+ (point)))
-                (insert "\\M-\\C-@"))
-               ((< char 155)
-                (delete-region (point) (1+ (point)))
-                (insert "\\M-\\C-" (- char 32)))
-               ((< char 160)
-                (delete-region (point) (1+ (point)))
-                (insert "\\M-\\C-" (- char 64)))
-               ((< char 255)
-                (delete-region (point) (1+ (point)))
-                (insert "\\M-" (- char 128)))
-               ((= char 255)
-                (delete-region (point) (1+ (point)))
-                (insert "\\M-\\C-?"))))))
+    (if (stringp definition)
+       (let ((beg (point)) end)
+         (prin1 definition (current-buffer))
+         (setq end (point-marker))
+         (goto-char beg)
+         (while (< (point) end)
+           (let ((char (following-char)))
+             (cond ((= char 0)
+                    (delete-region (point) (1+ (point)))
+                    (insert "\\C-@"))
+                   ((< char 27)
+                    (delete-region (point) (1+ (point)))
+                    (insert "\\C-" (+ 96 char)))
+                   ((= char ?\C-\\)
+                    (delete-region (point) (1+ (point)))
+                    (insert "\\C-\\\\"))
+                   ((< char 32)
+                    (delete-region (point) (1+ (point)))
+                    (insert "\\C-" (+ 64 char)))
+                   ((< char 127)
+                    (forward-char 1))
+                   ((= char 127)
+                    (delete-region (point) (1+ (point)))
+                    (insert "\\C-?"))
+                   ((= char 128)
+                    (delete-region (point) (1+ (point)))
+                    (insert "\\M-\\C-@"))
+                   ((= char (aref "\M-\C-\\" 0))
+                    (delete-region (point) (1+ (point)))
+                    (insert "\\M-\\C-\\\\"))
+                   ((< char 155)
+                    (delete-region (point) (1+ (point)))
+                    (insert "\\M-\\C-" (- char 32)))
+                   ((< char 160)
+                    (delete-region (point) (1+ (point)))
+                    (insert "\\M-\\C-" (- char 64)))
+                   ((= char (aref "\M-\\" 0))
+                    (delete-region (point) (1+ (point)))
+                    (insert "\\M-\\\\"))
+                   ((< char 255)
+                    (delete-region (point) (1+ (point)))
+                    (insert "\\M-" (- char 128)))
+                   ((= char 255)
+                    (delete-region (point) (1+ (point)))
+                    (insert "\\M-\\C-?"))))))
+      (if (vectorp definition)
+         (let ((len (length definition)) (i 0) char mods)
+           (while (< i len)
+             (insert (if (zerop i) ?\[ ?\ ))
+             (setq char (aref definition i)
+                   i (1+ i))
+             (cond ((not (numberp char))
+                    (prin1 char (current-buffer)))
+                   (t
+                    (insert "?")
+                    (setq mods (event-modifiers char)
+                          char (event-basic-type char))
+                    (while mods
+                      (cond ((eq (car mods) 'control)
+                             (insert "\\C-"))
+                            ((eq (car mods) 'meta)
+                             (insert "\\M-"))
+                            ((eq (car mods) 'hyper)
+                             (insert "\\H-"))
+                            ((eq (car mods) 'super)
+                             (insert "\\s-"))
+                            ((eq (car mods) 'alt)
+                             (insert "\\A-"))
+                            ((and (eq (car mods) 'shift)
+                                  (>= char ?a)
+                                  (<= char ?z))
+                             (setq char (upcase char)))
+                            ((eq (car mods) 'shift)
+                             (insert "\\S-")))
+                      (setq mods (cdr mods)))
+                    (cond ((= char ?\\)
+                           (insert "\\\\"))
+                          ((= char 127)
+                           (insert "\\C-?"))
+                          ((< char 127)
+                           (insert char))
+                          (t (insert "\\" (format "%o" char)))))))
+           (insert ?\]))
+       (prin1 definition (current-buffer))))
     (insert ")\n")
     (if keys
        (let ((keys (where-is-internal macroname '(keymap))))
@@ -177,8 +226,10 @@ Possibilities: \\<query-replace-map>
 \\[skip]       Skip the rest of this iteration, and start the next.
 \\[exit]       Stop the macro entirely right now.
 \\[recenter]   Redisplay the screen, then ask again.
-\\[edit]       Enter recursive edit; ask again when you exit from that."))))
-                 )))))))
+\\[edit]       Enter recursive edit; ask again when you exit from that."))
+                    (save-excursion
+                      (set-buffer standard-output)
+                      (help-mode)))))))))))
 
 ;;;###autoload
 (defun apply-macro-to-region-lines (top bottom &optional macro)