在Emacs中逐步向后导航位置历史记录

时间:2012-11-26 12:04:52

标签: emacs navigation location buffer history

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

我想要的是逐步向后导航位置历史记录。 “步骤”是指任何单个原子光标在缓冲区中移动。例如,光标位于线的中间,我发出C-f 3次,向前移动3个字符,然后C-e跳到线的末端。现在我想先回到“撤消”C-e,然后再回到之前的3个C-f。所以,我按下一些键,它将光标移动到发出C-e的地方,然后返回一个字符,依此类推。这就像在缓冲区中每个光标移动时按下标记然后使用C-u C空间,但是自动且噪声较小。

如何在Emacs中执行此操作?

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:2)

默认情况下,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))))