3

Это моя самая любимая функция из комплекта ruby в TextMate. К сожалению, я не могу найти, как сделать то же самое в ST2. Он по-прежнему вставляет маркер при нажатии клавиши TAB после символа # , поэтому, я надеюсь, возможность запуска кода ruby и обновления таких маркеров есть, но она хорошо спрятана.

Для не пользователей TextMate: предположим, что мы набрали этот код

a = 10
b = 30
a + b # => 

Затем, нажав комбинацию клавиш (по умолчанию Ctrl + CMD + Shift + E), textmate выполняет этот код и вставляет значение соответствующих строк после маркеров # => . В этом случае результат будет выглядеть так:

a = 10
b = 30
a + b # => 40

Это очень удобно для быстрого тестирования и публикации хороших фрагментов в stackoverflow. Теперь мне нужно ST2, чтобы сделать это. :)

2 ответа2

4

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])

До:

Скриншот

После:

Скриншот

4

Прежде всего, спасибо Дэниелу Беку за его решение, оно прекрасно работает и было именно тем, что я искал.

Изменить 18 марта 2013 г .:

Я сделал это в пакете Sublime под названием Ruby Markers. Пакет включает в себя код, обсуждаемый в этой теме, а также некоторые другие вещи, которые не обсуждались (такие как обработка ОС [я смотрю на ваши окна], поддержка юникода, поддержка rvm и rbenv). Он доступен через диспетчер пакетов или по адресу https://github.com/mmims/sublime-text-2-ruby-markers.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .