2014-01-06 5 views
6

Ich versuche, GNU Emacs 23 zu programmieren require Befehle faul, auf Anfrage, statt von vorne in meiner .emacs Datei. Wenn ich die Ausführung eines Befehls load verzögern wollte, könnte ich autoload verwenden. Aber require und load nehmen verschiedene Arten von Argumenten.Was Emacs Lisp Funktion ist `` require` `` autoload` soll `` laden``

Gibt es eine vordefinierte Funktion, die für require den gleichen Job ausführt, den autoload für load tut? Und wenn nicht, welche Werkzeuge würden Leute empfehlen, die ich benutze, um meine eigenen zu rollen?

+5

Können Sie ein Beispiel geben, wie Sie das verwenden würden, was Sie mit 'autoload' nicht tun könnten? – Barmar

+0

(könnte helfen) http://ergoemacs.org/emacs/elisp_library_system.html – AAAfarmclub

Antwort

6

Es gibt keinen Unterschied zwischen und load in Bezug auf autoload. require ist nur ein Frontend für load, die mehr oder weniger kommt es auf:

(defun require (feature &optional filename noerror) 
    (unless (featurep feature) 
    (let ((filename (or filename (symbol-name feature)))) 
     (load filename noerror)))) 

Wie Sie das Symbol Namen require gegeben sehen kann, ist gleich dem Dateinamen load gegeben. In der Tat ist die erste (require 'foo) in einer Emacs-Sitzung ausgewertet entspricht (load "foo").

So können Sie nur (auto-load 'foo-function "foo") aus der Bibliothek für foo-function verwenden foo, die Sie mit (require 'foo) laden können.

2

Welche "Nachfrage" haben Sie für Ihre "on demand"?

  1. Wenn ein gegebener Befehl oder ein andere Funktion benötigt (oder Soft Bedürfnisse) eine gegebene Bibliothek, dann die Funktion selbst (require 'foo) oder (require 'foo nil t) verwenden kann. Die Bibliothek wird bei Bedarf von dieser Funktion geladen.

  2. Beachten Sie auch, ob Sie die Datei möglicherweise mehrmals laden müssen, d. H. In einigen Situationen neu laden müssen, unabhängig davon, ob sie bereits geladen wurde oder nicht.

Für # 2, zum Beispiel, mein Code, der eine Bibliothek von Lisp-Makros verwendet, tritt icicles-mac.el nicht nur require verwenden, weil ich, dass sicherstellen möchten, wenn ein Benutzer erhält eine neue Version dieser Bibliothek (z. B. lädt eine neue Quellversion herunter und kompiliert sie in Byte), dann wird diese neue Version immer dann verwendet, wenn das Byte eine andere Bibliothek kompiliert, die sie benötigt. (Dies ist wichtig - wenn eine Bibliothek von Makros Änderungen, anderen Bibliotheken, die diese Makros verwenden in der Regel müssen nach dem Laden die neue Makros Datei neu kompiliert werden.) Dafür statt nur (require 'icicles-mac) ich verwenden:

(eval-when-compile 
    (or (condition-case nil 
      (load-library "icicles-mac") ; Use load-library to ensure latest .elc. 
     (error nil)) 
     (require 'icicles-mac)))   ; Require, so can load separately if not on `load-path'. 
4

Eine weitere Antwort zu verdeutlichen, (dies war ein wenig weitschweifig für einen Kommentar):

  • autoload sagt „, wenn diese Funktion noch nicht definiert ist, dann load diese Datei (falls und wenn die Funktion heißt). "
  • require sagt "wenn diese Bibliothek nicht bereits geladen ist, dann load diese Datei (sofort)."

Hinweis insbesondere, dass Sie nicht Notwendigkeitrequire zu verwenden, um eine Bibliothek zu laden, das ist einfach so, wie Sie sicherstellen, dass Sie es nicht erneut geladen werden (vorausgesetzt, Sie wollen nicht . tun) der (provide 'FEATURE) Ausdruck in der Bibliothek wird ganz gleich bewertet werden, wie die Bibliothek geladen wurde, was eine künftige require wissen lässt, dass es nichts zu tun braucht

es ist eine ähnliche Situation für autoload -. wenn die Datei wurde bereits geladen (und daher die fragliche Funktion richtig definiert), dann die Autoload-n o länger hat irgendeinen Effekt.