diff options
| author | Jay Belanger | 2005-03-22 16:12:57 +0000 |
|---|---|---|
| committer | Jay Belanger | 2005-03-22 16:12:57 +0000 |
| commit | 9e74b3fb26f6db5ca9e74a0653045d95e862787f (patch) | |
| tree | 080c8bc336eb79ef375b8d5500238a155de69e42 | |
| parent | d615870ac51052b656ac5df860cd7afe885be5ad (diff) | |
| download | emacs-9e74b3fb26f6db5ca9e74a0653045d95e862787f.tar.gz emacs-9e74b3fb26f6db5ca9e74a0653045d95e862787f.zip | |
(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.el | 78 |
1 files changed, 77 insertions, 1 deletions
diff --git a/lisp/calc/calc-embed.el b/lisp/calc/calc-embed.el index 006be041bc2..8a48b78e37e 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.") | |||
| 149 | ;;; rather than using buffer-local variables because the latter are | 149 | ;;; rather than using buffer-local variables because the latter are |
| 150 | ;;; thrown away when a buffer changes major modes. | 150 | ;;; thrown away when a buffer changes major modes. |
| 151 | 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 | |||
| 152 | ;; The variables calc-embed-outer-top, calc-embed-outer-bot, | 205 | ;; The variables calc-embed-outer-top, calc-embed-outer-bot, |
| 153 | ;; calc-embed-top and calc-embed-bot are | 206 | ;; calc-embed-top and calc-embed-bot are |
| 154 | ;; local to calc-do-embedded, calc-embedded-mark-formula, | 207 | ;; 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.") | |||
| 193 | buffer-read-only nil) | 246 | buffer-read-only nil) |
| 194 | (use-local-map (nth 1 mode)) | 247 | (use-local-map (nth 1 mode)) |
| 195 | (set-buffer-modified-p (buffer-modified-p)) | 248 | (set-buffer-modified-p (buffer-modified-p)) |
| 249 | (calc-embedded-restore-original-modes) | ||
| 196 | (or calc-embedded-quiet | 250 | (or calc-embedded-quiet |
| 197 | (message "Back to %s mode" mode-name)))) | 251 | (message "Back to %s mode" mode-name)))) |
| 198 | 252 | ||
| @@ -214,11 +268,13 @@ This is not required to be present for user-written mode annotations.") | |||
| 214 | calc-embed-top calc-embed-bot calc-embed-outer-top calc-embed-outer-bot | 268 | calc-embed-top calc-embed-bot calc-embed-outer-top calc-embed-outer-bot |
| 215 | info chg ident) | 269 | info chg ident) |
| 216 | (barf-if-buffer-read-only) | 270 | (barf-if-buffer-read-only) |
| 271 | (calc-embedded-save-original-modes) | ||
| 217 | (or calc-embedded-globals | 272 | (or calc-embedded-globals |
| 218 | (calc-find-globals)) | 273 | (calc-find-globals)) |
| 219 | (setq info (calc-embedded-make-info (point) nil t arg end obeg oend)) | 274 | (setq info (calc-embedded-make-info (point) nil t arg end obeg oend)) |
| 220 | (if (eq (car-safe (aref info 8)) 'error) | 275 | (if (eq (car-safe (aref info 8)) 'error) |
| 221 | (progn | 276 | (progn |
| 277 | (setq calc-embedded-original-modes nil) | ||
| 222 | (goto-char (nth 1 (aref info 8))) | 278 | (goto-char (nth 1 (aref info 8))) |
| 223 | (error (nth 2 (aref info 8))))) | 279 | (error (nth 2 (aref info 8))))) |
| 224 | (let ((mode-line-buffer-identification mode-line-buffer-identification) | 280 | (let ((mode-line-buffer-identification mode-line-buffer-identification) |
| @@ -1200,7 +1256,27 @@ The command \\[yank] can retrieve it from there." | |||
| 1200 | (prin1-to-string (car values)) "]" | 1256 | (prin1-to-string (car values)) "]" |
| 1201 | calc-embedded-close-mode)))) | 1257 | calc-embedded-close-mode)))) |
| 1202 | (setq vars (cdr vars) | 1258 | (setq vars (cdr vars) |
| 1203 | values (cdr values)))))))) | 1259 | 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))))))))) | ||
| 1204 | 1280 | ||
| 1205 | (defun calc-embedded-var-change (var &optional buf) | 1281 | (defun calc-embedded-var-change (var &optional buf) |
| 1206 | (if (symbolp var) | 1282 | (if (symbolp var) |