我编写了一个分析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获得的结果?
我希望有人知道我的意思。任何帮助,将不胜感激。
答案 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