2015-06-01 4 views
5

Auf der Suche nach einer Möglichkeit, wie elisp Code in einer externen Datei gespeichert und das Ergebnis als Funktion Argument übergeben. Beispiel zeigen, was ich möchte folgt erreichen:Ergebniswert des in einer Datei gespeicherten elisp-Codes?

;; content of my_template.el 
'(this is a list) 

;; content of .emacs where result of my_template.el has to be used 
(define-auto-insert "\.ext$" 
    ;; bellow is my attempt to retrieve resulting list object 
    ;; but getting nil instead 
    (with-temp-buffer 
     (insert-file-contents ("my_template.el")) 
     (eval-buffer)))) 

Wahrscheinlich für eine eval-ähnliche Funktion suchen, die neben Nebeneffekt auch Ergebnis des letzten Ausdrucks zurückgibt.

Irgendeine Idee?

+0

(a) Sie sollten die Dokumentation von 'eval-buffer', ohne zusätzliche Argumente Ausgang wird verworfen (b) das zweite Argument' define-Auto-insert' muss sein, eine Funktion lesen, könnten Sie eine Lambda-Form für eine anonyme Funktion. –

+0

Sie haben Recht mit dem EVAL-Puffer, ich suchte nach einer alternativen Version, die das letzte Ausdrucksergebnis zurückgibt. Übrigens. Wie könnte Lambda als zweites Argument in diesem Fall helfen - dh. eine externe elisp-Datei auswerten? –

+0

Ich meinte nur, Sie müssen möglicherweise den aufrufenden Code in eine "(Lambda() ...)", so dass es eine anonyme Funktion ist. –

Antwort

3

Variable Mit den Daten zu teilen, ist leichter und häufiger, zum Beispiel:

;; content of ~/my_template.el 
(defvar my-template '(this is a list)) 

;; content of .emacs where result of my_template.el has to be used 
(load-file "~/my_template.el") 
(define-auto-insert "\.ext$" 
    my-template) 

aktualisieren die Funktion eval-file tun sollten, was Sie wollen:

;; content of ~/my_template.el 
'(this is a list) 

(defun eval-file (file) 
    "Execute FILE and return the result of the last expression." 
    (load-file file) 
    (with-temp-buffer 
    (insert-file-contents file) 
    (emacs-lisp-mode) 
    (goto-char (point-max)) 
    (backward-sexp) 
    (eval (sexp-at-point)))) 

(eval-file "~/my_template.el") 
=> (this is a list) 

aktualisieren

zwei: ohne den letzten Ausdruck zweimal auszuwerten

(defun eval-file (file) 
    "Execute FILE and return the result of the last expression." 
    (eval 
    (ignore-errors 
    (read-from-whole-string 
     (with-temp-buffer 
     (insert-file-contents file) 
     (buffer-string)))))) 

(eval-file "~/my_template.el") 
=> (this is a list) 
+0

Danke. Ich habe schon eine Idee, dies durch eine Variable zu lösen, nur neugierig, ob es auf eine elegantere funktionale Weise gelöst werden kann. –

+0

@DavidUnric Dies ist das erste Mal, dass ich von dem Ergebnis von ** einer Datei ** gehört habe und das Ergebnis des letzten Ausdrucks ist nicht sehr nützlich oder verwertbar, also denke ich, dass es keine existierende Funktion gibt, um das zu tun, was Sie wollen Ich kenne einen unangenehmen Weg. – xuchunyang

+0

Ich habe nicht in (e) Lisp gearbeitet, aber in Ruby/Python wird es manchmal nützlich, eval-Datei, wo Rückgabewert ist das Ergebnis der letzten Ausdruck/explizite Rückkehr. Ich denke, es ist nicht viel weniger zuverlässig, als diese Datei zu laden. –

1

Sie aus einer Zeichenfolge nicht lesen. Aus einem Puffer lesen.

(defun load&return (file &optional msgp) 
    "Load FILE. Return the value of the last sexp read." 
    (interactive "fFile: \np") 
    (let* ((sexp (with-current-buffer (find-file-noselect file) 
        (goto-char (point-min)) 
        (read (current-buffer)))) 
     (val (ignore-errors (eval sexp)))) 
    (prog1 val (when msgp (message "Value: %S" val))))) 
Verwandte Themen