如何在vimscript中干净地退出红宝石

时间:2018-02-14 04:52:54

标签: ruby vim

TLDR

给出一个像vim这样的命令:

nnoremap <leader>x :ruby puts 'foo'; exit 0; puts 'bar'<CR>

有什么可以替换exit 0以使此命令干净地退出而不打印'bar'

更长的版本

假设我的vimconfig中有一个ruby脚本。为了清楚起见,我将它包装在一个函数中,但这不是必需的:

function! RubyTest()
ruby << EOF
  some_condition = true
  puts "aaa"
  return if some_condition
  puts "bbb"
EOF
endfunction

我希望,根据某些条件,提前退出此ruby代码,以便puts "bbb"不会被执行。

现在,我可以将整个内容包装成条件:

  some_condition = true
  puts "aaa"
  unless some_condition
    puts "bbb"
  end

但如果puts "bbb"实际上是数十行,那就太糟糕了。更糟糕的是,如果不是这个玩具示例,我有许多条件最终会非常嵌套和不可读。

所以,我真正想做的是:

some_condition = true
puts "aaa"
return if some_condition
puts "bbb"

但是,return输出错误:

Error detected while processing function RubyTest:
line    6:
LocalJumpError: unexpected return  

exitSystemExit: exit),nextSyntaxError: eval:3: Can't escape from eval with next)和breakSyntaxError: eval:3: Can't escape from eval with break)也是如此。

我最好的解决方法是将ruby脚本的全部内容包装在一个函数中,立即执行该函数,然后根据需要从其中return。这看起来很愚蠢 - 但是肯定有一些方法可以干净地退出任何奇怪的上下文Vim正在执行这个ruby,对吗?

1 个答案:

答案 0 :(得分:0)

您收到此错误,因为没有任何内容可以从返回return旨在打破封闭方法,但在您的示例中没有方法。

可能的解决方法是创建一个封闭方法:

function! RubyTest()
ruby << EOF
 def my_method
  some_condition = true
  puts "aaa"
  return if some_condition
  puts "bbb"
 end
 my_method
EOF
endfunction

编辑完全错过了您自己已经提出过这个解决方案并且正在寻找替代方案。我不能提供任何,或至少没有比上述更短或更清洁的。如果你愿意,我会删除这个答案。