考虑以下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部分内正确发送错误信息?
答案 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