我正在尝试在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
答案 0 :(得分:4)
一种选择是使用searchpos()
,它可以让你获得起始位置;然后你需要自己提取文本。这是快速而简单的,特别是如果您需要从光标位置向前/向后搜索。使用'n'
标志,光标位置不会改变。否则,您必须保存并恢复光标位置(getpos('.')
,setpos('.', saved_cursor)
)。
对于您的问题,看起来命名空间声明可能位于文件的开头,并且仅限于一行。然后,您还可以在循环中获得带有getline(lnum)
的单独行,并使用matchstr()
提取文本,并在获得后退出循环。