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