]> code.delx.au - gnu-emacs/blobdiff - lisp/calc/calc-embed.el
Add 2010 to copyright years.
[gnu-emacs] / lisp / calc / calc-embed.el
index c84559dd52a11e712502020837f7f52971cf6c71..f14895eb4265768908a6ad7606cd45627e137fcd 100644 (file)
@@ -1,7 +1,7 @@
 ;;; calc-embed.el --- embed Calc in a buffer
 
 ;; Copyright (C) 1990, 1991, 1992, 1993, 2001, 2002, 2003, 2004,
-;;   2005, 2006, 2007, 2008 Free Software Foundation, Inc.
+;;   2005, 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc.
 
 ;; Author: David Gillespie <daveg@synaptics.com>
 ;; Maintainer: Jay Belanger <jay.p.belanger@gmail.com>
 (require 'calc-ext)
 (require 'calc-macs)
 
+;; Declare functions which are defined elsewhere.
+(declare-function thing-at-point-looking-at "thingatpt" (regexp))
+
+
 (defun calc-show-plain (n)
   (interactive "P")
   (calc-wrapper
 (defvar calc-embedded-announce-formula)
 (defvar calc-embedded-open-formula)
 (defvar calc-embedded-close-formula)
-(defvar calc-embedded-open-word)
-(defvar calc-embedded-close-word)
 (defvar calc-embedded-open-plain)
 (defvar calc-embedded-close-plain)
 (defvar calc-embedded-open-new-formula)
 (defvar calc-embedded-close-new-formula)
 (defvar calc-embedded-open-mode)
 (defvar calc-embedded-close-mode)
+(defvar calc-embedded-word-regexp)
 
-(defconst calc-embedded-mode-vars '(("precision" . calc-internal-prec)
+(defconst calc-embedded-mode-vars '(("twos-complement" . calc-twos-complement-mode)
+                                    ("precision" . calc-internal-prec)
                                    ("word-size" . calc-word-size)
                                    ("angles" . calc-angle-mode)
                                    ("symbolic" . calc-symbolic-mode)
         (message "Current modes will be preserved when leaving embedded mode."))
     (message "Not in embedded mode.")))
 
-(defun calc-embedded-restore-original-modes ()
+(defun calc-embedded-restore-original-modes (calcbuf)
   "Restore the original Calc modes when leaving embedded mode."
-  (let ((calcbuf (get-buffer "*Calculator*"))
-        (changed nil)
+  (let ((changed nil)
         (lang (car calc-embedded-original-modes))
         (modes (cdr calc-embedded-original-modes)))
     (if (and calcbuf calc-embedded-original-modes)
 
            ((eq (current-buffer) (aref calc-embedded-info 0))
             (let* ((info calc-embedded-info)
-                   (mode calc-embedded-modes))
-              (save-excursion
-                (set-buffer (aref info 1))
+                   (mode calc-embedded-modes)
+                    (calcbuf (aref calc-embedded-info 1)))
+              (with-current-buffer (aref info 1)
                 (if (and (> (calc-stack-size) 0)
                          (equal (calc-top 1 'full) (aref info 8)))
                     (let ((calc-no-refresh-evaltos t))
                (setq minor-mode-overriding-map-alist
                      (remq calc-override-minor-modes minor-mode-overriding-map-alist))
               (set-buffer-modified-p (buffer-modified-p))
-               (calc-embedded-restore-original-modes)
+               (calc-embedded-restore-original-modes calcbuf)
               (or calc-embedded-quiet
                   (message "Back to %s mode" (format-mode-line mode-name)))))
 
            (t
             (if (buffer-name (aref calc-embedded-info 0))
-                (save-excursion
-                  (set-buffer (aref calc-embedded-info 0))
+                (with-current-buffer (aref calc-embedded-info 0)
                   (or (y-or-n-p (format "Cancel Calc Embedded mode in buffer %s? "
                                         (buffer-name)))
                       (keyboard-quit))
        (start (point))
        pos)
     (switch-to-buffer calc-original-buffer)
-    (let ((val (save-excursion
-                (set-buffer (aref info 1))
+    (let ((val (with-current-buffer (aref info 1)
                 (let ((calc-language nil)
                       (math-expr-opers (math-standard-ops)))
                   (math-read-expr str)))))
@@ -818,7 +819,7 @@ The command \\[yank] can retrieve it from there."
                                       calc-embed-outer-top calc-embed-outer-bot)
   (let* ((bufentry (assq (current-buffer) calc-embedded-active))
         (found bufentry)
-        (force (and fresh calc-embed-top))
+        (force (and fresh calc-embed-top (null (equal calc-embed-top '(t)))))
         (fixed calc-embed-top)
         (new-info nil)
         info str)
@@ -829,7 +830,7 @@ The command \\[yank] can retrieve it from there."
                calc-embedded-firsttime-buf t)
          (let ((newann (assoc major-mode calc-embedded-announce-formula-alist))
                (newform (assoc major-mode calc-embedded-open-close-formula-alist))
-               (newword (assoc major-mode calc-embedded-open-close-word-alist))
+               (newword (assoc major-mode calc-embedded-word-regexp-alist))
                (newplain (assoc major-mode calc-embedded-open-close-plain-alist))
                (newnewform 
                 (assoc major-mode calc-embedded-open-close-new-formula-alist))
@@ -843,10 +844,8 @@ The command \\[yank] can retrieve it from there."
              (setq calc-embedded-open-formula (nth 0 (cdr newform)))
              (setq calc-embedded-close-formula (nth 1 (cdr newform))))
            (when newword
-             (make-local-variable 'calc-embedded-open-word)
-             (make-local-variable 'calc-embedded-close-word)
-             (setq calc-embedded-open-word (nth 0 (cdr newword)))
-             (setq calc-embedded-close-word (nth 1 (cdr newword))))
+             (make-local-variable 'calc-embedded-word-regexp)
+             (setq calc-embedded-word-regexp (nth 1 newword)))
            (when newplain
              (make-local-variable 'calc-embedded-open-plain)
              (make-local-variable 'calc-embedded-close-plain)
@@ -902,9 +901,18 @@ The command \\[yank] can retrieve it from there."
          (setq calc-embed-top (aref info 2)
                fixed calc-embed-top)
        (if (consp calc-embed-top)
-           (let ((calc-embedded-open-formula calc-embedded-open-word)
-                 (calc-embedded-close-formula calc-embedded-close-word))
-             (calc-embedded-find-bounds 'plain))
+            (progn
+              (require 'thingatpt)
+              (if (thing-at-point-looking-at calc-embedded-word-regexp)
+                  (progn
+                    (setq calc-embed-top (copy-marker (match-beginning 0)))
+                    (setq calc-embed-bot (copy-marker (match-end 0)))
+                    (setq calc-embed-outer-top calc-embed-top)
+                    (setq calc-embed-outer-bot calc-embed-bot))
+                (setq calc-embed-top (point-marker))
+                (setq calc-embed-bot (point-marker))
+                (setq calc-embed-outer-top calc-embed-top)
+                (setq calc-embed-outer-bot calc-embed-bot)))
          (or calc-embed-top
              (calc-embedded-find-bounds 'plain)))
        (aset info 2 (copy-marker (min calc-embed-top calc-embed-bot)))
@@ -936,8 +944,7 @@ The command \\[yank] can retrieve it from there."
                 (pref-len (length open-plain))
                 (calc-embed-vars-used nil)
                 suff-pos val temp)
-           (save-excursion
-             (set-buffer (aref info 1))
+           (with-current-buffer (aref info 1)
              (calc-embedded-set-modes (aref info 15)
                                       (aref info 12) (aref info 14))
              (if (and (> (length str) pref-len)
@@ -1194,8 +1201,7 @@ The command \\[yank] can retrieve it from there."
 (defun calc-embedded-finish-command ()
   (let ((buf (current-buffer))
        horiz vert)
-    (save-excursion
-      (set-buffer (aref calc-embedded-info 1))
+    (with-current-buffer (aref calc-embedded-info 1)
       (if (> (calc-stack-size) 0)
          (let ((pt (point))
                (col (current-column))
@@ -1223,8 +1229,7 @@ The command \\[yank] can retrieve it from there."
 
 (defun calc-embedded-stack-change ()
   (or calc-executing-macro
-      (save-excursion
-       (set-buffer (aref calc-embedded-info 1))
+      (with-current-buffer (aref calc-embedded-info 1)
        (let* ((info calc-embedded-info)
               (extra-line (if (eq calc-language 'big) 1 0))
               (the-point (point))