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