前言
我知道有match()、matchstr()等等,但是似乎没有函数返回字符串中的所有匹配(不是子匹配)。处理matchstrpos()是可能的,但是每次都有很大的开销解析正则表达式。这就是为什么我将split()函数用于与性能相关的任务。
目标
我需要找到缓冲区中的所有单词,其中至少有两个字符以“文本”开头。这个模式很简单。例如,要查找以"f“开头的所有单词,我使用f\w\+,但不知道如何逆模式传递到split()函数。现在我使用\W,然后使用filter()函数过滤单词。我认为算法可能会更快。
当前代码
function! completion#filter(base, lastIndex, i, word)
return a:word[1] != "" && a:word[0:a:lastIndex] ==# a:base
" also tried this
" return a:word[1] != "" && strridx(a:word, a:base, 0) == 0
endfunction
let words = split(join(getline(1, "$"), "\n"), '\W\+')
call filter(words, funcref("completion#filter", [a:base, len(a:base) - 1]))发布于 2017-12-29 15:09:59
下面的解决方案是从这里获得的:https://vi.stackexchange.com/questions/4305/is-it-possible-to-get-the-matched-string-after-calling-search
请考虑在那里留下一个向上的选票!
最基本的技巧是:s\= (:h :s\=)与:s//n (:h :s)相结合。
:s\=允许我们在:s//命令中计算vimscript,而n标志允许我们跳过actuall。
因此,在最简单的形式下,它可以像这样使用:
let b = [] | execute ':keeppatterns %s/f\w\+/\=add(b, submatch(0))/gn' | echo b如您所见,您现在有了一个包含所有搜索结果的列表。
在上面的链接中,您可以找到一个以函数作为参数的通用解决方案。
https://stackoverflow.com/questions/48023309
复制相似问题