Friday, October 27, 2006

JDE, Java ve Emacs

Emacs içinde yer alan C dili için bir kip mevcuttur. Java programlarınızı yazarken bu kipi, ya da şimdi tanıtacağımız JDE kipini kullanabilirsiniz. Java için özel olarak yazıldığı için JDE kipini şiddetle tavsiye ediyoruz.

JDE Nasıl Kurulur

Eğer Unix üzerinde çalışıyor ve XEmacs kullanıyorsanız, JDE kurumu Emacs paketinin içinde olabilir. NTEmacs için JDE nasıl kurulur burada göstereceğiz. Gösterdiğimiz teknikleri Unix için değiştirilerek uygulanabilir.

JDE için ayrıca, öteki bazı LISP paketleri (programları) gerekli. Bu dosyalar şunlar:


* eieio
* speedbar
* semantic
* elib
* ecb
* JDE

Bu dosyaları indirip, ters-zip yapıp açarak, EMACS_DIZINI/site-lisp/ altına bırakın. Bu kodları sitemizinden de indirebilirsiniz. Benim lisp/ dosyam şöyle gözüküyor (sadece lisp paket isimleri gösterilmiştir).

$ ls -al  | grep 'dr'
..
drwxrwxrwx+ 22 Administ None 147456 Mar 26 22:12 .
drwxrwxrwx+ 8 Administ None 4096 Oct 19 13:47 ..
drwxrwxrwx+ 2 Administ None 4096 Mar 26 22:06 eieio-0.17
drwxrwxrwx+ 2 Administ None 4096 Mar 26 22:10 elib-1.0
drwxrwxrwx+ 2 Administ None 16384 Oct 19 13:46 international
drwxrwxrwx+ 5 Administ None 0 Mar 26 22:13 jde-2.3.2
drwxrwxrwx+ 3 Administ None 12288 Mar 26 22:06 semantic-1.4.3
drwxrwxrwx+ 2 Administ None 8192 Mar 26 22:06 speedbar-0.14beta4
drwxrwxrwx+ 2 Administ None 8192 Mar 26 22:06 ecb-2.27
...

Artık ekteki paketteki gibi bir _emacs.el kullanarak, JDE kullanmaya başlayabilirsiniz. Emacs'e her .java açıldığında JDE modunun yüklenmesini söyleyebilirsiniz, bu auto-mode-alist LISP değişkeni üzerinden olmaktadır.

.el ve .elc Nedir?

ELC dosyaları, EL dosyalarının derlenmiş halidir. Derlenmiş kodlar her dilde daha hızlıdır, LISP'te de durum böyledir. Bu yüzden _emacs.el dosyamızı derlenmiş olarak tutuyoruz. Değişen _emacs.el'i derleme sistemimiz şöyle: _emacs.el dosyasında, byte-me adlı bir LISP işlevi göreceksiniz. byte-me() işlevi derlemeyi gerçekleştiren bir fonksiyon, \C-c\C-b tuşlarına bağlıdır. Emacs'in esas baktığı _emacs dosyası da, hiçbirşey yapmadan direk _emacs.elc'yi yükleyerek yeni tanımları almaktadır.

Renkler

Java kodunu aşağıdaki renkler ile kullanıyoruz.

