我不是一个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
不幸的是,上面显示的代码片段移动指向上面一行中“搜索此”的第一次出现。我希望点在第二个“搜索这个”字符串的开头结束,当前包含点,因为它是最接近的字符串。
答案 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)
正则表达式模式"\="
与当前点匹配。如果你将它融入到你的表达中,那就应该得到你所需要的东西。