1

我写了一个分析 perl 文件的脚本(完全没有 PPI,因为它将在管理员不希望安装 PPI 的服务器上使用等等,但我们不要谈论这个)。

现在,假设我有这段代码:

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

(MySQL 是我们的模块之一)。我的脚本正确地识别出 $ob2 是一个 MySQL-Object 并查看它的来源,然后返回该模块中找到的子列表。

我的想法是,因为我使用 vim 进行编辑,这对于“CTRL-n”-Completetion 来说可能是一种非常酷的方式。

那么,当...

$ob2->[CTRL-n]

它显示了 CTRL-n-Box,它打开了我的 Perl-Script 并为其提供了一些参数(我需要:我实际所在的行、光标位置和 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

但不知何故,这并没有得到执行(我只是为了测试而尝试使用系统调用将某些内容写入文件)......

所以,简而言之:

这里有人知道如何实现吗?通过使用完整的文件代码按 CTRL-n 从 vim 调用 perl 函数,并且 vim 行实际上在和位置,然后打开一个带有从 perl 脚本获得的结果的完成菜单?

我希望有人知道我在这里的意思。任何帮助,将不胜感激。

4

1 回答 1

3

从 Vim 调用嵌入式 Perl 代码的详细信息和技巧可以在这篇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 回答