Vim:如何编写一个搜索当前缓冲区的函数?

时间:2013-03-26 08:46:55

标签: vim

我正在尝试在Vim中编写一个函数,在当前缓冲区中搜索某个模式并返回它。但是,我失败了。基本上,我想要的是一个函数,它返回我正在使用的文件的(PHP)命名空间。命名空间在文件本身中定义:

namespace Foo\Bar;

我想要的是一个将Foo\Bar部分作为字符串返回的函数。即像/namespace\s\([^;]\+\)一样搜索并返回第一个子匹配的内容。

编辑:这是我建立的功能,感谢我的帮助:

func! PhpNamespace()
    let l:lnr = 0
    while l:lnr < line('$')
        let l:str = matchstr(getline(l:lnr), '^\s*namespace\s\+[^;]\+')
        if len(l:str)
            return substitute(l:str, '^\s*namespace\s\+', '', '')
        endif
        let l:lnr = l:lnr + 1
    endwhile

    return ''
endfunc

1 个答案:

答案 0 :(得分:4)

一种选择是使用searchpos(),它可以让你获得起始位置;然后你需要自己提取文本。这是快速而简单的,特别是如果您需要从光标位置向前/向后搜索。使用'n'标志,光标位置不会改变。否则,您必须保存并恢复光标位置(getpos('.')setpos('.', saved_cursor))。

对于您的问题,看起来命名空间声明可能位于文件的开头,并且仅限于一行。然后,您还可以在循环中获得带有getline(lnum)的单独行,并使用matchstr()提取文本,并在获得后退出循环。