1

所以,我试图completefunc在 python 中实现一个自定义,但是我无法让代码正确接口。我在它为我提供(最初)来自固定目录的文件名列表之后(这将很快被不同的列表替换)。

我最近的尝试是这样的:

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,但这也因未知函数而失败。

4

1 回答 1

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还要注意传递参数时需要使用

于 2013-08-13T09:42:28.490 回答