import vim, sys, itertools import string TRANSLATE_QUOTES = string.maketrans('"\'', '\'"') def VimReturn(value): vim.command("return " + repr(value).translate(TRANSLATE_QUOTES)) try: import json def VimReturn(value): vim.command("return " + json.dumps(value)) except ImportError: from ck_3p import json def VimReturn(value): vim.command("return " + json.write(value)) all_words = sorted(set(itertools.chain(*(line.split() for line in vim.current.buffer)))) def Foo(findstart, base, only_return_strings=False): if int(findstart): print "FindStart" else: print all_words matches = [i for i in all_words if i.startswith(base)] results = [] for i, m in enumerate(matches): if only_return_strings: results.append(m) else: vim.command("call complete_add(%s)" % json.dumps({ "word" : m, "menu" : "(menu)|%s|" % m.upper(), "info" : "\n".join(vim.current.buffer[i:5+i]) })) if vim.eval("complete_check()") != "0": return # results.append({ "word" : m, "menu" : "|%s|" % m.upper(), "info" : "\n".join(vim.current.buffer[i:5+i]) }) return results cmds = [""" function! Foo(findstart, base) py VimReturn(Foo(vim.eval("a:findstart"),vim.eval("a:base"))) endfunction """, """ function! Foo2(cmd1, cmd2, pos) py VimReturn(Foo(0, vim.eval("a:cmd1"), only_return_strings=True)) endfunction """, """ let a=input("Hello ", "", "customlist,Foo2") """] for cmd in cmds: vim.command(cmd) vim.command("set completefunc=Foo")