给出一个像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
exit
(SystemExit: exit
),next
(SyntaxError: eval:3: Can't escape from eval with next
)和break
(SyntaxError: eval:3: Can't escape from eval with break
)也是如此。
我最好的解决方法是将ruby脚本的全部内容包装在一个函数中,立即执行该函数,然后根据需要从其中return
。这看起来很愚蠢 - 但是肯定有一些方法可以干净地退出任何奇怪的上下文Vim正在执行这个ruby,对吗?
答案 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
编辑完全错过了您自己已经提出过这个解决方案并且正在寻找替代方案。我不能提供任何,或至少没有比上述更短或更清洁的。如果你愿意,我会删除这个答案。