TextMate ve Path sorunsalı

textmate ruby

TextMate’in sevdiğim özelliklerinden biri in-line olarak programlama yapabilmek. Örneğin html ile uğraşıyorsunuz, hemen bir div ve o div’in içinde 15 tane p ve p’lerin içinde de span’e ihtiyacınız var (iyi uydurdum dimi?) basit bir hareketle bunu programatik olarak yapabilirsiniz.

Keza Zen Coding adında bir bundle var. Bununla da benzer hareketleri yapıyorsunuz ama çok pratik olmuyor bazen.

Bu tür işleri Ruby ile yapıyorum. Dokümanın içinde herhangi bir yere Ruby script’i yazıp bunu execute edebiliyorsunuz. Sadece Ruby değil neredeyse OS’daki her dilden istifade edebilirsiniz.

Ağırlıkta Python kullandığım için işlerimi Python ile halletmek daha kolayıma geliyor. Kendime sordum, neden bu işlerimi de Python ile yapmıyorum? Hemen menüye baktım elimde neler var diye

TextMate ekran görüntüsü

(kntrl) + (shift) + E

Kntrl + Shift + E ile **Execute Line/Selection as Python** komutunu gördüm. Hemen denedim, Hata mesajı verdi. Denediğim şey:

print "vigo"

yazmaktı. Invalid syntax filan. Hemen Bundle Editor’ü açıp baktım ne yazılmış diye. Bir baktım eval() kullanılmış. Pek çok dilde benzer komut vardır. Evaluate’in kısaltmasıdır ve string olarak verilen şeyi execute etmeye çalışır. Fakat Python’da mevzu bu şekilde değil. Eval, sadece ifadeleri evaluate ediyor. Yani

print eval("5+5")

yazdığınızda size 10 yazıyor. Yani string olarak verilen ifadeyi değerlendiriyor sadece. Şimdi bu işlerle uğraşırken birden farkettimki [TextMate][textmate], benim Python’umu değilde sistemdeki default’u kullanıyor. Nasıl yani?

#!/usr/bin/env python

ile başlayan Python scriptini çalıştırırken gidip /usr/bin deki python’u kullanıyor. Halbuki benim environment’ımda python’un path’i

/Users/vigo/.local/Python/Library/Frameworks/Python.framework/Versions/Current/bin/python

Hemen TextMate’in Shell Environment ayarlarındaki PATH’e ekledim kendi path bilgilerimi. Gidip sona ekledim. Yani orada yazanların sonuna… (8 Meğerse sona değil başa eklemek gerekiyormuş!

TextMate ekran görüntüsü

PATH ayarlamak

aynen şu aşağıdaki gibi yaptım

/Users/vigo/.local/Python/Library/Frameworks/Python.framework/Versions/Current/bin:/Users/vigo/.local/Python/bin:/Users/vigo/.local/Python/Packages/bin:/opt/local/bin:/usr/bin:/bin:/usr/sbin:/sbin

Kullanıcı profilimdeki path bilgisini ve macports’dan kurduğum executable’ların için gereken /opt/local/bin’i de ekledim.

Sorunun bir kısmını çözmüştüm. Şimdi diğer tarafı çözmem gerekiyordu. Bundle editöre geri döndüm. Biraz kolaya kaçtım, hatta biraz da tavsiye edilmeyen bir yöntemi kullandım. eval() yerine exec() kullandım.

Zaten basit işlerde kullanacağım için çok da sorun değil. Belki sizin de işinize yarar:

#!/usr/bin/env python
import os

from sys import stdout, stdin, exit, version
from traceback import format_stack

py = stdin.read()

if 'TM_SELECTED_SCOPE' in os.environ:
    stdout.write(" ")
else:
    stdout.write("\n")

# original
# try:
#     scope = {}
#     result = eval(py, globals(), scope)
# except:
#     exc = format_stack()
#     stdout.write(exc)
#     exit(206) # exiting with this code show’s output in a tooltip 
# else:
#     stdout.write(repr(result))

# mine
exec(py)

Kntrl + Shift + E ile artık python script’lerimi basitçe execute edebilirim.