Sublime Text 2'de “# yürütme ve güncelleme” # => “işaretçileri” kullanmanın bir yolu var mı?


3

Bu benim TextMate'deki yakut paketindeki en sevdiğim özellik. Ne yazık ki, aynı şeyi ST2'de nasıl yapacağımı bulamıyorum. Sembolden sonra SEKME tuşuna bastığınızda, işaretçiyi yine de ekler #, bu nedenle, umarım, yakut kodunu çalıştırma ve bu tür işaretleyicileri güncelleme yeteneği vardır, ancak gizlidir.

TextMate kullanıcısı olmayanlar için: Bu kodu girdiğimizi varsayalım.

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

Ardından, bir kısayola basıldığında (varsayılan olarak ctrl + cmd + shift + E), textmate bu kodu çalıştırır ve # =>işaretçilerden sonra karşılık gelen satırların değerini ekler . Bu durumda, sonuç şöyle görünecektir:

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

İşleri hızlıca denemek ve stackoverflow'a güzel snippet'leri göndermek için çok kullanışlı. Şimdi bunu yapmak için ST2'ye ihtiyacım var. :)

Yanıtlar:


4

TextMate, bunu başarmak için rcodetools kullanıyor . Execute and Update komutunun paket editöründen '# =>' İşaretleyiciler :

"${TM_RUBY}" -r "${TM_SUPPORT_PATH}/lib/ruby1.9/add_1.8_features.rb" -- "$TM_BUNDLE_SUPPORT/vendor/rcodetools/bin/xmpfilter"

xmpfilterrcodetoolsgem ile birlikte gelir ve bağımsız çalıştırılabilir.

$ 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

Şimdi bu komutları Sublime Text 2 eklentisine eklemeniz, geçerli belgeyi girdi olarak geçmeniz ve çıktı ile değiştirmeniz yeterlidir. Bu cevapta Sublime Text 2 ile eklentilerin nasıl oluşturulacağı ve birleştirileceği hakkında genel bilgiler bulabilirsiniz .

Yukarıda gösterilen ortam için, bu soruna özel eklenti kodu:

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

Önce:

Ekran görüntüsü

Sonra:

Ekran görüntüsü


Merak ediyorum, neden zaten böyle bir eklenti yok? :) Mükemmel cevap için teşekkürler.
Sergio Tulentsev 10:12

@SergioTulentsev Şimdi var.
Daniel Beck

teşekkürler dostum, harikasın! Bunu öğrenme fırsatını ortadan kaldırmana rağmen, şikayet etmeyeceğim :)
Sergio Tulentsev

Daniel, gönderdiğin eklenti kodunu çalıştırırken sorun yaşıyorum. Tek başına bir örneği çalıştırabilirim. Komutu ST2 içinden nasıl yürütüyorsunuz? Teşekkürler
AGS

@AGS Lütfen sorunun ne olduğu konusunda daha net olun ve ST2'ye eklentilerin nasıl kurulacağını açıklayan bağlantılı cevabı mutlaka okuyun.
Daniel Beck

4

Her şeyden önce, Daniel Beck'e harika çalıştığı için çözümü için teşekkürler ve tam da benim aradığım şeydi.

18 Mart 2013’ü Düzenle:

Bunu Ruby Markers adında bir yüce paket haline getirdim . Pakette, bu konuda tartışılan kodun yanı sıra tartışılmayan bir kaç şey daha var (işletim sistemi kullanımı [sana bakıyorum pencereleri], unicode desteği, rvm ve rbenv desteği gibi). Paket Yöneticisi aracılığıyla veya https://github.com/mmims/sublime-text-2-ruby-markers adresinde bulunabilir .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.