【问题标题】:Load and activate of Emacs package.el加载并激活 Emacs package.el
【发布时间】:2016-01-13 02:19:10
【问题描述】:

我有类似的东西(简化)

(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 将包的内容目录添加到加载路径,并评估名称自动加载中的自动加载定义。埃尔。而activate 是“完全require”。我知道如果我将(package-initialize t) 更改为(package-initialize) 一切都会好起来的。

我确认"/Users/gaki/.emacs.d/elpa/helm-20160112.258" 之类的内容在load-path 中,而helm-modeautoload。不是可以自动加载甚至在after-init-hook吗?

【问题讨论】:

  • 这个问题不清楚(对我来说)。你能澄清你在问什么吗?如果您要求对软件包系统进行解释,那么这不适合本网站(通常用于特定的问答)。猜测您不清楚的内容并尝试解释它太宽泛了。但是,如果您可以提出一个更具体的问题,那么它也许可以成立。
  • 您不需要将 elpa 目录(或其子目录)添加到加载路径,包系统会在正确配置后执行此操作。

标签: emacs emacs24 dot-emacs


【解决方案1】:

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

你已经告诉 Emacs 不要使用 (package-initialize t) 激活任何包,并且你已经阻止它在使用 (setq package-enable-at-startup nil) 加载你的 init 文件后激活它们,所以 Emacs 不知道你的包自动加载。

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

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

附言激活不会require 包功能——如果激活了,自动加载将没有任何意义——所以这不应该花费很多时间,除非你有一个 非常 大的包裹数量?您实际上在这里看到了什么样的时差? (https://emacs.stackexchange.com/a/19263/454 可能有助于回答这个问题。)

【讨论】:

  • 感谢您的回答!我相信在load 之后,load-path 将被设置,autoload 将被读取,如果activate 将是fully require。现在我知道如果NO-ACTIVATE,emacs 本身不会读取autoloads。我尝试加快 emacs 启动速度,包 esup 告诉我 (package-initialize) 是瓶颈。经过一番谷歌搜索,我发现(package-initialized t) 可能是一个解决方案。但是use-package 包似乎会为:commands:bind 中指定的项目添加autoload。即使我在:commands 部分添加了helm-mode,错误仍然存​​在。
  • 我无法想象任何节省时间(肯定非常小?!)阻止程序包激活将值得您的程序包未正确配置的麻烦。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多