Emacs增量搜索 - 自动从搜索字符串中删除无法找到的字符

时间:2012-08-23 20:49:03

标签: emacs

在增量搜索期间输入拼写错误并且搜索字符串收到错误输入的字符时,这并不方便。有没有办法防止这种情况发生。就像在错误时自动按下control-g一样。

例如,我们有以下文字:

keywords
keys

默认的emacs行为:

  • 我们开始增量搜索并搜索“keyz”
  • “keyz”显示在搜索回显区域中,“keywords”中的“key”部分显示为
  • 我们按s
  • “密钥”将无法找到,光标停留在“关键字”行,搜索回显区域显示“keyzs”,这不方便

需要的行为:

  • 我们开始增量搜索并搜索“keyz”
  • “密钥”显示在搜索回显区域中,“关键字”中的“密钥”部分显示为
  • 我们按s
  • 找到“密钥”并高亮显示

5 个答案:

答案 0 :(得分:3)

您可以尝试类似

的内容
(defadvice isearch-printing-char (before drop-mismatches-on-next-char activate)
  (while (or (not isearch-success) isearch-error)
    (isearch-pop-state)))

答案 1 :(得分:2)

Emacs保留了不正确的部分,因为它经常发生搜索字符串并且找不到它,但不是因为它不正确,只是在光标之前找到了搜索字符串。在这种情况下,您可以按C-s非常方便,搜索从文件的开头开始。

这是一种非常有用的行为,它经常发生在错误搜索字符串上。如果搜索字符串中确实存在错误,那么您只需按C-g即可返回上一个良好的搜索字符串。

答案 2 :(得分:1)

我认为问题在于你没有考虑以与isearch设计工作方式一致的方式进行搜索,所以你的问题在isearch的背景下并没有真正意义,因为它目前存在

Isearch已经准确地为您提供了您想要的功能,但是您必须通过键入C-g来告诉它您是否希望它发生,您似乎非常反对键入。如果你不告诉isearch你想做什么,当你想要它做什么时,它应该怎么知道该做什么?

正如@Tom试图解释的那样,默认方式isearch从缓冲区中的当前位置开始,如果你输入了一些失败的字符然后按下Cs,可以在缓冲区的开头重新启动,这是一个非常有价值的功能。我相信很多人都会依赖这种行为。你使用宏来总是在缓冲区的开头启动一个isearch的方法会让我们很多人感到困惑和困惑,当然这对于像你这样熟悉它的人来说并不是一件坏事。这确实意味着我们其他人因为不喜欢按C-g删除不匹配的文本而感到非常困惑。

如果你在启动isearch之后立即按下它(任何时间,但是第一次在一个会话中)(即在你键入任何其他角色之前),请考虑一下第二个C-s的作用。请特别注意,如果您之前的搜索字符串仅部分匹配当前缓冲区中的某些内容,然后按Cg(并且还要注意失败的搜索字符串是如何显示的,无论它是否部分匹配当前缓冲区中的某些内容或不是)。

还要考虑您的功能如何对多个isearch-next-buffer-function的使用产生负面影响。

声称其他编辑可以做你想要的事情,而在emacs中做的事情并不能真正帮助你。

我认为你真正想要的是一些稍微不同类型的搜索功能,它只允许你搜索在当前缓冲区中可以找到的文本,而不是isearch搜索任何文本是否恰好存在的能力是否在当前缓冲区中。

也许isearch-mode可以适应你想做的事情,但不管怎样,我认为你必须写一些elisp代码。也许你可以在isearch-mode中实现你的新搜索模式,可以打开和关闭,同样可以打开和关闭区分大小写;并且可以默认设置,这与默认情况下可以打开或关闭区分大小写的方式相同。

答案 3 :(得分:0)

如果您在增量搜索期间输入拼写错误,则只需按退格键以纠正拼写错误。

  • 我们开始增量搜索并搜索“keyz”
  • “keyz”显示在搜索回显区域中,“keywords”中的“key”部分显示为
  • 我们按退格键
  • 我们按s
  • 找到“密钥”并高亮显示

答案 4 :(得分:0)

与大多数其他答案一样,我只是指出了另一个有助于缓解所述问题的功能。如果您在糟糕的角色之后继续输入几个本来不错的角色,那么这个特别有用。

Me 是用于编辑isearch字符串的绑定,并且在当前字符串没有匹配的情况下,它更有助于将点指向第一个不匹配的字符。

因此,如果你输了一个小错误,你可以快速键入 Me ,修正错误,然后输入 RET 以使用更正后的搜索字符串返回isearch。 / p>