1

そのため、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ます。を省略するとpythonunknown 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 に答える