emacs是否保存偏移而不是恢复点?

emacs是否保存偏移而不是恢复点?,emacs,elisp,Emacs,Elisp,我正在运行这个函数(交互式的,在一个钩子中)来重新格式化源代码 (defun a-style () (interactive)

我正在运行这个函数(交互式的,在一个钩子中)来重新格式化源代码

(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)))
但是save偏移似乎不起作用,点总是跳到1(尽管shell命令起作用!)。我是不是漏掉了什么明显的东西

谢谢, 马里奥

编辑:

所以我最终还是用天真的方式做到了:

(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))

有点蠢,但做我想做的。如果有人知道更好的解决方案,我将不胜感激。

区域上的
shell命令的文档部分说明:

如果可选的第五个参数REPLACE为非nil,则表示插入 从开始到结束的文本输出,放置点和标记 围绕着它

由于您已将REPLACE设置为
t
,它将替换所有文本并在其周围放置点和标记,因此点将转到point-min。此外,我认为,当先前由
save-shiftion
保存的点被删除时,Emacs将备份到已删除区域的开头,该区域再次是point-min


我认为你的解决方案很好。

我知道这是一个老问题,但我遇到了同样的问题。下面是一个用于恢复点和缓冲区的简单宏:

(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)))))

let
表单代替
setq
怎么样?