当我在一次执行中搜索不同的字符串时,例如像<。p>
/\(yadda\|schmadda\)
工作正常。但与标准搜索/yadda
相比,长文件的速度极慢。
有更快的方法吗?
答案 0 :(得分:2)
通过/
进行搜索的替代方法是使用:grep
和quickfix
列表。使用%
作为当前文件名的快捷方式。
:grep "yadda\\\|schmadda" %
然后通过:cnext
和:cprev
浏览列表,或通过:copen
在窗口中打开列表。我使用Unimpaired将]q
和[q
映射到:cnext
和:cprev
。
要获得更快的速度,尤其是跨多个文件,您可以将Vim设置为使用ag或ack,而不是通过'grepprg'
选项使用常规grep。例如:set grepprg=ag\ --nogroup\ --nocolor
。
如果您的系统没有grep,或者您更愿意使用Vim的风格正则表达式,则可以使用:vimgrep
替代:grep
。用法示例:
:vimgrep/\(yadda\|schmadda\)/ %
应该注意:vimgrep
通常比:grep
慢。
有关详细信息,请参阅以下内容:
:h :grep
:h quickfix
:h c_%
:h :cnext
:h :cope
:h 'grepprg'
:h :vimgrep
答案 1 :(得分:1)
Vim 7.4引入了一个新的基于NFA的正则表达式引擎。虽然通常认为这种情况更快,但可能会出现这种情况。
您可以尝试通过
切换到旧引擎:set regexpengine=1
您还可以通过特殊的\%#=1
原子选择模式中的引擎。
PS:长文件究竟是什么意思?线长,总体尺寸大?
答案 2 :(得分:1)
我想指出一些尚未提及的内容。将grep用于像你这样的用例时,这将是一个更好的工作流程:
:grep yadda %
:grepadd schmadda %
另请注意,还可以使用:lgrep
和:lgrepadd
来代替:grep
&amp; :grepadd
使用位置列表(本地窗口)而不是quickfix列表(全局列表),尤其是在您只想在当前文件中搜索的情况下。
答案 3 :(得分:0)
我有同样的问题。在尝试找到解决方案后,我开始使用Ack.vim。 Ack.vim很快。