【问题标题】:Navigate location history backwards step by step in Emacs在 Emacs 中逐步向后导航位置历史
【发布时间】:2012-11-26 12:04:52
【问题描述】:

不是关于如何在 C-u C-space 中使用标记环的问题。

我想要的是逐步向后导航位置历史记录。 “步进”是指任何单个 atomic 光标在缓冲区中移动。例如,光标在行的中间,我发出 C-f 3 次将其向前移动 3 个字符,然后 C-e 在行尾跳转。现在我想先“撤消” C-e 然后 3 个前一个 C-f 来返回。因此,我按下某个键,它会将光标带到发出 C-e 的位置,然后返回一个字符,依此类推。这就像在缓冲区中的每个光标移动时按下标记,然后使用 C-u C-space,但自动且噪音较小。

在 Emacs 中怎么做?

【问题讨论】:

    标签: emacs navigation location buffer history


    【解决方案1】:

    默认情况下,Emacs 不会在任何地方记录这些动作,所以为了做你想做的事,你需要记录缓冲区位置。类似的东西

    (defvar my-positions-history nil)
    (make-variable-buffer-local 'my-positions-history)
    (add-hook 'post-command-hook 'my-record-positions)
    (defun my-record-positions ()
      (unless (and my-positions-history
                   (equal (point) (marker-position (car my-positions-history))))
        (push (point-marker) my-positions-history)))
    

    请注意,这将创建大量标记,这会显着降低 Emacs 的速度。使用 (point) 而不是 (point-marker) 可以解决这个问题,但是这些位置不会跟踪对缓冲区的修改,因此如果在执行此动作后修改了缓冲区,它们可能不会让您回到原来的位置。

    然后你可以添加类似的命令

    (defun my-undo-movement ()
      (interactive)
      (while (and my-positions-history
                   (equal (point) (marker-position (car my-positions-history))))
        (pop my-positions-history))
      (when my-positions-history
        (goto-char (pop my-positions-history))))
    

    【讨论】:

    • 无法正常工作:评估附加挂钩时显示“void variable my-record-positions”。我试图让它在本地缓冲并且 add-hook 工作,但似乎它从来没有被调用过并且 my-positions-history 总是为零。 Emacs 24.1.
    【解决方案2】:

    在 EmacsWiki 上有几种选择:quick-jumppoint-undojump-to-prev-posgoto-last-point

    【讨论】:

    • 我添加了 goto-last-point,这是我在有人将我链接到此页面之前刚刚编写的一个模块,以及各种类似但不完全相同的实现。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-02
    • 2012-05-12
    相关资源
    最近更新 更多