Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

emacs save-excursion not restoring point?

Tags:

emacs

elisp

I'm running this function (interactive and in a hook) to reformat source code

(defun a-style ()                                                                                                                                                                                         
  (interactive)                                                                                                                                                                                           
  (save-excursion                                                                                                                                                                                         
    (shell-command-on-region (point-min) (point-max) "/usr/local/bin/astyle -A10 -s4 -m0 -M40 -k1 -W0 -z2 -xd -CSKNLwYfpHjJcn" t t)))

but the save-excursion does not seem to work, the point always jumps to 1 (the shell command works though!). Am I missing something obvious here?

Thanks, Mario

EDIT:

So I finally did it the naive way:

(defun a-style ()                                                                                                                                                                                         
  (interactive)                                                                                                                                                                                           
  (setq temp-point (point))                                                                                                                                                                               
  (shell-command-on-region (point-min) (point-max) "/usr/local/bin/astyle -A10 -s4 -m0 -M40 -k1 -W0 -z2 -xd -CSKNLwYfpHjJcn" t t)                                                                         
  (goto-char temp-point))

Kinda stupid, but does what I want. If anyone knows of a better solution, I'd be grateful.

like image 969
Mario Avatar asked Nov 13 '11 23:11

Mario


2 Answers

The documentation for shell-command-on-region says in part:

If REPLACE, the optional fifth argument, is non-nil, that means insert the output in place of text from START to END, putting point and mark around it.

Since you have REPLACE set to t, it replaces all the text and puts point and mark around it, and so point goes to point-min. Furthermore, I think when the spot previously saved by save-excursion is removed Emacs backs up to the beginning of the removed region which again is point-min.

I think your solution is fine.

like image 132
scottfrazer Avatar answered Nov 03 '22 20:11

scottfrazer


I know this is an old question, but I came across this same issue. Here is a simple macro which restores point and buffer:

(defmacro my-save-excursion (&rest forms)
  (let ((old-point (gensym "old-point"))
        (old-buff (gensym "old-buff")))
    `(let ((,old-point (point))
           (,old-buff (current-buffer)))
       (prog1
           (progn ,@forms)
         (unless (eq (current-buffer) ,old-buff)
           (switch-to-buffer ,old-buff))
         (goto-char ,old-point)))))
like image 31
ealfonso Avatar answered Nov 03 '22 19:11

ealfonso