这是 TextMate 中 ruby 包中我最喜欢的功能。不幸的是,我找不到如何在 ST2 中实现相同的功能。当您在符号后按 TAB 时,它仍会插入标记#
,因此,我希望能够运行 ruby 代码并更新此类标记,但隐藏得很好。
对于非 TextMate 用户:我们假设我们输入了此代码
a = 10
b = 30
a + b # =>
然后,按下快捷键(默认为 ctrl+cmd+shift+E),textmate 会执行此代码并在# =>
标记后插入相应行的值。在本例中,结果将如下所示:
a = 10
b = 30
a + b # => 40
它非常方便快速试用并将精彩的代码片段发布到 stackoverflow。现在我需要 ST2 来做这件事。:)
答案1
TextMate 使用rcode工具实现这一点。从其包编辑器中获取命令执行并更新“# =>”标记:
"${TM_RUBY}" -r "${TM_SUPPORT_PATH}/lib/ruby1.9/add_1.8_features.rb" -- "$TM_BUNDLE_SUPPORT/vendor/rcodetools/bin/xmpfilter"
xmpfilter
随 gem 提供rcodetools
并可以独立运行。
$ sudo gem install rcodetools
[...]
$ export RUBYLIB=/System/Library/Frameworks/Ruby.framework/Versions/Current/usr/lib/ruby/user-gems/1.8/gems/rcodetools-0.8.5.0/lib/
$ echo "1+5 # => " | ruby /System/Library/Frameworks/Ruby.framework/Versions/Current/usr/lib/ruby/user-gems/1.8/gems/rcodetools-0.8.5.0/bin/xmpfilter
1+5 # => 6
现在,您只需将这些命令包装在 Sublime Text 2 插件中,将当前文档作为输入传递并将其替换为输出。您可以找到有关如何使用 Sublime Text 2 创建和集成插件的一般信息在这个答案中。
以下是针对该问题定制的插件代码,针对上面显示的环境:
import sublime, sublime_plugin, subprocess
class ExecuteAndUpdateRubyMarkers(sublime_plugin.TextCommand):
def run(self, edit):
r = sublime.Region(0, self.view.size())
text = self.view.substr(r)
s = subprocess.Popen(
[
'/usr/bin/env',
'RUBYLIB=/System/Library/Frameworks/Ruby.framework/Versions/Current/usr/lib/ruby/user-gems/1.8/gems/rcodetools-0.8.5.0/lib',
'ruby',
'/System/Library/Frameworks/Ruby.framework/Versions/Current/usr/lib/ruby/user-gems/1.8/gems/rcodetools-0.8.5.0/bin/xmpfilter'
],
stdin=subprocess.PIPE,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
out = s.communicate(text)
if s.returncode != None and s.returncode != 0:
sublime.message_dialog("There was an error: " + out[1])
return
viewlines = self.view.lines(r)
outlines = out[0].split('\n')
for i in range(0, len(viewlines)):
self.view.replace(edit, viewlines[i], outlines[i])
前:
后:
答案2
首先,感谢 Daniel Beck 提供的解决方案,因为它非常有效,正是我所寻找的。
2013年3月18日编辑:
我把它做成了一个 Sublime 包,叫做红宝石标记。该软件包包含本主题中讨论的代码以及其他一些未讨论的内容(例如操作系统处理 [我正在查看 windows]、unicode 支持、rvm 和 rbenv 支持)。可通过以下方式获取包管理器或https://github.com/mmims/sublime-text-2-ruby-markers。