我试图使用外部命令来处理Vim中一系列行的某些格式,但似乎无法找到处理外部命令错误的方法.
这些错误通常是在shell返回0以外的内容时,它会提示Vim显示以下内容:
shell returned 1
Run Code Online (Sandbox Code Playgroud)
除此之外,它还将我想要格式化的行替换为错误的实际消息.如果我这样做,也会发生这种情况:
:set equalprg=myformatter\ --format-flag\
Run Code Online (Sandbox Code Playgroud)
如何安全地捕获外部命令的错误并显示错误消息是什么?
注意:这不是关于如何使用外部命令格式化Vim中的某些文本的问题,而是如何捕获错误并显示消息.
可能有更好的方法来做到这一点,但我得到了这个粗略的草案(请参阅下面的 equalprg)。它基本上会重新映射gq
,覆盖它以打印错误,然后撤消它。
set formatprg=~/test.sh
nnoremap gq :setl opfunc=FormatPrg<cr>g@
fun! FormatPrg(...)
silent exe "'[,']!".&formatprg
if v:shell_error == 1
let format_error = join(getline(line("'["), line("']")), "\n")
undo
echo format_error
end
endfun
Run Code Online (Sandbox Code Playgroud)
这就是~/test.sh
:
echo "error!!
alskdjf alskdf
alskdj flaskdjf" 1>&2
exit 1
Run Code Online (Sandbox Code Playgroud)
我才发现我根本没有回答你的问题哈哈。我的解决方案equalprg
甚至不太优雅,但它可能适合您的需求。要使用它,您必须设置 equalprg。注释掉 nnoremap 行,或者set indentexpr=EqualPrg()
如果您想在外部工具和内部缩进格式化程序之间来回切换。
set equalprg=~/test.sh
nnoremap = :setl opfunc=EqualPrg<cr>g@
fun! EqualPrg(...)
if &equalprg != ""
silent exe "'[,']!".&equalprg
else
set indentexpr=
exe "norm! `[=`]"
set indentexpr=EqualPrg()
endif
if v:shell_error == 1
let format_error = join(getline(line("'["), line("']")), "\n")
undo
echo format_error
endif
endfun
Run Code Online (Sandbox Code Playgroud)