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

Vim:如何编写搜索当前缓冲区的函数?,vim,Vim,我试图在Vim中编写一个函数,搜索当前缓冲区中的某个模式并返回它。但是,我失败得很惨。基本上,我想要的是一个返回我正在处理的文件的PHP名称空间的函数。命名空间在文件本身中定义: namespace Foo\Bar; 我想要的是一个以字符串形式返回Foo\Bar部分的函数。例如,像/namespace\s\[^;]\+\这样搜索并返回第一个子匹配的东西 编辑:这是我得到帮助后构建的函数: func! PhpNamespace() let l:lnr = 0 while l:ln

我试图在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
一种选择是使用searchpos,它可以获得起始位置;然后您需要自己提取文本。这是快速而简单的,尤其是当您需要从光标位置向前/向后搜索时。使用“n”标志时,光标位置不会改变。否则,您必须保存并恢复光标位置getpos'',setpos'',saved_cursor

对于您的问题,名称空间声明可能位于文件的开头,并且仅限于一行。然后,您还可以使用getlinelnum在循环中获取单独的行,并使用matchstr提取文本,一旦获得了文本,就可以中断循环。

一个选项是使用searchpos,它可以获取开始位置;然后您需要自己提取文本。这是快速而简单的,尤其是当您需要从光标位置向前/向后搜索时。使用“n”标志时,光标位置不会改变。否则,您必须保存并恢复光标位置getpos'',setpos'',saved_cursor


对于您的问题,名称空间声明可能位于文件的开头,并且仅限于一行。然后,您还可以使用getlinelnum在循环中获取单独的行,并使用matchstr提取文本,一旦找到了,就可以中断循环。

太好了!你的解决方案在我看来很好;张贴它的荣誉;你是个职业选手!伟大的你的解决方案在我看来很好;张贴它的荣誉;你是个职业选手!