(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.
This commit is contained in:
Jay Belanger 2005-03-22 16:12:57 +00:00
parent d615870ac5
commit 9e74b3fb26

View file

@ -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)