我正在运行此功能(交互式和挂钩)以重新格式化源代码
(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-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))
有点傻,但做我想要的。如果有人知道更好的解决方案,我将不胜感激。
答案 0 :(得分:10)
shell-command-on-region
的文档部分说明:
如果REPLACE(可选的第五个参数)是非零的,则表示插入 输出代替从START到END的文本,放置点和标记 在它周围。
由于你将REPLACE设置为t
,它会替换所有文本并在其周围放置点和标记,因此点转到point-min。此外,我认为当save-excursion
之前保存的点被删除时,Emacs会回到已移除区域的开头,这也是点分。
我认为您的解决方案很好。
答案 1 :(得分: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)))))