2016-10-27 2 views
0

Wie passen Sie einen bestimmten Ausdruck im Körper auf elisp Funktion beim Hinzufügen von Beratung? Insbesondere möchte ich im folgenden Beispiel die Funktion empfehlen, find-file-noselect anstelle von find-file zu verwenden, d. würde die Linie in der Tat (find-file-noselect path) sein.Ändern Sie den Ausdruck im Körper der elisp Funktion mit Beratung

(defun tst-fun (path line column) 
    (find-file path) 
    (goto-char (point-min)) 
    (forward-line (1- line)) 
    (forward-char column)) 

;; not sure how to structure this 
(defadvice tst-fun (around noselect activate) 
    (find-file-noselect (ad-get-arg 0)) 
    ad-do-it) 

würde ich es eher als Standard ad-add-function, aber ich versuche, diese erste Arbeit nur zu erhalten.

+0

Hinweis wird vor, nach oder anstelle der empfohlenen Funktion ausgeführt, ändert jedoch nicht, wie die ursprüngliche Funktion selbst funktioniert. – Barmar

+0

@Barmar so, gibt es keine Möglichkeit, etwas zu tun, wie 'ad-do-it' zu' (cdr ad-do-it) '? – jenesaisquoi

+0

Das ruft 'tst-fun' auf und gibt dann das' cdr' zurück, was auch immer es zurückgibt. – Barmar

Antwort

2

Sie könnten find-file als find-file-noselect in den Ratschlägen vorübergehend neu definieren.

(require 'cl) 
(defadvice tst-fun (around noselect activate) 
    (flet ((find-file (&rest args) 
      (apply 'find-file-noselect args))) 
    ad-do-it)) 
+0

Ich bin mir ziemlich sicher, dass es keine Möglichkeit gibt, das zu tun. Einige andere Lisp Dialekte hatten ': INSIDE' Ratschläge, wo man' find-file' nur innerhalb 'tst-fun' empfehlen konnte, aber Elisp hat das nicht. – Barmar

+1

Im "modernen" Elisp würde das so aussehen: '(require 'cl-lib) (rate-add' tst-fun: um (lambda (orig & rest args) (cl-letf (((symbol-function) find- Datei) # 'find-file-noselect)) (wenden Sie die Originalargumente an)) '. – Stefan

Verwandte Themen