微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

shell – Vim:使用外部命令并处理错误

我试图使用外部命令来处理Vim中一系列行的某些格式,但似乎无法找到处理外部命令错误方法.

这些错误通常是在shell返回0以外的内容时,它会提示Vim显示以下内容

shell returned 1

除此之外,它还将我想要格式化的行替换为错误的实际消息.如果我这样做,也会发生这种情况:

:set equalprg=myformatter\ --format-flag\

如何安全地捕获外部命令的错误显示错误消息是什么?

注意:这不是关于如何使用外部命令格式化Vim中的某些文本的问题,而是如何捕获错误显示消息.

解决方法

可能有更好的方法来做到这一点,但我得到了这个粗略的草案(请参阅下面的equprg).它基本上重新映射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

这是〜/ test.sh中的内容

echo "error!!
alskdjf alskdf
alskdj flaskdjf" 1>&2
exit 1

编辑:

我刚刚意识到我根本没有回答你的问题哈哈.我对equalprg的解决方案更不优雅,但它可能适合您的需求.要使用它,您必须设置equalprg.如果要在外部工具和内部缩进格式化器之间来回切换,请注释掉nnoremap行或设置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("'["),"\n")
      undo
      echo format_error
   endif
endfun

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