我正在使用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,有人能告诉我应该怎样做以避免这些错误吗?
答案 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有错误。