O TextMate usa rcodetools para conseguir isso. De seu editor de bundle para o comando Executar e atualizar ‘# = >’ Marcadores :
"${TM_RUBY}" -r "${TM_SUPPORT_PATH}/lib/ruby1.9/add_1.8_features.rb" -- "$TM_BUNDLE_SUPPORT/vendor/rcodetools/bin/xmpfilter"
xmpfilter
vem com a rcodetools
gem e pode ser executado como autônomo.
$ 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
Agora você só precisa agrupar esses comandos em um plugin Sublime Text 2, passando o documento atual como entrada e substituindo-o por output. Você pode encontrar informações gerais sobre como criar e integrar plugins com o Sublime Text 2 nesta resposta .
Aqui está o código do plug-in personalizado para este problema, para o ambiente mostrado acima:
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])
Antes:
Depois: