comparison lisp/calc/calc.el @ 102789:9b97f51b2e82

(calc-buffer-list): New variable. (calc-kill-stack-buffer): New function. (calc-mode): Add `calc-kill-stack-buffer' to `kill-buffer-query-functions'. Add current buffer to `calc-buffer-list'.
author Jay Belanger <jay.p.belanger@gmail.com>
date Mon, 30 Mar 2009 02:19:07 +0000
parents dbe70c3aa01d
children be74cb571117
comparison
equal deleted inserted replaced
102788:b5ba1407f9a1 102789:9b97f51b2e82
901 "The list of previous operations for undo.") 901 "The list of previous operations for undo.")
902 (defvar calc-redo-list nil 902 (defvar calc-redo-list nil
903 "The list of recent undo operations.") 903 "The list of recent undo operations.")
904 (defvar calc-main-buffer nil 904 (defvar calc-main-buffer nil
905 "A pointer to Calculator buffer.") 905 "A pointer to Calculator buffer.")
906 (defvar calc-buffer-list nil
907 "A list of all Calc buffers.")
906 (defvar calc-trail-buffer nil 908 (defvar calc-trail-buffer nil
907 "A pointer to Calc Trail buffer.") 909 "A pointer to Calc Trail buffer.")
908 (defvar calc-why nil 910 (defvar calc-why nil
909 "Explanations of most recent errors.") 911 "Explanations of most recent errors.")
910 (defvar calc-next-why nil) 912 (defvar calc-next-why nil)
1199 (use-global-map glob) 1201 (use-global-map glob)
1200 (use-local-map loc))))) 1202 (use-local-map loc)))))
1201 1203
1202 (defvar calc-alg-map) ; Defined in calc-ext.el 1204 (defvar calc-alg-map) ; Defined in calc-ext.el
1203 1205
1206
1207 (defvar calc-embedded-modes) ; Defined in calc-embed.el
1208 (defvar calc-override-minor-modes) ; Defined in calc-embed.el
1209 (defun calc-kill-stack-buffer ()
1210 "Check to see if user wants to kill the Calc stack buffer.
1211 This will look for buffers using the Calc buffer for embedded mode,
1212 and inform the user if there are any.
1213 If the user wants to kill the Calc buffer, this will remove
1214 embedded information from the appropriate buffers and tidy up
1215 the trail buffer."
1216 (let ((cb (current-buffer))
1217 (info-list nil)
1218 (buflist)
1219 ; (plural nil)
1220 (cea calc-embedded-active))
1221 ;; Get a list of all buffers using this buffer for
1222 ;; embedded Calc.
1223 (while cea
1224 (when (and (eq cb (aref (nth 1 (car cea)) 1))
1225 (buffer-name (car (car cea))))
1226 (setq info-list (cons (car cea) info-list)))
1227 (setq cea (cdr cea)))
1228 ;; Eventually, prompt user with a list of buffers using embedded mode.
1229 (when (and
1230 info-list
1231 (yes-or-no-p
1232 (concat "This Calc stack is being used for embedded mode. Kill anyway?")))
1233 (while info-list
1234 (with-current-buffer (car (car info-list))
1235 (when calc-embedded-info
1236 (setq calc-embedded-info nil
1237 mode-line-buffer-identification (car calc-embedded-modes)
1238 truncate-lines (nth 2 calc-embedded-modes)
1239 buffer-read-only nil)
1240 (use-local-map (nth 1 calc-embedded-modes))
1241 (setq minor-mode-overriding-map-alist
1242 (remq calc-override-minor-modes minor-mode-overriding-map-alist))
1243 (let ((str mode-line-buffer-identification))
1244 (setq mode-line-buffer-identification str))
1245 (set-buffer-modified-p (buffer-modified-p))))
1246 (setq calc-embedded-active
1247 (delete (car info-list) calc-embedded-active))
1248 (setq info-list (cdr info-list))))
1249 (if (not info-list)
1250 (progn
1251 (setq calc-buffer-list (delete cb calc-buffer-list))
1252 (with-current-buffer calc-trail-buffer
1253 (if (eq cb calc-main-buffer)
1254 ;; If there are other Calc stacks, make another one
1255 ;; the calc-main-buffer ...
1256 (if calc-buffer-list
1257 (setq calc-main-buffer (car calc-buffer-list))
1258 ;; ... otherwise kill the trail and its windows.
1259 (let ((wl (get-buffer-window-list calc-trail-buffer)))
1260 (while wl
1261 (delete-window (car wl))
1262 (setq wl (cdr wl))))
1263 (kill-buffer calc-trail-buffer)
1264 (setq calc-trail-buffer nil))))
1265 t))))
1266
1204 (defun calc-mode () 1267 (defun calc-mode ()
1205 "Calculator major mode. 1268 "Calculator major mode.
1206 1269
1207 This is an RPN calculator featuring arbitrary-precision integer, rational, 1270 This is an RPN calculator featuring arbitrary-precision integer, rational,
1208 floating-point, complex, matrix, and symbolic arithmetic. 1271 floating-point, complex, matrix, and symbolic arithmetic.
1240 (progn (require 'calc-ext) calc-alg-map) calc-mode-map)) 1303 (progn (require 'calc-ext) calc-alg-map) calc-mode-map))
1241 (mapc (function (lambda (v) (make-local-variable v))) calc-local-var-list) 1304 (mapc (function (lambda (v) (make-local-variable v))) calc-local-var-list)
1242 (make-local-variable 'overlay-arrow-position) 1305 (make-local-variable 'overlay-arrow-position)
1243 (make-local-variable 'overlay-arrow-string) 1306 (make-local-variable 'overlay-arrow-string)
1244 (add-hook 'change-major-mode-hook 'font-lock-defontify nil t) 1307 (add-hook 'change-major-mode-hook 'font-lock-defontify nil t)
1308 (add-hook 'kill-buffer-query-functions
1309 'calc-kill-stack-buffer
1310 t t)
1245 (setq truncate-lines t) 1311 (setq truncate-lines t)
1246 (setq buffer-read-only t) 1312 (setq buffer-read-only t)
1247 (setq major-mode 'calc-mode) 1313 (setq major-mode 'calc-mode)
1248 (setq mode-name "Calculator") 1314 (setq mode-name "Calculator")
1249 (setq calc-stack-top (length (or (memq (assq 'top-of-stack calc-stack) 1315 (setq calc-stack-top (length (or (memq (assq 'top-of-stack calc-stack)
1266 (setq p (cdr p)))) 1332 (setq p (cdr p))))
1267 (require 'calc-menu) 1333 (require 'calc-menu)
1268 (run-mode-hooks 'calc-mode-hook) 1334 (run-mode-hooks 'calc-mode-hook)
1269 (calc-refresh t) 1335 (calc-refresh t)
1270 (calc-set-mode-line) 1336 (calc-set-mode-line)
1271 (calc-check-defines)) 1337 (calc-check-defines)
1338 (add-to-list 'calc-buffer-list (current-buffer) t))
1272 1339
1273 (defvar calc-check-defines 'calc-check-defines) ; suitable for run-hooks 1340 (defvar calc-check-defines 'calc-check-defines) ; suitable for run-hooks
1274 (defun calc-check-defines () 1341 (defun calc-check-defines ()
1275 (if (symbol-plist 'calc-define) 1342 (if (symbol-plist 'calc-define)
1276 (let ((plist (copy-sequence (symbol-plist 'calc-define)))) 1343 (let ((plist (copy-sequence (symbol-plist 'calc-define))))