用python编写completefunc

2024-10-06 09:10:16 发布

您现在位置:Python中文网/ 问答频道 /正文

所以,我试图在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

{return}然而}抱怨^。如果我省略python,就会得到一个unknown function complete_nvim错误。在

我也尝试过这样的结局:

^{pr2}$

(例如,删除def complete_nvim chunk,但当我试图从函数外部返回时,这会失败(或者python是这么想的)。在

我也尝试过将python函数放在初始化函数中,然后尝试set completefunc=complete_nvim,但是对于未知函数,这也失败了。在


Tags: 函数import列表basereturnosdeffunction
1条回答
网友
1楼 · 发布于 2024-10-06 09:10:16

在深入研究了一些插件之后,我得出了这样的结论: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

相关问题 更多 >