evil-search-word-forward 搜索一个$或_开头的词失败?

现象:在js2-mode中按下*(evil-search-word-forward),如果是foo_bar,则可以正确搜索到下一个foo_bar,如果是_foo,则显示"\<_foo\>: pattern not found"。在web-mode下则可以正确搜索foo_bar

而:describe-syntax显示js2-mode_symbol-constituentweb-mode下则是word-constituent。但是evil-search-word-forward的描述是Search forward for symbol under point.,为何_开头的symbol就不行呢?

当然有个workaround:在visual-state下选中_foo,然后按*搜索的就是_foo而非\<_foo\>了,可以凑合用。


结论:

结合四楼的答案研究发现,evil-search-word-forward的参数&optional COUNT SYMBOL,按*调用时都不填,那么COUNT函数里会给默认值1,SYMBOL没处理,直接拿来用就会是nil(这里叫symbolp会清楚一点),所以文档其实骗了我,直接调evil-search-word-forward会搜word而非symbol,而且把_这个symbol-contituent放进来了,搜的却是word,因此导致搜不到。

大部分人不会碰到这个问题,因为*会搜索\<foo\>而非\<_foo\>,我按下*时会把_包括进来是因为这句配置:(defalias #'forward-evil-word #'forward-evil-symbol)

于是除了按四楼的答案(evil-search-word nil nil t)之外,也可以定义为(evil-search-word-forward 1 t),都会显示搜索的是\_<_foo\_>(注意其中_foo是我们的单词),而之前错误地搜word时则显示\<_foo\>,由此可以推断emacs中表示word的正则是\<bar\>,symbol则是\_<bar\_>

evil-regexp-search 设置成nil 不使用正则试试

不行。。。。

我的配置:

(defun evil-search-symbol-backward ()
  (interactive)
    (evil-search-word t nil t))

(defun evil-search-symbol-forward ()
  (interactive)
    (evil-search-word nil nil t))

(define-key evil-motion-state-map "#" #'evil-search-symbol-backward)
(define-key evil-motion-state-map "*" #'evil-search-symbol-forward)

上边的配置用了很久了,刚看了下 evil-search-word{-forward} 的定义,应该都可以,关键是末尾的 SYMBOL 参数:

  • evil-search-word-forward

    evil-search-word-forward is an interactive compiled Lisp function in ‘~/toolkit/emacs.d/elpa-26.0.50/evil-20170612.100/evil-commands.el’.

    (evil-search-word-forward &optional COUNT SYMBOL)

    Search forward for symbol under point.

  • evil-search-word

    evil-search-word is a compiled Lisp function in ‘~/toolkit/emacs.d/elpa-26.0.50/evil-20170612.100/evil-search.el’.

    (evil-search-word FORWARD UNBOUNDED SYMBOL)

    Search for word near point. If FORWARD is nil, search backward, otherwise forward. If SYMBOL is non-nil then the functions searches for the symbol at point, otherwise for the word at point.

1 个赞