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