Function: calc-do-embedded

calc-do-embedded is an autoloaded and byte-compiled function defined in calc-embed.el.gz.

Signature

(calc-do-embedded EMBED-ARG END OBEG OEND)

Source Code

;; Defined in /usr/src/emacs/lisp/calc/calc-embed.el.gz
(defun calc-do-embedded (embed-arg end obeg oend)
  (let ((calc-embed-arg embed-arg))
  (if calc-embedded-info

      ;; Turn embedded mode off or switch to a new buffer.
      (cond ((eq (current-buffer) (aref calc-embedded-info 1))
	     (let ((calcbuf (current-buffer))
		   ;; (buf (aref calc-embedded-info 0))
		   )
	       (calc-embedded-original-buffer t)
	       (calc-embedded nil)
	       (switch-to-buffer calcbuf)))

	    ((eq (current-buffer) (aref calc-embedded-info 0))
	     (let* ((info calc-embedded-info)
		    (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))
		       (if (calc-top 1 'sel)
			   (calc-unselect 1))
		       (calc-embedded-set-modes
			(aref info 15) (aref info 12) (aref info 14))
		       (let ((calc-embedded-info nil))
			 (calc-wrapper (calc-pop-stack))))
		   (calc-set-mode-line)))
	       (setq calc-embedded-info nil
		     mode-line-buffer-identification (car mode)
		     truncate-lines (nth 2 mode)
		     buffer-read-only nil)
	       (use-local-map (nth 1 mode))
               (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 calcbuf)
	       (or calc-embedded-quiet
		   (message "Back to %s mode" (format-mode-line mode-name)))))

	    (t
	     (if (buffer-name (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))
		   (calc-embedded nil)))
	     (calc-embedded calc-embed-arg end obeg oend)))

    ;; Turn embedded mode on.
    (calc-plain-buffer-only)
    (let ((modes (list mode-line-buffer-identification
		       (current-local-map)
		       truncate-lines))
          (calc-embedded-firsttime (not calc-embedded-active))
          (calc-embedded-firsttime-buf nil)
          (calc-embedded-firsttime-formula nil)
	  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 calc-embed-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)
	    (calc-embedded-info info)
	    (calc-embedded-no-reselect t))
	(calc-wrapper
	 (let* (;; (okay nil)
		(calc-no-refresh-evaltos t))
	   (if (aref info 8)
               (progn
                 (calc-push (calc-normalize (aref info 8)))
                 (setq chg (calc-embedded-set-modes
                            (aref info 15) (aref info 12) (aref info 13))))
             (setq chg (calc-embedded-set-modes
                        (aref info 15) (aref info 12) (aref info 13)))
	     (calc-alg-entry)))
	 (setq calc-undo-list nil
	       calc-redo-list nil
	       ident mode-line-buffer-identification)))
      (setq calc-embedded-info info
	    calc-embedded-modes modes
	    mode-line-buffer-identification ident
	    truncate-lines t
	    buffer-read-only t)
      (set-buffer-modified-p (buffer-modified-p))
      (use-local-map calc-mode-map)
      (setq minor-mode-overriding-map-alist
            (cons calc-override-minor-modes
                  minor-mode-overriding-map-alist))
      (setq calc-no-refresh-evaltos nil)
      (and chg calc-any-evaltos (calc-wrapper (calc-refresh-evaltos)))
      (let (str)
        (save-excursion
          (calc-select-buffer)
          (setq str mode-line-buffer-identification))
        (unless (equal str mode-line-buffer-identification)
          (setq mode-line-buffer-identification str)
          (set-buffer-modified-p (buffer-modified-p))))
      (if calc-embedded-firsttime
          (run-hooks 'calc-embedded-mode-hook))
      (if calc-embedded-firsttime-buf
          (run-hooks 'calc-embedded-new-buffer-hook))
      (if calc-embedded-firsttime-formula
          (run-hooks 'calc-embedded-new-formula-hook))
      (or (eq calc-embedded-quiet t)
	  (message (concat
                    "Embedded Calc mode enabled; "
                    (if calc-embedded-quiet
                        (substitute-command-keys
                         "Type \\`C-x * x'")
                      "Give this command again")
                    " to return to normal")))))
  (scroll-down 0)))    ; fix a bug which occurs when truncate-lines is changed.