Emacs - 如何在搜索(C-r)而不是查询替换(M-%)时进入递归编辑模式?

时间:2015-11-14 06:55:26

标签: emacs

我知道如何在查询替换(M-%)时进入递归编辑模式,但有时我真的不想修改代码而只是在搜索。比如当我读代码时,从一个点我看到一个函数调用,然后我想跳转到函数的声明(C-r输入PageList :: Init),当我读到我想要的声明时跳回到函数的调用。

搜索时如何进入递归编辑模式(不仅在查询替换时)?

3 个答案:

答案 0 :(得分:1)

您通过调用recursive-edit来输入递归编辑,但是没有默认绑定在任何地方调用它(并且任意地这样做可能是危险的)。

query-replace的情况下,当您输入 Cr 时会进行一些特殊情况处理,该输入会在输入之前保存当前匹配数据/点/标记/缓冲区/窗口配置递归编辑,以确保它可以在退出时恢复。

这需要围绕对recursive-edit的调用包含一些特定于情境的自定义处理对于现有的用例非常常见,因此通常可能没有一种安全的方法来调用它。

我的猜测是,在isearch期间,当然也需要自定义处理以支持它,我看不到这样的设施。

请注意,当您开始使用isearch时,Emacs会指向标记环;因此,对于您的特定用例,您只需跳转到&用 C-u C-SPC

弹出标记

答案 1 :(得分:1)

如果您使用Isearch+,则可以在搜索时打开递归编辑。然后,在Isearch期间绑定C-x o以命令isearchp-open-recursive-edit

  

在Isearch期间以递归方式调用编辑器命令循环。   使用C-M-c结束递归编辑并从那里继续搜索。   或者使用abort-recursive-edit退出递归编辑并取消之前的搜索。

如果您不想使用 Isearch + ,那么这就是您所需要的:

(defun isearchp-open-recursive-edit ()
  "Invoke the editor command loop recursively, during Isearch.
Use `\\[exit-recursive-edit]' to end the recursive edit and resume searching from there.
Or use `abort-recursive-edit' to exit the recursive edit and cancel the previous search."
  (interactive)
  (with-isearch-suspended (recursive-edit))))

(define-key isearch-mode-map "\C-xo" 'isearchp-open-recursive-edit)

如果您询问递归编辑一般,而不仅仅是在搜索过程中,那么答案就是命令recursive-edit。只需使用M-x recursive-edit打开递归编辑即可。当然,您也可以将此命令绑定到密钥。

(如果迷你缓冲区处于活动状态,则通常无法使用M-x recursive-edit。在这种情况下,请将迷你缓冲区键盘中的密钥绑定到recursive-edit。或者您可以将选项enable-recursive-minibuffers设置为非 - nil,可以从迷你缓冲区调用M-x recursive-edit。)

答案 2 :(得分:1)

从您的工作流程说明中,我不确定您是否真的需要递归编辑模式。

在emacs中进行搜索时,会保存当前点。在我的系统上,C-r是反向的。当我点击它时,我提示输入搜索字符串并按Enter键。这让我想到了第一个'。点击C-r againi会给我下一个打击等。一旦找到你想要的文本,如果你没有点击输入,你可以阅读代码,然后点击C-g取消搜索。这会将光标跳回到您开始搜索的位置。这很好,只要你能看到你想在屏幕上阅读的所有代码。

当您无法读取屏幕上的所有代码并且需要在缓冲区中移动时,您必须按Enter键。一旦你这样做,你就失去了保存点,我怀疑这是你想要使用递归编辑模式的地方,这样你就可以在完成后跳回去。但是,这不会像你想要的那样工作,因为只要你按Enter键选择搜索的字符串,你就会退出递归模式并丢失保存的点。

有几种方法可以修复此工作流程以实现您的目标。实际上,您的工作流程是一个非常常见的要求。因此,许多编程模式已经内置了这个功能。因此,首先要做的是确保你的模式还没有这个 - 它可能被称为跳转到定义或类似的东西。

如果您的模式没有此支持,那么您可以通过保存该点然后稍后再回到它来获得所需的内容。这是一个非常方便的技术。您需要做的就是C-SPACE两次。然后,在将点移动到新位置之后,您可以执行C-u C-SPACE跳回到该点。来自emacs手册

  

而不是设置标记以便在某个区域上操作   也可以用它来“记住”缓冲区中的位置(通过输入   'C-SPC C-SPC'),然后跳回那里(输入'C-u   C-SPC”)。 * Note Mark Ring ::,详情。