Emacs: Лучшая практика для ленивых режимов загрузки в .emacs?

Есть ли оптимальная практика в отношении ленивых режимов загрузки при обнаружении соответствующего расширения файла?

На данный момент у меня установлено примерно 25 различных режимов Emacs, и запуск стал медленным. Например, хотя хорошо иметь наготове clojure-mode, я редко использую его и хочу вообще избежать его загрузки, если я не открою файл с расширением .clj. Такая функция "ленивого запроса" кажется правильным способом настройки режима в целом.

Я ничего не нашел в Интернете, поэтому сам попробовал.

Вместо:

(require 'clojure-mode)
(require 'tpl-mode) 

У меня есть это:

(defun lazy-require (ext mode)
  (add-hook
   'find-file-hook
   `(lambda ()
      (when (and (stringp buffer-file-name)
                 (string-match (concat "\\." ,ext "\\'") buffer-file-name))
        (require (quote ,mode))
        (,mode)))))

(lazy-require "soy" 'soy-mode)
(lazy-require "tpl" 'tpl-mode)

Кажется, это работает (я новичок в elisp, поэтому комментарии приветствуются!), Но меня нервирует то, что я не нашел ничего написанного на эту тему в Интернете. Это разумный подход?


person Rob    schedule 04.08.2011    source источник


Ответы (2)


Нужное вам средство называется автозагрузкой. clojure-mode исходный файл, clojure-mode.el, включает комментарий о том, как это организовать:

;;     Add these lines to your .emacs:
;;       (autoload 'clojure-mode "clojure-mode" "A major mode for Clojure" t)
;;       (add-to-list 'auto-mode-alist '("\\.clj$" . clojure-mode))
person Sean    schedule 04.08.2011
comment
Также обратите внимание, что многие пакеты предоставляют автозагрузку; есть встроенные механизмы для сбора кода, такие как Шон предоставил из установленных вами библиотек. Кроме того, если вы устанавливаете пакеты из ELPA или Marmalade с помощью package.el, автозагрузка будет настроена для вас автоматически. - person sanityinc; 04.08.2011
comment
Приятно, совершенно не заметил этого. Спасибо! - person Rob; 04.08.2011

Это один путь,

(provide 'my-slime)
(eval-after-load "slime"
  '(progn
     (setq slime-lisp-implementations
           '((sbcl ("/usr/bin/sbcl"))
             (clisp ("/usr/bin/clisp")))
           common-lisp-hyperspec-root "/home/sujoy/documents/hyperspec/")
     (slime-setup '(slime-asdf
                    slime-autodoc
                    slime-editing-commands
                    slime-fancy-inspector
                    slime-fontifying-fu
                    slime-fuzzy
                    slime-indentation
                    slime-mdot-fu
                    slime-package-fu
                    slime-references
                    slime-repl
                    slime-sbcl-exts
                    slime-scratch
                    slime-xref-browser))
     (slime-autodoc-mode)
     (setq slime-complete-symbol*-fancy t)
     (setq slime-complete-symbol-function 'slime-fuzzy-complete-symbol)
(add-hook 'lisp-mode-hook (lambda () (slime-mode t)))))

(require 'slime)

вместе с,

;; slime mode
(autoload 'slime "my-slime" "Slime mode." t)
(autoload 'slime-connect "my-slime" "Slime mode." t)
person Sujoy    schedule 04.08.2011