使用Perl-Script中的信息调用自定义vim完成菜单

时间:2013-01-25 10:48:49

标签: perl vim

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

现在,让我说我有这段代码:

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

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

我的想法是,因为我使用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-script获得的结果?

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

1 个答案:

答案 0 :(得分:3)

可以在此Vim Tips Wiki article中找到有关从Vim调用嵌入式Perl代码的详细信息和提示。您的尝试已经非常接近,但要从Perl返回内容,您需要使用Vim的Perl API:

VIM::DoCommand "let retVal=". aMeaningfullThingToReturn

对于完成菜单,您的Perl代码需要返回符合:help complete-items所述格式的Vim对象列表。 :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