2

不是关于如何使用带有 Cu C 空间的标记环的问题。

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

如何在 Emacs 中做到这一点?

4

2 回答 2

3

默认情况下,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))))
于 2012-11-26T14:18:54.000 回答
3

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

于 2012-11-26T15:33:34.473 回答