4

我正在使用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(),但 line2 总是成功执行。

我以前没有学过 Vimscript,谁能告诉我应该怎么做才能避免这些错误?

4

1 回答 1

3

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

你得到一个未定义的变量和 Invalid 表达式的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 有错误。

于 2013-05-26T06:02:04.123 回答