2010-03-09 12 views
9

मैं अस्थायी रूप से मारने नए समारोह को ओवरराइड करना चाहते हैं। मैं एक तरह से मैं मार-नई है कि केवल कुछ संदर्भों में में काम करता है reimplement करना चाहते हैं, लेकिन मैं उसके ऊपर मार-क्षेत्र का एक विशेष संस्करण reimplement नहीं करना चाहती। (मार-नई मार-क्षेत्र से कहा जाता है)Emacs में एक समारोह ओवरराइड लिस्प

के बाद से Emacs लिस्प गतिशील scoping का उपयोग करता है, यह, संभव हो जाना चाहिए ना? (दूसरी तरफ, ऐसा लगता है कि यह समर्थन करने के लिए एक असुरक्षित बात होगी, और यह मुझे थोड़ा परेशान कर सकता है कि यह संभव है ...)

मैंने प्रयोग और fset का उपयोग करने के साथ प्रयोग किया है, लेकिन ऐसा उम्मीद के अनुसार काम करने के लिए अब तक कोई रास्ता नहीं मिला है। तो, उम्मीद है कि यदि कोई व्यक्ति निम्न स्यूडोकोड में खाली में भर सकते हैं:

(defun my-kill-new (string &optional replace yank-handler) 
    (message "in my-kill-new!")) 

(defun foo() 
    (some-form-that-binds-a-function (kill-new my-kill-new) 
    (kill-region (point) (mark)))) 

क्या चाहिए कुछ फार्म-कि-बांध एक समारोह हो सकता है? या मैं गलत पेड़ को भड़क रहा हूँ? advice पैकेज है, जो यह सब करने के पर बहुत अच्छा है पर

उत्तर

12

यहाँ एक समाधान है।

+0

मुझे लगता है कि मैं इस उद्देश्य के लिए फलेट का उपयोग करने के लिए इसे पसंद करता हूं। हालांकि सलाह का उपयोग करके इसे करने में और अधिक समारोह है, लेकिन यह मुझे हत्या के नए कार्यान्वयन के लिए आसान पहुंच प्रदान करता है। – kes

+6

शायद आप एक अनचाहे सुरक्षा के साथ सलाह को हटाना चाहते हैं, ताकि नॉनोकोकल निकास भी सलाह को हटा दें। बस फूस का प्रयोग करें। – jrockway

+0

@kes यदि आप 'kill-new' की मूल परिभाषा तक पहुंचना चाहते हैं, तो इसे' पुराने-हत्या-नए 'पर' flet' 'करें। –

3

देखो।

(defadvice kill-new (around my-kill-new (string &optional replace yank-handler)) 
    (message "my-kill-new!")) 


(defun foo() 
    (progn (ad-enable-advice 'kill-new 'around 'my-kill-new) 
    (ad-activate 'kill-new) 
    (kill-region (point) (mark)) 
    (ad-disable-advice 'kill-new 'around 'my-kill-new) 
    (ad-activate 'kill-new))) 
+0

FYI करें: आजकल '' advice' nadvice' ने ले लिया है। –

+0

मैं रक्तस्राव emacs चला रहा हूँ, और nadvice वहाँ नहीं है, लेकिन सलाह अभी भी मजबूत जा रहा है। –

+0

यह आश्चर्यजनक है। जब तक "वहां नहीं है" का मतलब है कि 'nadvice' में 'सलाह' की सभी सुविधाएं नहीं हैं? https://github.com/emacs-mirror/emacs/blob/master/lisp/emacs-lisp/nadvice.el –

13

आपका some-form-that-binds-a-functionflet कहा जाता है, तो आप करीब थे:

संबंधित मुद्दे