149 |
;;; rather than using buffer-local variables because the latter are |
;;; rather than using buffer-local variables because the latter are |
150 |
;;; thrown away when a buffer changes major modes. |
;;; thrown away when a buffer changes major modes. |
151 |
|
|
152 |
|
(defvar calc-embedded-original-modes nil |
153 |
|
"The mode settings for Calc buffer when put in embedded mode.") |
154 |
|
|
155 |
|
(defun calc-embedded-save-original-modes () |
156 |
|
"Save the current Calc modes when entereding embedded mode." |
157 |
|
(let ((calcbuf (save-excursion |
158 |
|
(calc-create-buffer) |
159 |
|
(current-buffer))) |
160 |
|
lang modes) |
161 |
|
(if calcbuf |
162 |
|
(with-current-buffer calcbuf |
163 |
|
(setq lang |
164 |
|
(cons calc-language calc-language-option)) |
165 |
|
(setq modes |
166 |
|
(list (cons 'calc-display-just |
167 |
|
calc-display-just) |
168 |
|
(cons 'calc-display-origin |
169 |
|
calc-display-origin))) |
170 |
|
(let ((v calc-embedded-mode-vars)) |
171 |
|
(while v |
172 |
|
(let ((var (cdr (car v)))) |
173 |
|
(unless (memq var '(the-language the-display-just)) |
174 |
|
(setq modes |
175 |
|
(cons (cons var (symbol-value var)) |
176 |
|
modes)))) |
177 |
|
(setq v (cdr v)))) |
178 |
|
(setq calc-embedded-original-modes (cons lang modes))) |
179 |
|
(setq calc-embedded-original-modes nil)))) |
180 |
|
|
181 |
|
(defun calc-embedded-restore-original-modes () |
182 |
|
"Restore the original Calc modes when leaving embedded mode." |
183 |
|
(let ((calcbuf (get-buffer "*Calculator*")) |
184 |
|
(changed nil) |
185 |
|
(lang (car calc-embedded-original-modes)) |
186 |
|
(modes (cdr calc-embedded-original-modes))) |
187 |
|
(if (and calcbuf calc-embedded-original-modes) |
188 |
|
(with-current-buffer calcbuf |
189 |
|
(unless (and |
190 |
|
(equal calc-language (car lang)) |
191 |
|
(equal calc-language-option (cdr lang))) |
192 |
|
(calc-set-language (car lang) (cdr lang)) |
193 |
|
(setq changed t)) |
194 |
|
(while modes |
195 |
|
(let ((mode (car modes))) |
196 |
|
(unless (equal (symbol-value (car mode)) (cdr mode)) |
197 |
|
(set (car mode) (cdr mode)) |
198 |
|
(setq changed t))) |
199 |
|
(setq modes (cdr modes))) |
200 |
|
(when changed |
201 |
|
(calc-refresh) |
202 |
|
(calc-set-mode-line)))) |
203 |
|
(setq calc-embedded-original-modes nil))) |
204 |
|
|
205 |
;; The variables calc-embed-outer-top, calc-embed-outer-bot, |
;; The variables calc-embed-outer-top, calc-embed-outer-bot, |
206 |
;; calc-embed-top and calc-embed-bot are |
;; calc-embed-top and calc-embed-bot are |
207 |
;; local to calc-do-embedded, calc-embedded-mark-formula, |
;; local to calc-do-embedded, calc-embedded-mark-formula, |
246 |
buffer-read-only nil) |
buffer-read-only nil) |
247 |
(use-local-map (nth 1 mode)) |
(use-local-map (nth 1 mode)) |
248 |
(set-buffer-modified-p (buffer-modified-p)) |
(set-buffer-modified-p (buffer-modified-p)) |
249 |
|
(calc-embedded-restore-original-modes) |
250 |
(or calc-embedded-quiet |
(or calc-embedded-quiet |
251 |
(message "Back to %s mode" mode-name)))) |
(message "Back to %s mode" mode-name)))) |
252 |
|
|
268 |
calc-embed-top calc-embed-bot calc-embed-outer-top calc-embed-outer-bot |
calc-embed-top calc-embed-bot calc-embed-outer-top calc-embed-outer-bot |
269 |
info chg ident) |
info chg ident) |
270 |
(barf-if-buffer-read-only) |
(barf-if-buffer-read-only) |
271 |
|
(calc-embedded-save-original-modes) |
272 |
(or calc-embedded-globals |
(or calc-embedded-globals |
273 |
(calc-find-globals)) |
(calc-find-globals)) |
274 |
(setq info (calc-embedded-make-info (point) nil t arg end obeg oend)) |
(setq info (calc-embedded-make-info (point) nil t arg end obeg oend)) |
275 |
(if (eq (car-safe (aref info 8)) 'error) |
(if (eq (car-safe (aref info 8)) 'error) |
276 |
(progn |
(progn |
277 |
|
(setq calc-embedded-original-modes nil) |
278 |
(goto-char (nth 1 (aref info 8))) |
(goto-char (nth 1 (aref info 8))) |
279 |
(error (nth 2 (aref info 8))))) |
(error (nth 2 (aref info 8))))) |
280 |
(let ((mode-line-buffer-identification mode-line-buffer-identification) |
(let ((mode-line-buffer-identification mode-line-buffer-identification) |
1256 |
(prin1-to-string (car values)) "]" |
(prin1-to-string (car values)) "]" |
1257 |
calc-embedded-close-mode)))) |
calc-embedded-close-mode)))) |
1258 |
(setq vars (cdr vars) |
(setq vars (cdr vars) |
1259 |
values (cdr values)))))))) |
values (cdr values)))))) |
1260 |
|
(when (and vars calc-embedded-original-modes (eq calc-mode-save-mode 'save)) |
1261 |
|
(cond ((equal vars '(the-language)) |
1262 |
|
(setcar calc-embedded-original-modes |
1263 |
|
(cons calc-language calc-language-option))) |
1264 |
|
((equal vars '(the-display-just)) |
1265 |
|
(let* ((modes (cdr calc-embedded-original-modes)) |
1266 |
|
(just (assq 'calc-display-just modes)) |
1267 |
|
(origin (assq 'calc-display-origin modes))) |
1268 |
|
(if just |
1269 |
|
(setcdr just calc-display-just)) |
1270 |
|
(if origin |
1271 |
|
(setcdr origin calc-display-origin)))) |
1272 |
|
(t |
1273 |
|
(let ((modes (cdr calc-embedded-original-modes))) |
1274 |
|
(while vars |
1275 |
|
(let* ((var (car vars)) |
1276 |
|
(cell (assq var modes))) |
1277 |
|
(if cell |
1278 |
|
(setcdr cell (symbol-value var)))) |
1279 |
|
(setq vars (cdr vars))))))))) |
1280 |
|
|
1281 |
(defun calc-embedded-var-change (var &optional buf) |
(defun calc-embedded-var-change (var &optional buf) |
1282 |
(if (symbolp var) |
(if (symbolp var) |