加载并激活Emacs package.el

时间:2016-01-13 02:19:11

标签: emacs emacs24 dot-emacs

我有类似的东西(简化)

(require 'package)

(setq package-archives
      '(("org"          . "http://orgmode.org/elpa/")
        ("melpa"        . "http://melpa.org/packages/")
        ("melpa-stable" . "http://stable.melpa.org/packages/")
        ("gnu"          . "http://elpa.gnu.org/packages/")))

(setq package-enable-at-startup nil)
(package-initialize t)

(unless (package-installed-p 'use-package)
  (package-refresh-contents)
  (package-install 'use-package))

(let ((default-directory (expand-file-name user-emacs-directory "elpa")))
 (normal-top-level-add-subdirs-to-load-path))

(require 'use-package)

(use-package helm
  :ensure t
  :commands (helm-M-x
         helm-mini
         helm-find-files
         helm-show-kill-ring)
  :init
  (add-hook 'after-init-hook 'helm-mode)

  :config
    (helm-autoresize-mode 1))

在我的.emacs中。但是在启动emacs后我被告知Symbol's function definition is void: helm-mode

在阅读Packaging Basicsthis answer手册后,我发现我仍然不了解package.el的机制。

我注意到手册中使用了loadactivate这两个词,我想load是' Emacs将包的内容目录添加到load-path,并且评估name-autoloads.el中的自动加载定义。'并activate完全require'。我知道如果我将(package-initialize t)更改为(package-initialize),一切都会好的。

我确认"/Users/gaki/.emacs.d/elpa/helm-20160112.258"load-pathhelm-mode autoload之类的内容是after-init-hook。它是否可以自动加载,甚至在html, body { width: 100%; height: 100%; overflow-x: hidden; position: relative; }

1 个答案:

答案 0 :(得分:2)

查看package-activate及其帮助程序package-activate-1的代码,表明除非程序包已被“激活”,否则不会加载程序包的自动加载文件。

您告诉Emacs不要使用(package-initialize t)激活任何软件包,并且在使用(setq package-enable-at-startup nil)加载init文件后阻止它激活它们,因此您的软件包自动装载都不会被识别到Emacs。

我建议将(package-initialize t)更改为(package-initialize)

请注意,您链接的文档将NO-ACTIVATE参数描述为“仅供内部使用”。

P.S。激活不require软件包功能 - 如果自动加载没有任何意图 - 所以这不应该花费很长时间,除非你有一个真的大量的包裹?你实际看到的是什么样的时差? (https://emacs.stackexchange.com/a/19263/454可能有助于回答这个问题。)