Monday, January 29, 2007

AOP in emacs

ตอนที่เริ่มรู้จัก AOP ใน java ก็รู้สึกว่ามันเจ๋งดี
มาวันนี้ระหว่างนั่งเปิดคู่มือ emacs-lisp หา function ที่ต้องการอยู่
สายตาก็เหลือบไปเห็นคำว่า advice, before, after, around
อ้าว นี่มัน AOP นี่หว่า

กลับบ้านมาก็เลยทดลองเสียหน่อย
เอาโจทย์ที่เคยตอบคุณ sugree ใน codenone
ตอนนั้นประเด็นคำถามก็คือ behavior ของ M-f มันไม่เหมือนกับ 'w' ใน vi
วิธีเดิมที่ผมตอบคุณ sugree ไป ก็คือใช้การ define function ใหม่
แล้วก็ re-define map key ให้ชี้ไปที่ function ใหม่เอา
(defun my-forward-word()
(interactive)
(forward-word)
(skip-chars-forward " ")
(set-mark-command nil)
(forward-char))

แต่ถ้าเปลี่ยนมาใช้ Advice ก็จะทำได้ดังนี้
(defadvice forward-word (after forward-like-vim (arg))
(skip-chars-forward " ")
(set-mark-command nil)
(forward-char))

การประกาศ defadivce นั้น, advice นั้นจะยังไม่ทำงานทันที
ต้องมีการสั่ง activate ก่อน
(ad-activate 'forward-word)


Note: อ่านดูใน file ของ emacs แล้วพบว่า feature นี้เขียนตั้งแต่ปี 1992

Related link from Roti

1 comment:

veer said...

ต้องลองเขียน emacs lisp มั่งแล้ว