emacs23 / elisp: jak poprawnie autoloadować bibliotekę?

Uaktualniam do emacs23. Uważam, że mój emacs.el ładuje się znacznie wolniej.

To naprawdę moja wina... Mam tam dużo rzeczy.

Więc staram się również automatycznie ładować wszystko, co jest obecnie "wymagane" przez mój emacs.el.

Mam moduł, który wyświetla 12 punktów wejścia-interaktywne funkcje, które mogę wywołać.

Jest poprawnym podejściem, aby mieć 12 wywołań do autoload w celu zapewnienia, że moduł zostanie załadowany niezależnie od funkcji I zadzwonić? Czy są jakieś problemy z takim podejściem? Czy przedstawi problemy z wydajnością?

Jeśli nie to podejście, to co?

Author: Cheeso, 2010-11-16

3 answers

Naprawdę chcesz, aby autoloads generowane dla ciebie automatycznie, tak, że Twój .plik emacs pozostaje nieskazitelny. Większość pakietów ma już w sobie linie ;;;###autoload, a jeśli nie, możesz je łatwo dodać.

Aby tym zarządzać, możesz umieścić wszystkie pakiety w katalogu, powiedzmy ~/emacs/lisp, i tam mieć plik o nazwie update-auto-loads.el, który zawiera:

;; put this path into the load-path automatically
;;;###autoload
(progn
  (setq load-path (cons (file-name-directory load-file-name) load-path)))

;;;###autoload
(defun update-autoloads-in-package-area (&optional file)
  "Update autoloads for files in the diretory containing this file."
  (interactive)
  (let ((base (file-truename
       (file-name-directory
        (symbol-file 'update-autoloads-in-package-area 'defun)))))
(require 'autoload)         ;ironic, i know
(let ((generated-autoload-file (concat base "loaddefs.el")))
  (when (not (file-exists-p generated-autoload-file))
    (with-current-buffer (find-file-noselect generated-autoload-file)
      (insert ";;") ;; create the file with non-zero size to appease autoload
      (save-buffer)))
  (cd base)
  (if file
      (update-file-autoloads file)
    (update-autoloads-from-directories base)))))

;;;###autoload
(defun update-autoloads-for-file-in-package-area (file)
  (interactive "f")
  (update-autoloads-in-package-area file))

Jeśli dodasz 'update-autoloads-in-package-area do swojego kill-emacs-hook, wtedy loaddefs.el będzie automatycznie aktualizowana przy każdym wyjściu z Emacsa.

I, aby to wszystko połączyć, dodaj to do swojego .emacs:

(load-file "~/emacs/lisp/loaddefs.el")

Teraz, po pobraniu nowego pakietu, po prostu zapisz go w katalogu ~/emacs/lisp, zaktualizuj loaddefs poprzez M-x update-autoloads-in-package-area (lub wyjdź z Emacsa), a będzie on dostępny przy następnym uruchomieniu Emacsa. Nigdy więcej zmian w twoim .emacs, aby załadować rzeczy.

Zobacz inne alternatywy dla przyspieszenia uruchamiania Emacsa: Jak mogę przyspieszyć uruchamianie Emacsa?

 22
Author: Trey Jackson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:31:35

Kogo obchodzi, jak powoli się zaczyna?

Uruchom go przez emacs --daemon &, a następnie połącz za pomocą jednego z

  • emacsclient -c /some/file.ext, lub
  • emacsclient -nw

Utworzyłem dla obu aliasów odpowiednio emx i emt. Kontynuowanie sesji edycji jest o wiele bardziej rozsądne...

 4
Author: Dirk Eddelbuettel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-11-15 21:59:01

Najlepiej, aby nie mieć żadnych load lub require w pliku .emacs.

Powinieneś zamiast tego używać autoload...

Np.

(autoload 'slime-selector "slime" t)

Będziesz musiał użyć eval-after-load, aby zrobić konfigurację biblioteki, ale wynik jest taki, że nie będziesz musiał czekać, aż to wszystko załaduje się z góry, lub powodować błędy w wersjach Emacsa, które nie mają tej samej funkcjonalności. (np. na bazie terminala lub innej platformy itp.)

Chociaż może to nie mieć wpływu na Ciebie w tej chwili, szanse czy, w przyszłości będziesz chciał użyć tego samego config na wszystkich maszynach / środowiskach, w których używasz Emacs, więc to bardzo dobrze, aby twój config gotowy do lotu.

Użyj również (start-server) i otwórz zewnętrzne pliki do Emacs używając emacsclient - więc unikasz ponownego uruchamiania Emacsa.

 4
Author: ocodo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-11-15 22:36:54