Vim说缺少:endif',但我确定它在那里

时间:2015-05-22 20:11:25

标签: vim vim-plugin

考虑以下vim代码。

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部分内正确发送错误信息?

2 个答案:

答案 0 :(得分: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>

答案 1 :(得分:2)

if s:bar()希望s:bar()返回一个值,但s:bar()不会。因此&#34;缺失:endif&#34;。

另一方面,您也没有import vim获取Python代码(不确定是否仍然需要)。

更新: 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