Pymacs
Lisp sürekli kullandığım dillerden biri değil; sadece uzun aralarla Emacs editörümü kışiselleştirmek için kullanıyorum ve uzun süre geçtikten bazı Lisp numaralarını tekrar öğrenmem gerekiyor. Bir araçı birden yerde fazla kullanabilme meraklısı olduğumüz için Lisp'ten mümkün olduğu kadar uzak durmaya karar verdik. Bu kararda önemli bir faktör, bir editör uzantısı için okkalı kodlama yapmamız gerektiği idi... Peki bu iş hangi dilde yapılacaktı?
Bilimsel hesaplama icin zaten Python kullanmaya karar vermistik. Acaba Python'u Emacs'i uzatmak/kisisellestirmek icin kullanamaz miyiz?
Editör uzantısı kodlamanın ağır sıklet kısmı için de Perl kullanmayı düşünüyorduk, çünkü bir sürü dosya/dizin gezme/işleme gerekecekti, fakat bu kullanımda Perl yerine de Python kullanabilirdik. Bir taşla iki kuş.
Biraz arama sonucunda Emacs'i Python ile uzatmami saglayacak bir araci
buldum: Pymacs. Pymacs, tum Emacs lisp fonksiyonlarina bir Python
script'i icinden ve tum Python modullerine de Emacs icinden
erisebilmenize izin veriyor. Kurmak icin ya apt-get ile ya da kaynagi
indirip make
sonra python setup.py install
ile kurabiliriz.
https://github.com/pinard/Pymacs
Hemen bir Emacs uzantısı yazalım, mesela pymaçstest.py adında bir program yazalım; bu programı /usr/share/emacs/22.2/site-lisp/ altında diğer EL dosyaları ile birlikte tuttuğunuzu varsayalım. O zaman .emacs ıcinden
(pymacs-load "/usr/share/emacs/22.2/site-lisp/pymacstest")
çağrısı yüklemek için yeterli. Bu kod içinde neler olsun?
from Pymacs import lispdef test(): lisp.message("i am here")
Gördüğünüz üzere lisp objesi üzerinde Emacs metotları var; lisp.message çağrısı elisp içindeki (message "..") çağrısını yapıyor. pymaçstest.test çağrısını yapmak artık çocuk oyuncağı, Pymacs ışimlendirme kurallarına göre, dosya ismi + "-" + metot ismi kullanarak bu çağrı Lisp tarafından yapılabiliyor. Metot ismi demek ki pymaçstest-test olacak.
Hızlı geliştirme için bazı numaralar; Python kodu değiştiği zaman modülü tekrar yüklettirmek için Pymacs ışımlı buffer'i oldurmek, sonra modülü tekrar yüklemek. Bizim .emacs dosyamız şu anda şöyle (başka modül ve metot ışimleriyle):
(defun reload-pyjde()
(interactive)
(if (buffer-live-p (get-buffer "*Pymacs*" ))
(kill-buffer (get-buffer "*Pymacs*")))
(pymacs-load "/usr/share/emacs/22.2/site-lisp/pyjde"))
(defun test-me()(interactive)(pyjde-test))
(global-set-key [f5] 'test-me)
(global-set-key [f11] 'reload-pyjde)
(reload-pyjde)
Böylece geliştirme sırasında pyjde.py dosyası değiştikçe F11 tuşu ile kodu tekrar yükletip F5 ile çağrıyı yapabiliyoruz. Metot test-me() daha sonra başka yerlere map edecek, bu tuşa gerek kalmayacak fakat durumu anladınız sanıyorum.
Böylece alet çantamızdaki Lisp, Perl'den aynı anda kurtulduk, ayrıca hesapsal işler için Python kullanacağız - iki tool gitti, yerine üç iş yapan tek tool geldi.
Bazı komutlar:
Üzerinde olduğumüz nokta bir blok içinde, bu bloğa tekabül eden tüm metni istiyoruz,
b = lisp.search_forward("[BITIS]")
e = lisp.search_backward("[BASLA]")
content = lisp.buffer_substring(b, e)
Burada Emacs LİSP fonksiyonlarından ikisini kullanmış olduk.
Herhangi bir noktada Messages içinde ve Emacs alt boşluğunda gözükebilecek bir metin basmak için
lisp.message("mesaj")
İçinde olduğumüz Emacs buffer'in ismi
lisp.buffer_name()
Icinde oldugumuz dosyanin ismi
lisp.buffer_file_name()
Diyelim ki olduğumuz noktaya bir sürü işlemden sonra dönmek istiyoruz
remember_where = lisp.point()...
lisp.goto_char(remember_where)
Yukarı