1

我正在尝试在 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
4

1 回答 1

4

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

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

于 2013-03-26T09:04:09.193 回答