14

Is there a possibility to save the Emacs Calculator Trail (as a file) and to restore it later? If not, should it be feature?

For example, when I have an incomplete calculation but have to shutdown my Emacs, it would be great if i can continue afterwards.

Second case: I do some calculations and want to store how I did it, to later check if I did it correctly or need to modify it.

The second reason is why I use MATLAB (I know, too much) for little calculations, just so i can restore them. But I would like to use Emacs Calc only!

Thanks for the answers

estownya
  • 303
  • 1
  • 7
  • 1
    Maybe [Embedded Mode](http://www.gnu.org/software/emacs/manual/html_node/calc/Embedded-Mode.html) is what you want? – npostavs Jun 30 '15 at 10:18
  • I know Calc is well integrated with keyboard macros and even extends them. I don't see why you can't save them as regular kmacros. Also have you tried GNU Octave? It is supposed to be mostly compatible with Matlab and comes with an emacs mode. – Kevin Holmes Jul 01 '15 at 13:16
  • 1
    I believe that Org's src blocks (besides embedded mode) for calc will be the way to go, especially for your second case. Unfortunately the src block code is not (yet) sophisticated enough for more than basic stuff. Please have a look at: http://home.fnal.gov/~neilsen/notebook/orgExamples/org-examples.html#sec-7 – Dieter.Wilhelm Aug 29 '15 at 09:33
  • @estownya - Please post some example calc code with the answer returned by calc. – Melioratus Dec 12 '15 at 21:37
  • Well, the Calc Trail is a buffer like any other. You can switch to it and `C-x C-w` to write it out. I don't think there's any easy way to reconstruct all of the Calc state when you want to reload. – MAP Jul 05 '16 at 08:19

2 Answers2

1

Since the processing of the calc trail is text based one can essentially use write-region and insert-file-contents.

Nevertheless some details must be considered. The following Elisp code lets you write the current calc-trail buffer to disk with C-x C-s and you can read back this stuff at current cursor position with C-x i.

Afterwards you can use the calc-trail-mode bindings to evaluate parts of the read-in calc commands.

(defvar-local calc-trail-buffer-file-name nil
  "Like `buffer-file-name' for calc-trail buffers.")

(defun calc-trail-save (&optional filename)
  "Save current calc trail buffer.
To be used in `write-contents-functions'.
Append with current prefix arg."
  (interactive "FCalc Trail File: ")
  (unless filename
    (setq calc-trail-buffer-file-name
      (expand-file-name (setq filename
                  (read-file-name "Calc Trail File: " nil calc-trail-buffer-file-name)))))
    (when (null (derived-mode-p 'calc-trail-mode))
    (user-error "Saving calc trail buffers requires calc-trail-mode"))
  (save-excursion
   (save-restriction
     (widen)
     (let* ((b-trail (progn (goto-char 1) (1+ (line-end-position))))
        (b (progn (goto-char (max (or (and (use-region-p) (region-beginning)) (point-min)) b-trail))
              (line-beginning-position)))
        (e (progn (goto-char (max (or (and (use-region-p) (region-end)) (point-max)) b-trail))
              (line-end-position))))
       (write-region b e filename current-prefix-arg)))))

(defun calc-insert-file (filename)
  "Insert calc-trail file FILENAME at point."
  (interactive "FCalc trail file: ")
  (when (= (line-beginning-position) 1)
    (goto-char (1+ (line-end-position))))
  (goto-char (line-beginning-position
          (if (looking-at "[[:space:]]*$")
          2
        1)))
  (let ((inhibit-read-only t))
    (insert-file-contents filename)
    (when (and (null (looking-at "[[:space:]]*$"))
           (null (looking-back "^[[:space:]]*" (line-beginning-position))))
      (insert "\n"))))

(defun calc-trail-install-save ()
  "Install `calc-trail-save' in `write-contents-functions' of `calc-trail-mode' buffers."
  (push #'calc-trail-save write-contents-functions)
  (local-set-key (kbd "C-x i") #'calc-insert-file))

(add-hook 'calc-trail-mode-hook #'calc-trail-install-save)
Tobias
  • 32,569
  • 1
  • 34
  • 75
  • This seems to work, except on line 15 you need to replace `save-point` with `save-excursion`. From what I can tell, `save-point` doesn't even *exist*--it's not even an actual Emacs function. Other than that, this seems to work alright. Thanks for the code! – GDP2 Apr 29 '21 at 16:34
  • @GDP2 Thanks for the comment. Yes, `save-point` is from my personal Elisp stuff. I've replaced it with `save-excursion` as you suggested. – Tobias Apr 29 '21 at 17:24
0

you can use s p which mean (calc-permanent-variable &optional VAR) to save all variable to ~/.emacs.d/calc.el or calc-settings-file .

gholk
  • 76
  • 4