1

perlファイルを分析するスクリプトを書きました(管理者がPPIのインストールを望まないサーバーなどで使用されるため、PPIはまったくありませんが、それについては話さないでください)。

さて、私がこのコードを持っているとしましょう:

my $object = MySQL->new();
my $ob2 = $object;
$ob2->    

(MySQL はモジュールの 1 つです)。私のスクリプトは、$ob2 が MySQL-Object であることを正しく識別し、それがどこから来たのかを確認し、そのモジュールで見つかったサブルーチンのリストを返します。

私の考えは、編集にvimを使用しているので、これは「CTRL-n」補完の非常にクールな方法である可能性があるというものでした。

そうするとき...

$ob2->[CTRL-n]

これは、私の Perl スクリプトを開き、それにいくつかのパラメーターを与える CTRL-n-Box を示しています (必要なのは、現在の行、カーソル位置、および vim にあるファイル全体)。

私はすでにvim-perlのようなものを見つけました。これにより、次のようなものを書くことができます

if has('perl')
    function DefPerl()
perl << EOF
    use MyModule;
    return call_to_my_function(); # returns all the methods from the object for example
EOF
    endfunction
    call DefPerl()
endif

しかし、どういうわけかこれは実行されません(テストのためにシステムコールでファイルに何かを書き込もうとしました)...

つまり、要するに:

ここで誰かがそれを達成する方法を知っていますか? 完全なファイルコードとvimが実際にある行と位置でCTRL-nを押してvimからperl関数を呼び出し、perlスクリプトから取得した結果で完了メニューを開きますか?

誰かが私がここで何を意味するのか知っていることを願っています. どんな助けでも大歓迎です。

4

1 に答える 1

3

埋め込み Perl コードを Vim から呼び出すための詳細とヒントは、このVim Tips Wiki 記事にあります。あなたの試みはすでにかなり近いですが、Perl から何かを返すには、Vim の Perl API を使用する必要があります。

VIM::DoCommand "let retVal=". aMeaningfullThingToReturn

補完メニューの場合、Perl コードは、 で説明されている形式に従う Vim オブジェクトのリストを返す必要があります:help complete-items。そして:help complete-functions、完了をトリガーする方法を示します。'completefunc'基本的に、関数を設定してトリガーする挿入モード マッピングを定義します<C-x><C-u>。開始するためのスケルトンは次のとおりです。

function! ExampleComplete( findstart, base )
    if a:findstart
        " Locate the start of the keyword.
        let l:startCol = searchpos('\k*\%#', 'bn', line('.'))[1]
        if l:startCol == 0
            let l:startCol = col('.')
        endif
        return l:startCol - 1 " Return byte index, not column.
    else
        " Find matches starting with a:base.
        let l:matches = [{'word': 'example1'}, {'word': 'example2'}]
        " TODO: Invoke your Perl function here, input: a:base, output: l:matches
        return l:matches
    endif
endfunction

function! ExampleCompleteExpr()
    set completefunc=ExampleComplete
    return "\<C-x>\<C-u>"
endfunction
inoremap <script> <expr> <Plug>(ExampleComplete) ExampleCompleteExpr()
if ! hasmapto('<Plug>(ExampleComplete)', 'i')
    imap <C-x><C-z> <Plug>(ExampleComplete)
endif
于 2013-01-25T11:14:34.690 に答える