Vim:单行报告错误

时间:2017-05-22 18:48:01

标签: vim

当Vimscript函数内部出现错误时,Vim会以下列格式报告错误:

Error detected while processing function <SNR>My_Function:
line    X:
EXXX: Error Message Here

这非常令人分心。理想情况下,我希望以某种方式格式化以适合单行,但如果这不可能,那么我只想要最后一行EXXX与实际错误。有可能改变这个吗?

2 个答案:

答案 0 :(得分:0)

我不喜欢这种行为,但它是如何,并且不能改变。

您的函数需要:catch任何错误,并将其转换为所需的单行错误消息:

function! s:My_Function()
    try
        " commands here
    catch /^Vim\%((\a\+)\)\=:/
        echohl ErrorMsg
        echomsg substitute(v:exception, '^\CVim\%((\a\+)\)\=:', '', '')
        echohl None
    endtry
endfunction

这是大多数插件处理它的方式。但是,该行为并不完全类似于内置命令:错误被有效地“吞噬”,并且尽管有错误,仍将执行后续命令(例如,在序列cmd1 | call <SID>My_Function() | cmd3中)。对于大多数用途来说这是可以的,大多数用户可能甚至都没有意识到这一点。

更好的选择

要使自定义命令的行为类似于内置命令,需要将错误消息返回到自定义命令或映射,并:echoerr在那里。在我的ingo-library plugin中,我有相应的辅助函数:

function! s:My_Function()
    try
        " commands here
        return 1    " Success
    catch /^Vim\%((\a\+)\)\=:/
        call ingo#err#SetVimException()
        return 0    " Failure, use stored error message.
    endif
endfunction

if ! <SID>My_Function() | echoerr ingo#err#Get() | endif

答案 1 :(得分:0)

还有另一种解决问题的方法:可以解码错误消息。

在我的lh-vim-lib中,我定义了a function解码最后一条错误消息并在qf窗口中显示结果。

如果安装了lh-vim-lib,你需要添加类似

的内容
command! WTF call lh#exception#say_what()

.vimrc

这个功能本身受到了https://github.com/tweekmonster/exception.vim的启发,不同之处在于我已经使用了我已经在我的库插件中实现的内容,以便:

  • 支持本地化消息
  • 支持自动加载功能,即使#不在&isk中(这可能取决于与当前文件类型/缓冲区关联的设置)
  • 尽可能少的循环
  • 使用我的logging,单元测试和DbC框架对代码进行分解。

在我为了演示我的Dbc框架而录制的截屏视频结束时,我使用:WTF以人性化的方式显示最后一个错误。