2015-05-22 80 views
2

考慮下面的vim代碼。Vim說'missing:endif',但我確定它有

function! s:foo() 
    if s:bar() 
     let a = 1 
    endif 
endfunction 

function! s:bar() 
python << EOF 
vim.command('echoerr "blabla"') 
EOF 
endfunction 

command! Foo call s:foo() 
map <F7> :Foo<CR> 

打開vim會話並按F7。 Vim將會提示E171: Missing :endif。 這是怎麼可能的,我怎麼才能正確地發送一個錯誤信息在Python部分?

回答

4

在函數裏,:echoerr作品像:throw並引發異常。正常的控制流程中斷,Vim抱怨沒有看到:endif:echoerr在函數內幾乎沒有用,也因爲顯示了整個多行堆棧跟蹤。

我會通過只設置v:errmsg(或任何其他自定義變量或標記)解決這個問題,然後檢查,並直接在你的函數結束時報告錯誤:

function! s:foo() 
    let v:errmsg = '' 
    if s:bar() 
     let a = 1 
    endif 
endfunction 

function! s:bar() 
python << EOF 
vim.command('let v:errmsg = "blabla"') 
EOF 
endfunction 

command! Foo call s:foo() | if ! empty(v:errmsg) | echoerr v:errmsg | endif 
map <F7> :Foo<CR> 
+0

在一個側面說明:' !empty(string)'效率很低,因爲它必須首先將'string'轉換爲列表。考慮使用'len(string)'而不是'string!=#'''。這是一個普遍的錯誤...... – lcd047

+0

對不起,'len(string)'應該是'strlen(string)'。 – lcd047

+0

@ lcd047:你真的測過它了嗎?我沒有看到任何顯着的差異,我不認爲會有明確的轉換到列表。哦,對於字符串,'len()'和'strlen()'是相同的。 –

2

if s:bar()預計s:bar()返回一個值,但s:bar()沒有。因此「缺少:endif」。

在附註中,您還沒有爲Python代碼import vim(不確定這仍然是必需的)。

更新:echoerr也提高了vim.error。試試這個:

function! s:bar() 
    python <<EOF 
import vim 

vim.command('normal \<Esc>') 
vim.command('echohl ErrorMsg') 
vim.command('echomsg "blabla"') 
vim.command('echohl None') 
EOF 
    return 1 
endfunction 
相關問題