]> code.delx.au - gnu-emacs/blobdiff - lisp/calc/calc-prog.el
(ido-enable-prefix): Improve previous doc fix.
[gnu-emacs] / lisp / calc / calc-prog.el
index a4a7b7455cc669af928e3dead3202edf82123075..ea625c7a77ce0afa63508b225a446dae3cb72726 100644 (file)
@@ -1,6 +1,7 @@
 ;;; calc-prog.el --- user programmability functions for Calc
 
-;; Copyright (C) 1990, 1991, 1992, 1993, 2001 Free Software Foundation, Inc.
+;; Copyright (C) 1990, 1991, 1992, 1993, 2001, 2002, 2003, 2004,
+;;   2005, 2006 Free Software Foundation, Inc.
 
 ;; Author: David Gillespie <daveg@synaptics.com>
 ;; Maintainer: Jay Belanger <belanger@truman.edu>
         (progn
           (setq cmd-base-default (concat "User-" keyname))
            (setq cmd (completing-read 
-                      (concat "Define M-x command name (default: calc-"
+                      (concat "Define M-x command name (default calc-"
                               cmd-base-default
                               "): ")
                       obarray 'commandp nil
           (setq func 
                  (concat "calcFunc-"
                          (completing-read 
-                          (concat "Define algebraic function name (default: "
+                          (concat "Define algebraic function name (default "
                                   cmd-base-default "): ")
                           (mapcar (lambda (x) (substring x 9))
                                   (all-completions "calcFunc-"
    (let ((lang calc-language))
      (calc-edit-mode (list 'calc-finish-user-syntax-edit (list 'quote lang))
                     t
-                    (format "Editing %s-Mode Syntax Table"
+                    (format "Editing %s-Mode Syntax Table"
                             (cond ((null lang) "Normal")
                                   ((eq lang 'tex) "TeX")
+                                   ((eq lang 'latex) "LaTeX")
                                   (t (capitalize (symbol-name lang))))))
      (calc-write-parse-table (cdr (assq lang calc-user-parse-tables))
                             lang)))
     (cond ((stringp (car p))
           (let ((s (car p)))
             (if (and (string-match "\\`\\\\dots\\>" s)
-                     (not (eq calc-lang 'tex)))
+                     (not (memq calc-lang '(tex latex))))
                 (setq s (concat ".." (substring s 5))))
             (if (or (and (string-match
                           "[a-zA-Z0-9\"{}]\\|\\`:=\\'\\|\\`#\\|\\`%%" s)
 (defun calc-fix-token-name (name &optional unquoted)
   (cond ((string-match "\\`\\.\\." name)
         (concat "\\dots" (substring name 2)))
-       ((and (equal name "{") (memq calc-lang '(tex eqn)))
+       ((and (equal name "{") (memq calc-lang '(tex latex eqn)))
         "(")
-       ((and (equal name "}") (memq calc-lang '(tex eqn)))
+       ((and (equal name "}") (memq calc-lang '(tex latex eqn)))
         ")")
-       ((and (equal name "&") (eq calc-lang 'tex))
+       ((and (equal name "&") (memq calc-lang '(tex latex)))
         ",")
        ((equal name "#")
         (search-backward "#")
             (setq part (nconc part (list (if (= (match-beginning 1)
                                                 (match-end 1))
                                              0
-                                           (string-to-int
+                                           (string-to-number
                                             (buffer-substring
                                              (1+ (match-beginning 1))
                                              (match-end 1)))))))
   (or last-kbd-macro
       (error "No keyboard macro defined"))
   (setq calc-invocation-macro last-kbd-macro)
-  (message "Use `M-# Z' to invoke this macro"))
+  (message "Use `C-x * Z' to invoke this macro"))
 
 (defun calc-user-define-edit ()
   (interactive)  ; but no calc-wrapper!
   (message "Edit definition of command: z-")
-  (let* ((key (read-char))
+  (let* (cmdname
+         (key (read-char))
         (def (or (assq key (calc-user-key-map))
                  (assq (upcase key) (calc-user-key-map))
                  (assq (downcase key) (calc-user-key-map))
                    (eq (car-safe (nth 3 cmd)) 'calc-execute-kbd-macro)))
            (let* ((mac (elt (nth 1 (nth 3 cmd)) 1))
                   (str (edmacro-format-keys mac t))
-                  (macbeg))
+                  (kys (nth 3 (nth 3 cmd))))
              (calc-edit-mode 
-              (list 'calc-edit-macro-finish-edit cmdname (nth 3 (nth 3 cmd)))
-              t "Calc Macro Edit Mode")
-             (goto-char (point-max))
-             (insert "Original keys: " (elt (nth 1 (nth 3 cmd)) 0)  "\n" )
-             (setq macbeg (point))
+              (list 'calc-edit-macro-finish-edit cmdname kys)
+              t (format (concat 
+                         "Editing keyboard macro (%s, bound to %s).\n" 
+                         "Original keys: %s \n")
+                        cmdname kys (elt (nth 1 (nth 3 cmd)) 0)))
              (insert str "\n")
              (calc-edit-format-macro-buffer)
-             (calc-show-edit-buffer)
-             (goto-char (point-min))
-             (search-forward "Original")
-             (forward-line 2)))
+             (calc-show-edit-buffer)))
          (t (let* ((func (calc-stack-command-p cmd))
                    (defn (and func
                               (symbolp func)
-                              (get func 'calc-user-defn))))
+                              (get func 'calc-user-defn)))
+                    (kys (concat "z" (char-to-string (car def))))
+                    (intcmd (symbol-name (cdr def)))
+                    (algcmd (if func (substring (symbol-name func) 9) "")))
               (if (and defn (calc-valid-formula-func func))
-                  (progn
+                  (let ((niceexpr (math-format-nice-expr defn (frame-width))))
                     (calc-wrapper
-                     (calc-edit-mode (list 'calc-finish-formula-edit
-                                           (list 'quote func)))
-                     (insert (math-showing-full-precision
-                              (math-format-nice-expr defn (frame-width)))
-                             "\n"))
+                     (calc-edit-mode 
+                       (list 'calc-finish-formula-edit (list 'quote func))
+                       nil
+                       (format (concat
+                                "Editing formula (%s, %s, bound to %s).\n"
+                                "Original formula: %s\n")
+                               intcmd algcmd kys niceexpr))
+                     (insert  (math-showing-full-precision
+                                niceexpr)
+                               "\n"))
                     (calc-show-edit-buffer))
                 (error "That command's definition cannot be edited")))))))
 
 ;; Formatting the macro buffer
 
+(defvar calc-edit-top)
+
 (defun calc-edit-macro-repeats ()
-  (goto-char (point-min))
+  (goto-char calc-edit-top)
   (while
       (re-search-forward "^\\([0-9]+\\)\\*" nil t)
-    (setq num (string-to-int (match-string 1)))
-    (setq line (buffer-substring (point) (line-end-position)))
-    (goto-char (line-beginning-position))
-    (kill-line 1)
-    (while (> num 0)
-      (insert line "\n")
-      (setq num (1- num)))))
+    (let ((num (string-to-number (match-string 1)))
+          (line (buffer-substring (point) (line-end-position))))
+      (goto-char (line-beginning-position))
+      (kill-line 1)
+      (while (> num 0)
+        (insert line "\n")
+        (setq num (1- num))))))
 
 (defun calc-edit-macro-adjust-buffer ()
   (calc-edit-macro-repeats)
-  (goto-char (point-min))
+  (goto-char calc-edit-top)
   (while (re-search-forward "^RET$" nil t)
     (delete-char 1))
-  (goto-char (point-min))
+  (goto-char calc-edit-top)
   (while (and (re-search-forward "^$" nil t)
               (not (= (point) (point-max))))
     (delete-char 1)))
         match)
     (goto-char (line-beginning-position))
     (kill-line 1)
-    (if (string-equal line "1")
+    (if (member line '("0" "1" "2" "3" "4" "5" "6" "7" "8" "9"))
           (insert line "\t\t\t;; calc quick variable\n")
       (setq curline (calc-edit-macro-command))
       (while (and curline
 (defun calc-edit-format-macro-buffer ()
   "Rewrite the Calc macro editing buffer."
   (calc-edit-macro-adjust-buffer)
-  (goto-char (point-min))
-  (search-forward "Original keys:")
-  (forward-line 1)
-  (insert "\n")
-  (skip-chars-forward " \t\n")
+  (goto-char calc-edit-top)
   (let ((type (calc-edit-macro-command-type)))
     (while (not (string-equal type ""))
       (cond
         (calc-edit-macro-combine-var-name))
        ((or
          (string-equal type "calc-copy-variable")
+         (string-equal type "calc-copy-special-constant")
          (string-equal type "calc-declare-variable"))
         (forward-line 1)
         (calc-edit-macro-combine-var-name)
         (calc-edit-macro-combine-var-name))
        (t (forward-line 1)))
       (setq type (calc-edit-macro-command-type))))
-  (goto-char (point-min)))
+  (goto-char calc-edit-top))
 
 ;; Finish editing the macro
 
 (defun calc-edit-macro-pre-finish-edit ()
-  (goto-char (point-min))
+  (goto-char calc-edit-top)
   (while (re-search-forward "\\(^\\| \\)RET\\($\\|\t\\| \\)" nil t)
     (search-backward "RET")
     (delete-char 3)
@@ -920,10 +927,7 @@ Redefine the corresponding command."
   (interactive)
   (let ((cmd (intern cmdname)))
     (calc-edit-macro-pre-finish-edit)
-    (goto-char (point-max))
-    (re-search-backward "^Original keys:")
-    (forward-line 1)
-    (let* ((str (buffer-substring (point) (point-max)))
+    (let* ((str (buffer-substring calc-edit-top (point-max)))
            (mac (edmacro-parse-keys str t)))
       (if (= (length mac) 0)
           (fmakunbound cmd)
@@ -937,7 +941,7 @@ Redefine the corresponding command."
 
 (defun calc-finish-formula-edit (func)
   (let ((buf (current-buffer))
-       (str (buffer-substring (point) (point-max)))
+       (str (buffer-substring calc-edit-top (point-max)))
        (start (point))
        (body (calc-valid-formula-func func)))
     (set-buffer calc-original-buffer)
@@ -1127,6 +1131,8 @@ Redefine the corresponding command."
   (calc-execute-kbd-macro last-kbd-macro arg))
 
 (defun calc-execute-kbd-macro (mac arg &rest prefix)
+  (if calc-keep-args-flag
+      (calc-keep-args))
   (if (and (vectorp mac) (> (length mac) 0) (stringp (aref mac 0)))
       (setq mac (or (aref mac 1)
                    (aset mac 1 (progn (and (fboundp 'edit-kbd-macro)
@@ -1441,15 +1447,22 @@ Redefine the corresponding command."
     (error "Unbalanced Z' in keyboard macro")))
 
 
-(defun calc-kbd-report (msg)
-  (interactive "sMessage: ")
-  (calc-wrapper
-   (math-working msg (calc-top-n 1))))
+;; (defun calc-kbd-report (msg)
+;;   (interactive "sMessage: ")
+;;   (calc-wrapper
+;;    (math-working msg (calc-top-n 1))))
 
-(defun calc-kbd-query (msg)
-  (interactive "sPrompt: ")
-  (calc-wrapper
-   (calc-alg-entry nil (and (not (equal msg "")) msg))))
+(defun calc-kbd-query ()
+  (interactive)
+  (let ((defining-kbd-macro nil)
+        (executing-kbd-macro nil)
+        (msg (calc-top 1)))
+    (if (not (eq (car-safe msg) 'vec))
+        (error "No prompt string provided")
+      (setq msg (math-vector-to-string msg))
+      (calc-wrapper
+       (calc-pop-stack 1)
+       (calc-alg-entry nil (and (not (equal msg "")) msg))))))
 
 ;;;; Logical operations.