在python中编写completefunc

时间:2013-08-12 16:17:33

标签: python vim

所以,我正在尝试在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,但这也会因未知函数而失败。

1 个答案:

答案 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