2013-05-26 4 views
3

나는 vim 플러그인을 작성하기 위해 파이썬을 사용하고 있지만, Vimscript를 다룰 때 문제가있다. 여기파이썬 및 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()를 호출 할 때 같은 오류가있어,하지만 2 호선은 항상 실행 성공합니다.

전에 Vimscript를 배웠습니다. 오류를 피하기 위해 내가 무엇을해야하는지 말해 줄 수 있습니까? 당신은 지금 당신의 전체적인 기능을 추가 한 이후

답변

3

...

클라이언트의 범위는 EOF에 종료 때문에 Login()에 정의되지 않은 변수와 잘못된 표현을 얻는 이유입니다. 리턴 라인에서 vim은 파이썬 블록 내에서만 정의되기 때문에 client에 대해 알지 못합니다.

당신이 할 수있는 일은 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 

참고 : 모든 것이 파이썬의 동일한 인스턴스에 전달되기 때문에 그냥 정력 기능 이외의 일반 파이썬 함수로 Login()를 정의하고 나중에 원하는 무엇도 할 수 있습니다. 동일한 파이썬 블록에있을 필요는 없습니다.


올드 답변

당신은 당신의 파이썬 섹션의 끝에 기호 EOF을 넣어해야합니다. 그렇지 않으면 vim은 파이썬에 명령을 계속 제공합니다.

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()이 오류없이 실행되는 경우에만. 그러나 스 니펫을 사용하면 로그인에 오류가 있음을 보여줍니다.

+0

미완성 코드에 대해 죄송합니다. 사실 내 함수에 {endmarker}가 있습니다. 질문을 작성할 때 추가하는 것을 잊었습니다. – yakiang

+0

@YakiangZhong 전체 기능을 게시 할 수 있습니까? 왜냐하면 지금 당장 당신의 코드에 유일한 문제가 있기 때문입니다. – FDinoff

+0

두 가지 전체 기능이 있습니다. – yakiang

관련 문제