【问题标题】:emacs save-excursion not restoring point?emacs save-excursion 不恢复点?
【发布时间】:2018-06-04 12:37:36
【问题描述】:

我正在运行这个函数(交互式和挂钩)来重新格式化源代码

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

但保存行程似乎不起作用,该点总是跳转到 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))

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

【问题讨论】:

  • let 代替setq 怎么样?

标签: emacs elisp


【解决方案1】:

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

如果可选的第五个参数 REPLACE 不为 nil,则表示插入 输出代替从 START 到 END 的文本,放置点和标记 围绕它。

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2013-11-24
      • 1970-01-01
      • 2014-01-02
      • 1970-01-01
      • 1970-01-01
      • 2011-11-30
      • 2021-11-09
      • 2011-04-16
      相关资源
      最近更新 更多