我正在使用 emacs 23.4.1。在大多数情况下,查询替换工作正常,正如预期的那样。但是,有时当我尝试替换缓冲区中间的某些内容并y
在点后第一次出现时,该点会立即跳转到整个缓冲区的第一次出现。例如:
foo ------- // 开始
bar ------- //在此处使用foo
替换bar
foo ------- //y
在这里输入,然后跳到开头
这很烦人,我无法使用一些精确的输入来重现这个问题。但是每次出现,关闭emacs再重新打开就可以解决。任何人都可以帮助我吗?
另一个观察:我注意到同样的问题,这个点甚至来回跳了好几次。我可以通过使用 (setq semantic-change-hooks nil) 关闭语义更改挂钩来使其消失。语义更改挂钩设置为运行语义编辑更改功能句柄更改。所有这些都发生在语义编辑.el 中,它将语义更改功能添加到更改后功能。简而言之,我不能指出真正的罪魁祸首,但它与语义有关,这也是我最初的怀疑(我猜 jhh 提到了 CEDET)。
注意:除非您愿意放弃一些语义功能,否则关闭语义更改挂钩不是解决方案。
query-replace 再次显示了在通过按“y”替换文本中间某处的单词后从头开始搜索要替换的单词的烦人行为。
我现在发现:
按 CTRL-space 一次不会改变任何东西,但按 CTRL-space CTRL-space (因此调用此命令两次 -> 激活标记并停用它)使查询替换再次工作。
更新:当问题再次出现时,按两次 C-space 没有帮助。因此,这不是解决方法。
只是我今天做了一个观察:我使用的是 Emacs 23.2.1,并且遇到了与上述相同的问题。所以我在使用选项 -q 启动 emacs 时测试了 query-replace。然后它起作用了,所以认为问题的原因是我的“.emacs”。后来我发现以相同的“.emacs”开头的第二个 emacs 实例没有问题,而第一个实例仍然有问题。不幸的是,在使用 CEDET 进行编码、编译和编译一段时间后,问题又出现了。毕竟,我目前也无法重现该问题,也不知道是什么原因造成的。
query-replace 猜测从哪里开始:
...(如果(和瞬态标记模式标记激活)(区域开始))
为确保mark不在上面,\C-<SPACE>
在开始时键入,即在当前位置设置mark。
如果我设置一个标记(直接在区域之前使用 C 空间,要替换的单词在里面),然后调用 query-replace 命令,它会立即停止而无需替换任何内容。