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

1つのオプションは、を使用するsearchpos()ことです。これにより、開始位置が取得されます。次に、自分でテキストを抽出する必要があります。これは、特にカーソル位置から前後に検索する必要がある場合に、すばやく簡単に実行できます。フラグを使用する'n'と、カーソル位置は変更されません。getpos('.')それ以外の場合は、カーソル位置( 、 )を保存して復元する必要がありますsetpos('.', saved_cursor)

あなたの問題では、名前空間宣言はファイルの先頭にある可能性が高く、1行に制限されているようです。次に、ループ内の個々の行を取得getline(lnum)し、を使用してテキストを抽出し、ループを取得したらループから抜け出すこともできmatchstr()ます。

于 2013-03-26T09:04:09.193 に答える