TextMate использует rcodetools для достижения этой цели. Из редактора пакета для команды « Выполнить и обновить» # #>> Маркеры:
"${TM_RUBY}" -r "${TM_SUPPORT_PATH}/lib/ruby1.9/add_1.8_features.rb" -- "$TM_BUNDLE_SUPPORT/vendor/rcodetools/bin/xmpfilter"
xmpfilter
поставляется с 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])
До:
После: