aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJay Belanger <[email protected]>2005-03-22 16:12:57 +0000
committerJay Belanger <[email protected]>2005-03-22 16:12:57 +0000
commit9e74b3fb26f6db5ca9e74a0653045d95e862787f (patch)
tree080c8bc336eb79ef375b8d5500238a155de69e42
parentd615870ac51052b656ac5df860cd7afe885be5ad (diff)
(calc-embedded-original-modes): New variable.
(calc-embedded-save-original-modes) (calc-embedded-restore-original-modes): New functions. (calc-do-embedded): Save original modes when entering embedded mode and restore when leaving embedded mode. (calc-embedded-modes-change): Change the value of calc-embedded-original-modes to reflect permanent changes.
-rw-r--r--lisp/calc/calc-embed.el78
1 files changed, 77 insertions, 1 deletions
diff --git a/lisp/calc/calc-embed.el b/lisp/calc/calc-embed.el
index 006be041bc..8a48b78e37 100644
--- a/lisp/calc/calc-embed.el
+++ b/lisp/calc/calc-embed.el
@@ -149,6 +149,59 @@ This is not required to be present for user-written mode annotations.")
;;; rather than using buffer-local variables because the latter are
;;; thrown away when a buffer changes major modes.
+(defvar calc-embedded-original-modes nil
+ "The mode settings for Calc buffer when put in embedded mode.")
+
+(defun calc-embedded-save-original-modes ()
+ "Save the current Calc modes when entereding embedded mode."
+ (let ((calcbuf (save-excursion
+ (calc-create-buffer)
+ (current-buffer)))
+ lang modes)
+ (if calcbuf
+ (with-current-buffer calcbuf
+ (setq lang
+ (cons calc-language calc-language-option))
+ (setq modes
+ (list (cons 'calc-display-just
+ calc-display-just)
+ (cons 'calc-display-origin
+ calc-display-origin)))
+ (let ((v calc-embedded-mode-vars))
+ (while v
+ (let ((var (cdr (car v))))
+ (unless (memq var '(the-language the-display-just))
+ (setq modes
+ (cons (cons var (symbol-value var))
+ modes))))
+ (setq v (cdr v))))
+ (setq calc-embedded-original-modes (cons lang modes)))
+ (setq calc-embedded-original-modes nil))))
+
+(defun calc-embedded-restore-original-modes ()
+ "Restore the original Calc modes when leaving embedded mode."
+ (let ((calcbuf (get-buffer "*Calculator*"))
+ (changed nil)
+ (lang (car calc-embedded-original-modes))
+ (modes (cdr calc-embedded-original-modes)))
+ (if (and calcbuf calc-embedded-original-modes)
+ (with-current-buffer calcbuf
+ (unless (and
+ (equal calc-language (car lang))
+ (equal calc-language-option (cdr lang)))
+ (calc-set-language (car lang) (cdr lang))
+ (setq changed t))
+ (while modes
+ (let ((mode (car modes)))
+ (unless (equal (symbol-value (car mode)) (cdr mode))
+ (set (car mode) (cdr mode))
+ (setq changed t)))
+ (setq modes (cdr modes)))
+ (when changed
+ (calc-refresh)
+ (calc-set-mode-line))))
+ (setq calc-embedded-original-modes nil)))
+
;; The variables calc-embed-outer-top, calc-embed-outer-bot,
;; calc-embed-top and calc-embed-bot are
;; local to calc-do-embedded, calc-embedded-mark-formula,
@@ -193,6 +246,7 @@ This is not required to be present for user-written mode annotations.")
buffer-read-only nil)
(use-local-map (nth 1 mode))
(set-buffer-modified-p (buffer-modified-p))
+ (calc-embedded-restore-original-modes)
(or calc-embedded-quiet
(message "Back to %s mode" mode-name))))
@@ -214,11 +268,13 @@ This is not required to be present for user-written mode annotations.")
calc-embed-top calc-embed-bot calc-embed-outer-top calc-embed-outer-bot
info chg ident)
(barf-if-buffer-read-only)
+ (calc-embedded-save-original-modes)
(or calc-embedded-globals
(calc-find-globals))
(setq info (calc-embedded-make-info (point) nil t arg end obeg oend))
(if (eq (car-safe (aref info 8)) 'error)
(progn
+ (setq calc-embedded-original-modes nil)
(goto-char (nth 1 (aref info 8)))
(error (nth 2 (aref info 8)))))
(let ((mode-line-buffer-identification mode-line-buffer-identification)
@@ -1200,7 +1256,27 @@ The command \\[yank] can retrieve it from there."
(prin1-to-string (car values)) "]"
calc-embedded-close-mode))))
(setq vars (cdr vars)
- values (cdr values))))))))
+ values (cdr values))))))
+ (when (and vars calc-embedded-original-modes (eq calc-mode-save-mode 'save))
+ (cond ((equal vars '(the-language))
+ (setcar calc-embedded-original-modes
+ (cons calc-language calc-language-option)))
+ ((equal vars '(the-display-just))
+ (let* ((modes (cdr calc-embedded-original-modes))
+ (just (assq 'calc-display-just modes))
+ (origin (assq 'calc-display-origin modes)))
+ (if just
+ (setcdr just calc-display-just))
+ (if origin
+ (setcdr origin calc-display-origin))))
+ (t
+ (let ((modes (cdr calc-embedded-original-modes)))
+ (while vars
+ (let* ((var (car vars))
+ (cell (assq var modes)))
+ (if cell
+ (setcdr cell (symbol-value var))))
+ (setq vars (cdr vars)))))))))
(defun calc-embedded-var-change (var &optional buf)
(if (symbolp var)