How do I get the value returned from a function in Python & Vimscript?

孤街醉人 提交于 2019-12-20 01:52:07

问题


I'm using Python to write a vim plugin, but there's something wrong when dealing with 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

Here, there're always errors like "Undefined variable" and "Invalid expression" when I call Post(), but line2 always succeeds executing.

I've not learned Vimscript before, could anybody tell me what I should do to avoid those errors?


回答1:


Since you have now added your whole function...

The reason you get an undefined variable and Invalid expression in Login() is because the scope of client ends at EOF. At the return line vim does not know about client because it is only defined within the python block.

What you could do is just define a python function that does this for you inside Post(). Something like the following.

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

NOTE: Since everything is passed to the same instance of python you can just define Login() as a normal python function outside of the vim function and do what ever you want later. It does not need to be in the same python block.


Old Answer

You need to put the symbol EOF at the end of your python sections. Otherwise vim keeps feeding the commands to python.

python << EOF

The appropriate section from the vim help :h python-commands is copied below.

:[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.

Your {endmarker} is EOF. However since you do not show the whole function I am not sure where you need to put EOF


As for your code.

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

This line is correct. If and only if Login() executes without error. However with the snippet you show Login has errors.



来源:https://stackoverflow.com/questions/16756613/how-do-i-get-the-value-returned-from-a-function-in-python-vimscript

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!