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