有没有办法在 Sublime Text 2 中“执行并更新‘# =>’标记”?

有没有办法在 Sublime Text 2 中“执行并更新‘# =>’标记”?

这是 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

相关内容