在emacs lisp中,有没有办法搜索与当前点重叠的字符串匹配的文本?

时间:2011-05-31 02:12:20

标签: search emacs elisp

我不是一个lisp专家,所以请原谅一个相当新手的问题。

我正在写一个相当简单的elisp函数,试图在与当前光标位置相同的行上找到一个短字符串。现在编写的代码的相关部分是:

(let ((matchpos (search-forward myword (line-end-position) t)))
  (if matchpos
      (goto-char (- matchpos (length myword)))
    (setq matchpos (search-backward myword (line-beginning-position) t)))
  ...

这大部分都没有问题,但是找不到包含当前光标位置的字符串。显然,向后搜索只查找在点之前结束的字符串。事实上,我可以通过在执行向后搜索之前到达行的末尾来解决这个特定问题,但我很好奇是否可以修改此行为。

搜索后向是否有任何变体与点之前启动的任何字符串相匹配?

编辑:也许一个例子是有序的,因为那些回答似乎并不完全理解这个问题。假设我正在搜索字符串“search this”,我的行看起来像这样(由*标记的点):

I want to search this string, I have code to search t*his string

不幸的是,上面显示的代码片段移动指向上面一行中“搜索此”的第一次出现。我希望点在第二个“搜索这个”字符串的开头结束,当前包含点,因为它是最接近的字符串。

3 个答案:

答案 0 :(得分:3)

search-forward的第二个参数限制搜索,所以要搜索当前行的字符串,转到行的开头,并使用行的结尾作为绑定:

(beginning-of-line)
(search-forward myword (line-end-position))

如果您不想移动点,请使用save-excursion保留它:

(save-excursion
  (beginning-of-line)
  (search-forward myword (line-end-position)))

答案 1 :(得分:1)

我建议您将光标向右移动与您搜索的字符串长度相对应的字符数(可能减去1,具体取决于您是否希望立即匹配点的右侧) )。

类似的东西:

(goto-char (min (end-of-line-position)
                (+ (point) (length myword))))
(setq matchpos (search-backward myword (line-beginning-position) t))

这会有效,因为您已将这一点移开search-backword

另一个解决方案是转到行的开头并反复向前搜索,直到你通过该点。

答案 2 :(得分:0)

正则表达式模式"\="与当前点匹配。如果你将它融入到你的表达中,那就应该得到你所需要的东西。