X-Git-Url: https://code.delx.au/gnu-emacs/blobdiff_plain/51fb064bc72968e739e8dea580e58796c1a87f4c..e61d39cddfd015032a6419ce75c36ecdf1e9fe9f:/lisp/calc/calc-embed.el diff --git a/lisp/calc/calc-embed.el b/lisp/calc/calc-embed.el index 51cdd3f917..954e5d0b72 100644 --- a/lisp/calc/calc-embed.el +++ b/lisp/calc/calc-embed.el @@ -1,17 +1,16 @@ ;;; calc-embed.el --- embed Calc in a buffer -;; Copyright (C) 1990, 1991, 1992, 1993, 2001, 2002, 2003, 2004, -;; 2005, 2006, 2007, 2008 Free Software Foundation, Inc. +;; Copyright (C) 1990-1993, 2001-2012 Free Software Foundation, Inc. ;; Author: David Gillespie ;; Maintainer: Jay Belanger ;; This file is part of GNU Emacs. -;; GNU Emacs is free software; you can redistribute it and/or modify +;; GNU Emacs is free software: you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by -;; the Free Software Foundation; either version 3, or (at your option) -;; any later version. +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. ;; GNU Emacs is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of @@ -19,9 +18,7 @@ ;; GNU General Public License for more details. ;; You should have received a copy of the GNU General Public License -;; along with GNU Emacs; see the file COPYING. If not, write to the -;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, -;; Boston, MA 02110-1301, USA. +;; along with GNU Emacs. If not, see . ;;; Commentary: @@ -32,6 +29,10 @@ (require 'calc-ext) (require 'calc-macs) +;; Declare functions which are defined elsewhere. +(declare-function thing-at-point-looking-at "thingatpt" (regexp)) + + (defun calc-show-plain (n) (interactive "P") (calc-wrapper @@ -53,16 +54,16 @@ (defvar calc-embedded-announce-formula) (defvar calc-embedded-open-formula) (defvar calc-embedded-close-formula) -(defvar calc-embedded-open-word) -(defvar calc-embedded-close-word) (defvar calc-embedded-open-plain) (defvar calc-embedded-close-plain) (defvar calc-embedded-open-new-formula) (defvar calc-embedded-close-new-formula) (defvar calc-embedded-open-mode) (defvar calc-embedded-close-mode) +(defvar calc-embedded-word-regexp) -(defconst calc-embedded-mode-vars '(("precision" . calc-internal-prec) +(defconst calc-embedded-mode-vars '(("twos-complement" . calc-twos-complement-mode) + ("precision" . calc-internal-prec) ("word-size" . calc-word-size) ("angles" . calc-angle-mode) ("symbolic" . calc-symbolic-mode) @@ -96,35 +97,35 @@ )) -;;; Format of calc-embedded-info vector: -;;; 0 Editing buffer. -;;; 1 Calculator buffer. -;;; 2 Top of current formula (marker). -;;; 3 Bottom of current formula (marker). -;;; 4 Top of current formula's delimiters (marker). -;;; 5 Bottom of current formula's delimiters (marker). -;;; 6 String representation of current formula. -;;; 7 Non-nil if formula is embedded within a single line. -;;; 8 Internal representation of current formula. -;;; 9 Variable assigned by this formula, or nil. -;;; 10 List of variables upon which this formula depends. -;;; 11 Evaluated value of the formula, or nil. -;;; 12 Mode settings for current formula. -;;; 13 Local mode settings for current formula. -;;; 14 Permanent mode settings for current formula. -;;; 15 Global mode settings for editing buffer. - - -;;; calc-embedded-active is an a-list keyed on buffers; each cdr is a -;;; sorted list of calc-embedded-infos in that buffer. We do this -;;; rather than using buffer-local variables because the latter are -;;; thrown away when a buffer changes major modes. +;; Format of calc-embedded-info vector: +;; 0 Editing buffer. +;; 1 Calculator buffer. +;; 2 Top of current formula (marker). +;; 3 Bottom of current formula (marker). +;; 4 Top of current formula's delimiters (marker). +;; 5 Bottom of current formula's delimiters (marker). +;; 6 String representation of current formula. +;; 7 Non-nil if formula is embedded within a single line. +;; 8 Internal representation of current formula. +;; 9 Variable assigned by this formula, or nil. +;; 10 List of variables upon which this formula depends. +;; 11 Evaluated value of the formula, or nil. +;; 12 Mode settings for current formula. +;; 13 Local mode settings for current formula. +;; 14 Permanent mode settings for current formula. +;; 15 Global mode settings for editing buffer. + + +;; calc-embedded-active is an a-list keyed on buffers; each cdr is a +;; sorted list of calc-embedded-infos in that buffer. We do this +;; 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." + "Save the current Calc modes when entering embedded mode." (let ((calcbuf (save-excursion (calc-create-buffer) (current-buffer))) @@ -143,7 +144,7 @@ (let ((var (cdr (car v)))) (unless (memq var '(the-language the-display-just)) (setq modes - (cons (cons var (symbol-value var)) + (cons (cons var (symbol-value var)) modes)))) (setq v (cdr v)))) (setq calc-embedded-original-modes (cons lang modes))) @@ -158,10 +159,9 @@ (message "Current modes will be preserved when leaving embedded mode.")) (message "Not in embedded mode."))) -(defun calc-embedded-restore-original-modes () +(defun calc-embedded-restore-original-modes (calcbuf) "Restore the original Calc modes when leaving embedded mode." - (let ((calcbuf (get-buffer "*Calculator*")) - (changed nil) + (let ((changed nil) (lang (car calc-embedded-original-modes)) (modes (cdr calc-embedded-original-modes))) (if (and calcbuf calc-embedded-original-modes) @@ -182,7 +182,7 @@ (calc-set-mode-line)))) (setq calc-embedded-original-modes nil))) -;; The variables calc-embed-outer-top, calc-embed-outer-bot, +;; 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, ;; calc-embedded-duplicate, calc-embedded-new-formula and @@ -195,7 +195,7 @@ ;; The variable calc-embed-arg is local to calc-do-embedded, ;; calc-embedded-update-formula, calc-embedded-edit and -;; calc-do-embedded-activate, but is used by +;; calc-do-embedded-activate, but is used by ;; calc-embedded-make-info, which is called by the above ;; functions. (defvar calc-embed-arg) @@ -208,14 +208,14 @@ ;; The following is to take care of any minor modes which override ;; a Calc command. -(defvar calc-override-minor-modes-map +(defvar calc-override-minor-modes-map (make-sparse-keymap) "A list of keybindings that might be overwritten by minor modes.") ;; Add any keys that might be overwritten here. (define-key calc-override-minor-modes-map "`" 'calc-edit) -(defvar calc-override-minor-modes +(defvar calc-override-minor-modes (cons t calc-override-minor-modes-map)) (defun calc-do-embedded (calc-embed-arg end obeg oend) @@ -231,9 +231,9 @@ ((eq (current-buffer) (aref calc-embedded-info 0)) (let* ((info calc-embedded-info) - (mode calc-embedded-modes)) - (save-excursion - (set-buffer (aref info 1)) + (mode calc-embedded-modes) + (calcbuf (aref calc-embedded-info 1))) + (with-current-buffer (aref info 1) (if (and (> (calc-stack-size) 0) (equal (calc-top 1 'full) (aref info 8))) (let ((calc-no-refresh-evaltos t)) @@ -252,14 +252,13 @@ (setq minor-mode-overriding-map-alist (remq calc-override-minor-modes minor-mode-overriding-map-alist)) (set-buffer-modified-p (buffer-modified-p)) - (calc-embedded-restore-original-modes) + (calc-embedded-restore-original-modes calcbuf) (or calc-embedded-quiet (message "Back to %s mode" (format-mode-line mode-name))))) (t (if (buffer-name (aref calc-embedded-info 0)) - (save-excursion - (set-buffer (aref calc-embedded-info 0)) + (with-current-buffer (aref calc-embedded-info 0) (or (y-or-n-p (format "Cancel Calc Embedded mode in buffer %s? " (buffer-name))) (keyboard-quit)) @@ -280,7 +279,7 @@ (calc-embedded-save-original-modes) (or calc-embedded-globals (calc-find-globals)) - (setq info + (setq info (calc-embedded-make-info (point) nil t calc-embed-arg end obeg oend)) (if (eq (car-safe (aref info 8)) 'error) (progn @@ -400,8 +399,7 @@ (start (point)) pos) (switch-to-buffer calc-original-buffer) - (let ((val (save-excursion - (set-buffer (aref info 1)) + (let ((val (with-current-buffer (aref info 1) (let ((calc-language nil) (math-expr-opers (math-standard-ops))) (math-read-expr str))))) @@ -414,6 +412,7 @@ (aset info 8 val) (calc-embedded-update info 14 t t)))) +;;;###autoload (defun calc-do-embedded-activate (calc-embed-arg cbuf) (calc-plain-buffer-only) (if calc-embed-arg @@ -565,7 +564,7 @@ The command \\[yank] can retrieve it from there." (goto-char calc-embed-outer-bot) (insert "\n") (setq new-top (point)) - (insert-buffer-substring (current-buffer) + (insert-buffer-substring (current-buffer) calc-embed-outer-top calc-embed-outer-bot) (goto-char (+ new-top (- calc-embed-top calc-embed-outer-top))) (let ((calc-embedded-quiet (if already t 'x))) @@ -660,7 +659,7 @@ The command \\[yank] can retrieve it from there." (equal (symbol-value (car (car v))) value)) (progn (setq changed t) - (if temp (setq calc-embed-prev-modes + (if temp (setq calc-embed-prev-modes (cons (cons (car (car v)) (symbol-value (car (car v)))) calc-embed-prev-modes))) @@ -810,16 +809,16 @@ The command \\[yank] can retrieve it from there." (list modes emodes pmodes))) ;; The variable calc-embed-vars-used is local to calc-embedded-make-info, -;; calc-embedded-evaluate-expr and calc-embedded-update, but is +;; calc-embedded-evaluate-expr and calc-embedded-update, but is ;; used by calc-embedded-find-vars, which is called by the above functions. (defvar calc-embed-vars-used) (defun calc-embedded-make-info (point cbuf fresh &optional - calc-embed-top calc-embed-bot + calc-embed-top calc-embed-bot calc-embed-outer-top calc-embed-outer-bot) (let* ((bufentry (assq (current-buffer) calc-embedded-active)) (found bufentry) - (force (and fresh calc-embed-top)) + (force (and fresh calc-embed-top (null (equal calc-embed-top '(t))))) (fixed calc-embed-top) (new-info nil) info str) @@ -830,9 +829,9 @@ The command \\[yank] can retrieve it from there." calc-embedded-firsttime-buf t) (let ((newann (assoc major-mode calc-embedded-announce-formula-alist)) (newform (assoc major-mode calc-embedded-open-close-formula-alist)) - (newword (assoc major-mode calc-embedded-open-close-word-alist)) + (newword (assoc major-mode calc-embedded-word-regexp-alist)) (newplain (assoc major-mode calc-embedded-open-close-plain-alist)) - (newnewform + (newnewform (assoc major-mode calc-embedded-open-close-new-formula-alist)) (newmode (assoc major-mode calc-embedded-open-close-mode-alist))) (when newann @@ -844,10 +843,8 @@ The command \\[yank] can retrieve it from there." (setq calc-embedded-open-formula (nth 0 (cdr newform))) (setq calc-embedded-close-formula (nth 1 (cdr newform)))) (when newword - (make-local-variable 'calc-embedded-open-word) - (make-local-variable 'calc-embedded-close-word) - (setq calc-embedded-open-word (nth 0 (cdr newword))) - (setq calc-embedded-close-word (nth 1 (cdr newword)))) + (make-local-variable 'calc-embedded-word-regexp) + (setq calc-embedded-word-regexp (nth 1 newword))) (when newplain (make-local-variable 'calc-embedded-open-plain) (make-local-variable 'calc-embedded-close-plain) @@ -877,9 +874,9 @@ The command \\[yank] can retrieve it from there." (aset info 1 (or cbuf (save-excursion (calc-create-buffer) (current-buffer))))) - (if (and + (if (and (or (integerp calc-embed-top) (equal calc-embed-top '(4))) - (not calc-embed-bot)) + (not calc-embed-bot)) ; started with a user-supplied argument (progn (if (equal calc-embed-top '(4)) @@ -903,9 +900,18 @@ The command \\[yank] can retrieve it from there." (setq calc-embed-top (aref info 2) fixed calc-embed-top) (if (consp calc-embed-top) - (let ((calc-embedded-open-formula calc-embedded-open-word) - (calc-embedded-close-formula calc-embedded-close-word)) - (calc-embedded-find-bounds 'plain)) + (progn + (require 'thingatpt) + (if (thing-at-point-looking-at calc-embedded-word-regexp) + (progn + (setq calc-embed-top (copy-marker (match-beginning 0))) + (setq calc-embed-bot (copy-marker (match-end 0))) + (setq calc-embed-outer-top calc-embed-top) + (setq calc-embed-outer-bot calc-embed-bot)) + (setq calc-embed-top (point-marker)) + (setq calc-embed-bot (point-marker)) + (setq calc-embed-outer-top calc-embed-top) + (setq calc-embed-outer-bot calc-embed-bot))) (or calc-embed-top (calc-embedded-find-bounds 'plain))) (aset info 2 (copy-marker (min calc-embed-top calc-embed-bot))) @@ -937,8 +943,7 @@ The command \\[yank] can retrieve it from there." (pref-len (length open-plain)) (calc-embed-vars-used nil) suff-pos val temp) - (save-excursion - (set-buffer (aref info 1)) + (with-current-buffer (aref info 1) (calc-embedded-set-modes (aref info 15) (aref info 12) (aref info 14)) (if (and (> (length str) pref-len) @@ -1152,7 +1157,7 @@ The command \\[yank] can retrieve it from there." (if need-display (calc-embedded-set-justify (cdr (car calc-embed-prev-modes))))) (t - (set (car (car calc-embed-prev-modes)) + (set (car (car calc-embed-prev-modes)) (cdr (car calc-embed-prev-modes))))) (setq calc-embed-prev-modes (cdr calc-embed-prev-modes)))))) @@ -1195,8 +1200,7 @@ The command \\[yank] can retrieve it from there." (defun calc-embedded-finish-command () (let ((buf (current-buffer)) horiz vert) - (save-excursion - (set-buffer (aref calc-embedded-info 1)) + (with-current-buffer (aref calc-embedded-info 1) (if (> (calc-stack-size) 0) (let ((pt (point)) (col (current-column)) @@ -1224,8 +1228,7 @@ The command \\[yank] can retrieve it from there." (defun calc-embedded-stack-change () (or calc-executing-macro - (save-excursion - (set-buffer (aref calc-embedded-info 1)) + (with-current-buffer (aref calc-embedded-info 1) (let* ((info calc-embedded-info) (extra-line (if (eq calc-language 'big) 1 0)) (the-point (point)) @@ -1374,5 +1377,8 @@ The command \\[yank] can retrieve it from there." (provide 'calc-embed) -;; arch-tag: 1b8f311e-fba1-40d3-b8c3-1d6f68fd26fc +;; Local variables: +;; generated-autoload-file: "calc-loaddefs.el" +;; End: + ;;; calc-embed.el ends here