2010-03-09 18 views
9

Desidero sovrascrivere temporaneamente la funzione kill-new. Ho un modo in cui voglio reimplementare kill-new che funziona solo in determinati contesti, ma non voglio reimplementare una versione speciale di kill-region in aggiunta. (kill-new viene chiamato da kill-region)Sovrascrittura di una funzione in Emacs Lisp

Poiché Emacs Lisp utilizza lo scope dinamico, questo dovrebbe essere possibile, giusto? (D'altra parte, sembra che sarebbe una cosa non sicura da supportare, e potrebbe rendermi un po 'nervoso sapendo che è possibile ...)

Ho sperimentato usando let e fset, ma così lontano non hanno trovato modo di farlo funzionare come previsto. Così, si spera che qualcuno può riempire il vuoto nel seguente pseudocodice:

(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)))) 

Cosa dovrebbe qualche forma-che-lega-a-funzione di essere? O sto abbaiando sull'albero sbagliato?

risposta

12

Ecco una soluzione:

(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

Penso che preferisco usare questo flet per questo scopo. Sebbene ci sia più certezza nel farlo usando i consigli, mi dà un facile accesso all'attuazione esistente di kill-new. – kes

+6

Probabilmente vorrai rimuovere il consiglio con una protezione di svolgimento, in modo che anche le uscite non locali rimuova il consiglio. Basta usare il flet. – jrockway

+0

@kes Se si desidera accedere alla definizione originale di 'kill-new', basta' flet' it a 'old-kill-new'. –

3

Guarda il pacchetto advice, che è molto bravo a fare tutto questo.

+0

FYI: al giorno d'oggi il 'advice' è stato sostituito da' nadvice'. –

+0

Sto eseguendo emacs sanguinante, e nadvice non è lì, ma i consigli continuano ad andare forte. –

+0

Questo è sorprendente. A meno che per "non ci sia" tu intendessi "nadvice" non abbia tutte le caratteristiche del "consiglio"? https://github.com/emacs-mirror/emacs/blob/master/lisp/emacs-lisp/nadvice.el –

13

tuo some-form-that-binds-a-function si chiama flet, quindi vi erano vicini.