所以,我正在尝试在python中实现自定义completefunc
,但是我无法正确地获取代码。我正在为它提供(最初)一个来自固定目录的文件名列表(这将很快被替换为不同的列表)。
我最近的尝试是这样的:
function! CompleteNVIM(findstart,base)
python <<
import vim
import os
def complete( base ):
matches = [ "'"+os.path.splitext(x)[0]+"'" for x in os.listdir('notes') ]
vim.command( "let p = [" + ",".join(matches) + "]" )
return vim.eval('p')
def findstart():
r,c = vim.current.window.cursor
l = vim.current.line
while c>0 and l[c-1] != '[':
c=c-1
return c
def complete_nvim( findstart,base ):
if 1==findstart:
return findstart()
else:
return complete( base )
.
return python complete_nvim(a:findstart,a:base)
endfunction
set completefunc=CompleteNVIM
然而,回复抱怨no variable named python
。如果我省略python
,则会收到unknown function complete_nvim
错误。
我也试过这个结局:
if 1==findstart:
return findstart()
else:
return complete( base )
.
endfunction
(即删除def complete_nvim chunk
,但失败了,因为我正试图从函数外部返回(或者python认为)。
我也尝试将python函数放在初始化函数中,然后尝试set completefunc=complete_nvim
,但这也会因未知函数而失败。
答案 0 :(得分:0)
经过一些插件的挖掘后,我得出的结论是vim中的python函数不能直接返回值。
解决方法是使用全局变量,如下所示:
def complete( base ):
matches = [ "'"+os.path.splitext(x)[0]+"'" for x in os.listdir('notes') ]
vim.command( "let g:result = [" + ",".join(matches) + "]" )
...
let g:result = []
python complete_nvim(vim.eval('a:findstart'),vim.eval('a:base'))
return g:result
还要注意在传递参数
时需要使用vim.eval