在Emacs中撤消缓冲区搜索

时间:2014-01-01 21:28:11

标签: emacs elisp

在当前缓冲区中执行(re-search-forward str)之后,在某些情况下,使用简单方法返回上一个缓冲区位置会很不错。对于缓冲区更改,行为应该类似于(undo)。因此,如果我向前进行两次搜索,首先是从位置A到B,然后是从B到C,我想按一个键返回一步(从C到B),然后再次按下键会让我离开甲..

3 个答案:

答案 0 :(得分:2)

如果你在Lisp代码中使用re-search-forward(你应该是,如果你正在使用它,即使它是一个命令),那么 设置标记,以便能够返回起点。

相反,只需将起始位置((point))保存为变量beg,然后使用goto-char beg

请参阅(elisp) The Mark中的此段落:

 Novice Emacs Lisp programmers often try to use the mark for the
 wrong purposes.  The mark saves a location for the user's
 convenience.  An editing command should not alter the mark unless
 altering the mark is part of the user-level functionality of the
 command.  (And, in that case, this effect should be documented.)
 To remember a location for internal use in the Lisp program, store
 it in a Lisp variable.  For example:

      (let ((beg (point)))
        (forward-line 1)
        (delete-region beg (point))).

答案 1 :(得分:1)

有了这个

(global-set-key
 (kbd "M-p")
 (lambda()(interactive) (set-mark-command 4)))

我可以通过一些 C-M-s 一个接一个地向后跳。

请注意,这适用于isearch-forward-regexp,不适用于普通版 re-search-forward(这个没有设置标记)。 但是使用elisp它没问题 - 只需先调用push-mark即可 re-search-forward

答案 2 :(得分:0)

总而言之,以下似乎有效:

(defun my-search-fun (str)
  (interactive)
  (push-mark)
  (beginning-of-buffer)
  (re-search-forward str))

(defun my-undo-search ()
  (interactive)
  (pop-mark)
  (goto-char (mark))