有时我需要将代码中的变量名从foo
更改为bar
。我是使用query-replace-regexp
来做的。然后我会做其他一些事情,我可能会后悔自己的决定,并希望将其从bar
更改为foo
。如果我执行query-replace-regexp
,则默认情况下会显示上次执行的替换(default foo -> bar)
。我的问题是,是否有一种快速告诉Emacs的方法我想要默认的相反顺序?否则,人们需要再次输入整个内容。
修改:默认替换是最后一次替换(default foo -> bar)
。我现在想要的是相反的:bar
到foo
。基本上,我想撤消替换。我并不总是可以使用撤消功能,因为在经过许多其他编辑后我可能会有很长的历史记录。
答案 0 :(得分:2)
使用query-replace
时,M-p
会检索默认值foo -> bar
。也就是说,它将foo -> bar
放入迷你缓冲区。
您可以在迷你缓冲区中编辑该文本。特别是,您可以使用M-b
(或C-M-b
)向后移动单词(或性别),然后使用M-t
(或C-M-t
)转置这两个单词那里的单词(sexps),给你bar -> foo
。 (然后点击RET
。)
关键是,一旦您检索到以前使用过的输入或默认输入,您就可以在迷你缓冲区中编辑。
(通常,在Emacs中,M-n
检索默认值。在这种情况下,它是M-p
((恕我直言)是一种异常)。)
Wrt访问以前输入的输入:您可以通过重复M-p
来循环,但您也可以使用M-r
直接搜索。如果您要检索的输入不是最近的,那么M-r
可能比骑车更快。
答案 1 :(得分:1)
这可能是一种可怕的方法,但你可以创建一个像下面这样的函数并将其绑定到另一个键。它似乎适用于这种特定的情况,但有许多其他事情没有处理(例如前缀参数)。
(defun so-undo-last-query-replace ()
(interactive)
(let ((query-replace-defaults (list (cons (cdar query-replace-defaults)
(caar query-replace-defaults)))))
(call-interactively 'query-replace)))