(set-face-background 'modeline "darkred")
(set-face-foreground 'modeline "white")
(set-background-color "black")
(set-foreground-color "white")
(set-cursor-color "turquoise")

(custom-set-faces
'(comint-highlight-prompt ((((background dark)) (:foreground "White"))))
'(font-lock-builtin-face ((t (:foreground "turquoise"))))
'(font-lock-builtin-name-face ((((class color) (background light)) (:foreground "turquoise"))))
'(font-lock-comment-face ((t (:foreground "green3"))))
'(font-lock-constant-face ((t (:foreground "White"))))
'(font-lock-function-name-face ((((class color) (background dark)) (:foreground "light goldenrod"))))
'(font-lock-keyword-face ((t (:foreground "turquoise"))))
'(font-lock-string-face ((t (:foreground "White"))))
'(font-lock-type-face ((t (:foreground "White"))))
'(font-lock-variable-name-face ((t (:foreground "White"))))
'(html-tag-face ((t (:foreground "turquoise"))))
'(jde-java-font-lock-builtin-face ((((class color) (background light)) (:foreground "turquoise"))))
'(jde-java-font-lock-builtin-name-face ((((class color) (background light)) (:foreground "turquoise"))))
'(jde-java-font-lock-comment-face ((t (:foreground "green3"))))
'(jde-java-font-lock-constant-face ((t (:foreground "White"))))
'(jde-java-font-lock-keyword-face ((((class color) (background light)) (:foreground "turquoise"))))
'(jde-java-font-lock-modifier-face ((t (:foreground "turquoise"))))
'(jde-java-font-lock-number-face ((((class color) (background light)) (:foreground "White"))))
'(jde-java-font-lock-operator-face ((((class color)) (:foreground "White"))))
'(jde-java-font-lock-package-face ((((class color) (background dark)) (:foreground "White"))))
'(jde-java-font-lock-string-face ((t (:foreground "White"))))
'(jde-java-font-lock-type-face ((((class color) (background light)) (:foreground "White"))))
'(jde-java-font-lock-variable-name-face ((((class color) (background light)) (:foreground "White")))))


Dinamik Metot İsmi Tamamlamak, Kodu Gezmek

Modern editör programlarının en sevilen yönlerinden beri, değişken ismini yazdıktan sonra . tuşuna basınca muhtemel metot isimlerinin liste olarak gelmesidir. Diğer özellikler, bir metot isminin üzerinde dururken bir tuş hareketi ile o metodun yazıldığı/gerçekleştirildiğia yere gidilmesidir. Ve en son olarak, bir metodu çağıran diğer tüm metotların bir listesinin çıkartılması istenen özelliklerden biridir.

Bütün bu özellikler, JDE içinde mevcuttur. Kod gezme özelliklerini eklemek için, _emacs.el dosyanıza şunları eklemek gerekir (biz örnek olarak site kaynak dizinlerini kullandık)

(custom-set-variables
;; ...
;; ...
'(jde-complete-function (quote jde-complete-menu))
'(jde-global-classpath (quote ("c:/proje/classes")))
'(jde-sourcepath (quote ("c:/proje/src" "c:/proje2/src")))
'(jde-built-class-path (quote ("c:/proje/classes" "c:/proje2/classes")))
'(jde-xref-store-prefixes '("org" "com" "sk"))
'(jde-xref-db-base-directory "c:/temp")
)

jde-sourcepath, kaynak dosyalarınızın olduğu en üst dizindir, jde-global-classpath ve jde-built-class-path derlenmiş .class dosyalarınızın olduğu en üst dizindir. Derlenmiş dosyalar Emacs'in BeanShell paketi tarafından, metot ismi tanımlamak için kullanılmaktadır, bu yüzden java.exe programının PATH içinde olmasına dikkat edin. Çağıran fonksiyonların listesi özelliği için jde-xref komutları kullanılıyor, bu işlevler kaynak dosyaların üzerinden oluşturulacak bir indekse ihtiyaç duymaktadır; jde-xref-db-base-directory tanımı, kodunuz JDE tarafindan indeks dosyalarının tutulduğu yerdir, ve üstteki tanımlar yapıldıktan sonra, M-x jde-xref-make-xref-db komutunu işletirseniz, tüm kodunuz indekslenecek ve gezilmeye hazır olacaktır. Hangi paketlerin indeksleneceğini jde-xref-store-prefixes üzerinden kontrol edebilirsiniz.

Metot tanımına gitmek için jde-open-class-at-point kullanılır, bu komut \C-c\C-v\C-y üzerindedir.

Metot ismi tamamlamak için jde-complete (\C-c\C-v\C-.) (en son tuş nokta tuşudur).


Herhangi bir class'ın ismini paketiyle beraber import etmek için (import komutu üretilerek gerekli yere konur) jde-import-find-and-import fonksiyonu kullanılır. (\C-c\C-v\C-z tuşları).

Çağıran metotların listesi için de jde-xref-display-call-tree (istediğiniz tuşa bağlayabilirsiniz).


JDE Usages

JDE'nin paketinden çıkan kodlar ile, XYZ metodunu kimin çağırdığını bulabilirsiniz. Fakat JDE, paketten çıktığı hâliyle, bundan fazlasını sağlamıyor. Meselâ X class'ından "kalıtım (extend) yapan" tüm alt class'ların (subclass) listelenmesi, bir metodu "gerçekleştiren" alt class'taki "metodların listesi" gibi kullanım (usage) raporları verilemiyor. Bu tür raporlar için eklenti olarak ayrı bir JDE paketi (plug-in) mevcut, ismi jde-usages.

Jde-usages kurmak için, önce sitesindeki bağlantıyı takip ederek zip dosyasını indirin. Bu dosyayı, olduğu gibi EMACS_DIZINI/site_lisp/jde-xxx/plugins altına atın. Sonra Emacs ESC tuşuna basarak, M-jde-pi-install-plugins elisp komutunu işletin. Emacs'i kapatıp açın ve jde-usages'ın kurulmuş olduğunu göreceksiniz. Artık,


* Herhangi bir class içinde iken, o class'ın kalıtımcıları için: jde-usages-display-subs-and-implementers
* Bir metotu gerçekleştiren alt class'lardaki metotlar için: jde-usages-display-subs-implementing-method
* JDE'nin önceden de yaptığı çağırım zinciri (call chain) yâni "beni kim çağırıyor" özelliği: jde-usages-display-call-tree.

Bu son komutun çıktısı pür JDE çıktısı ile tıpatıp aynı, jde-usages programcıları bu özelliği bir daha kodlamak ihtiyacını hissettiler herhalde.

Bu kadar; Jde-usages kuruluşu için başka hiçbir ek tanıma ihtiyacınız yok. Jde-usages, JDE altyapısı üzerine eklemlendiği için, kendisine ihtiyacı olan classpath, sourcepath gibi tüm tanımları da daha önce JDE için yapmış olduğumuz değişkenlerden almaktadır.

Altta bir altsınıf bulma komutunun örneğini görüyorsunuz.




İskelet Java Kodları Üretmek

Yeni bir class yaratırken, istenen bir özellik bazı iskelet kodların dosya içine konmasıdır. Bunu yapmak için _emacs.el içinde jde-mode için bir çengel (hook) yaratmak gerekir. Çengel fonksiyonları, o moda her girildiğinde çağrılan kodlardır.

(defun benim-jde-mode-hook ()
...
(if (and
(string-match "\\.java$" filename)
(not (file-exists-p buffer-file-name)))
(jde-gen-class-buffer filename)
)
)
...
(add-hook 'jde-mode-hook 'benim-jde-mode-hook)

Yukarıdaki kod parçası, önce Emacs buffer isminin .java ile bitip bitmediğini anlar. Eğer öyle ise "VE" dosya daha hard diskte değil ise (çünkü jde mod'una "mevcut" bir dosya ziyaret edilirken de girilebilir, bu farkı algılamak zorundayız. İskelet kodu sadece yeni dosyalar için üretmeliyiz), jde-gen-class-buffer metotunu çağırarak iskete kodunu üretmeye başlarız. İskelet kodun temeli, jde-gen-class-buffer-template değişkeni ile tanımlanan kodlardan oluşmaktadır.

ECB

Java IDE'lerinden istenen diğer bir özellik te, ziyaret edilen bir Java nesnesinin metot, değişken ve kalıtım listesini editörün sol tarafında görmektir. Oldukça grafik olan bu özellik için ECB paketini kullanabilirsiniz. _Emacs dosyanıza aşağıdaki tanımlarını koyabilirsiniz.

(require 'ecb)

(custom-set-variables
...
'(ecb-options-version "2.27")
..
)

ECB'yi başlatmak için, menüden Tools | Start Code Browser (ECB) seçeneğini seçebilirsiniz.


Kendi Menümüzü Kendimiz Yaratmak İçin

Emacs, üst tarafta gördüğünüz menü seçeneklerini _emacs içinden değiştirmenizi sağlamaktadır. Yeni bir menü başlığı altında kendi seçeneklerinizi yaratmak için, easy-menu-define elisp fonksiyonunu kullanabilirsiniz. Aşağıda bunu bir örneğini görebilirsiniz.

(easy-menu-define
benim-mode-menu
global-map
"BenimMenu"
(list
"BenimMenu"
"--"
["Derle" 'compile]
"--"
["Kod Siraya Diz" indent-region]
["Comment Out" comment-region]
["Uncomment Out" uncomment-region]
))
(easy-menu-add benim-mode-menu)

No comments: