Existe uma maneira de “Executar e atualizar '# =' marcadores 'no Sublime Text 2?

3

Este é o meu recurso favorito do pacote Ruby no TextMate. Infelizmente, não consigo encontrar como fazer o mesmo no ST2. Ele ainda insere o marcador quando você pressiona TAB após o símbolo # , então, espero, a capacidade de executar código ruby e atualizar esses marcadores está lá, mas está bem oculta.

Para não usuários do TextMate: vamos supor que tenhamos digitado esse código

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

Em seguida, ao pressionar um atalho (ctrl + cmd + shift + E por padrão), o textmate executa esse código e insere o valor das linhas correspondentes após # => marcadores. Neste caso, o resultado será assim:

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

É super útil para testar rapidamente as coisas e postar ótimos snippets no stackoverflow. Agora eu preciso do ST2 para fazer isso. :)

    
por Sergio Tulentsev 10.09.2012 / 19:01

2 respostas

4

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:

    
por 10.09.2012 / 21:24
4

Primeiro de tudo, graças a Daniel Beck por sua solução, pois funciona maravilhosamente e era exatamente o que eu estava procurando.

Editar 18 de março de 2013:

Eu fiz isso em um pacote Sublime chamado Ruby Markers . O pacote inclui o código discutido neste tópico, bem como algumas outras coisas que não foram discutidas (como o manuseio do sistema operacional [estou olhando para você no windows], suporte a unicode, suporte a rvm e rbenv). Está disponível através do Gestor de Pacotes ou no link .

    
por 10.01.2013 / 21:13