0

我正在使用 ruby​​ 界面编写一个 vim 插件。

当我执行VIM::command(...)时,如何检测 vim 在执行此命令期间是否引发错误,以便我可以跳过更多命令并向用户提供更好的消息?

4

1 回答 1

1

Vim 的全局变量v:errmsg会给你最后一个错误。如果要检查是否发生错误,可以先将其设置为空字符串,然后再进行检查:

let v:errmsg = ""

" issue your command

if v:errmsg != ""
  " handle the error
endif;

我会留给你把它转移到 Ruby API。也可以:h v:errmsg从 Vim 内部看到。其他有用的全局变量可能是:

  • v:exception
  • v:throwpoint

编辑- 这应该有效(注意:涉及一些魔法):

module VIM
  class Error < StandardError; end

  class << self
    def command_with_error *args
      command('let v:errmsg=""')
      command(*args)
      msg = evaluate('v:errmsg')
      raise ::VIM::Error, msg unless msg.empty?
    end
  end
end


# Usage
# use sil[ent]! or the error will bubble up to Vim

begin
  VIM::command_with_error('sil! foobar') 
rescue VIM::Error => e
  puts 'Rescued from: ' + e.message;
end


# Output

Rescued from: E492: Not an editor command: sil! foobar
于 2013-11-12T09:48:09.307 回答