emacs save-excursion不恢复点?

Mar*_*rio 10 emacs elisp

我正在运行此功能(交互式和挂钩)来重新格式化源代码

(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)))
Run Code Online (Sandbox Code Playgroud)

但是save-excursion似乎不起作用,该点总是跳转到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))
Run Code Online (Sandbox Code Playgroud)

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

sco*_*zer 10

shell-command-on-region部分说明的文档:

如果REPLACE(可选的第五个参数)是非零的,则表示将输出插入从START到END的文本位置,并在其周围放置点和标记.

由于你已经设置了REPLACE t,它会替换所有文本并在其周围放置点和标记,因此点转到point-min.此外,我认为当先前保存的点save-excursion被删除时,Emacs会回到被删除区域的开头,这又是点分.

我认为您的解决方案很好.


eal*_*nso 5

我知道这是一个老问题,但是我遇到了同样的问题。这是一个还原点和缓冲区的简单宏:

(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)))))
Run Code Online (Sandbox Code Playgroud)