如何从Python中获取函数返回的值& Vimscript中?

时间:2013-05-26 05:54:28

标签: python vim vim-plugin

我正在使用Python编写vim插件,但在处理Vimscript时出现了问题。

function! Login()  
python << EOF    
import vim, weibo
appkey = 'xxx'
appsecret = 'xxxxx'
callback_url = 'xxxxxxxx'
acs_token = 'xxxxx'
expr_in = 'xxxx'
client = weibo.APIClient(app_key=appkey, app_secret=appsecret,\
         redirect_uri=callback_url)
client.set_access_token(acs_token, expr_in)
del vim.current.buffer[:]  
EOF    
return client
endfunction


function! Post()  
python << EOF
import vim, weibo
try: 
    vim.command("let client = Login()")  # line1
    client.post.statuses__update(status="hello") # line2
except Exception, e:
    print e
EOF
endfunction

这里,当我调用Post()时,总会出现“Undefined variable”和“Invalid expression”之类的错误,但是line2总是成功执行。

我以前没有学过Vimscript,有人能告诉我应该怎样做以避免这些错误吗?

1 个答案:

答案 0 :(得分:3)

由于您现在已经添加了整个功能......

您在Login()中获得未定义变量和无效表达式的原因是因为客户端的范围在EOF结束。在返回行中,vim不知道client,因为它只在python块中定义。

你可以做的只是定义一个python函数,在Post()内为你做这个。如下所示。

python << EOF
import vim, weibo
def Login():
    appkey = 'xxx'
    appsecret = 'xxxxx'
    callback_url = 'xxxxxxxx'
    acs_token = 'xxxxx'
    expr_in = 'xxxx'
    client = weibo.APIClient(app_key=appkey, app_secret=appsecret,\
             redirect_uri=callback_url)
    client.set_access_token(acs_token, expr_in)
    del vim.current.buffer[:]  
    return client
EOF

function! Post()  
python << EOF
try: 
    client = Login()
    client.post.statuses__update(status="hello")
except Exception, e:
    print e
EOF
endfunction

注意:由于所有内容都传递给同一个python实例,因此您可以将Login()定义为vim函数之外的普通python函数,并在以后执行您想要的操作。它不需要在同一个python块中。


旧答案

您需要将符号EOF放在python部分的末尾。否则vim会继续将命令提供给python。

python << EOF

vim帮助:h python-commands中的相应部分将复制到下方。

:[range]py[thon] << {endmarker}
{script}
{endmarker}
            Execute Python script {script}.

{endmarker} must NOT be preceded by any white space.  If {endmarker} is
omitted from after the "<<", a dot '.' must be used after {script}, like
for the |:append| and |:insert| commands.
This form of the |:python| command is mainly useful for including python code
in Vim scripts.

您的{endmarker}EOF。但是,由于您没有显示整个功能,因此我不确定您需要将EOF

放在何处

至于你的代码。

vim.command("let obj = Login()")

这条线是正确的。当且仅当Login()执行时没有错误。但是,使用该代码段显示Login有错误。