It seems to me that the new Package system that is built-in on Emacs 24 has some flaws when it comes to properly loading and initializing the installed packages.
Recently, I upgraded to Emacs 24.1.1 which was realeased on 6/10/2012 and I have been trying to use the built-in package system and have installed several packages using it, but they all have a similar problem related to autoload and initialization.
For example, I use a package called smex
which provides enhancements for using the M-x
chord. It requires you to define a key for M-x
, so I added (global-set-key (kbd "M-x") 'smex)
in my init.el
file. But after starting emacs I press the M-x
chord and I get the message "Symbol's function definition is void: smex" … If I also put (require 'smex)
in my init.el file I get the error message "File error: Cannot open load file, smex"
Adding the location of smex to the load-path variable makes it work as expected, however, that seems to defeat the whole purpose of having a package system in the first place…
Any thoughts? Is there a better way or do we live with this limitation for now?
Best Answer
It's worth noting why Emacs defers the package initialization:
See C-hig
(emacs) Package Installation
RET, and in particular:So provided you make sure that your init file takes care of any non-default values you want for variables in the
package
customization group1 before callingpackage-initialize
-- and that you maintain this approach whenever customizing the package library config -- it should be okay to do this.Alternatively, because
after-init-hook
runs after the standard package initialization has completed, you could use that to evaluate any init code which depends upon packages. So instead of callingpackage-initialize
directly in init.el, you could instead write:putting the code requiring the initialized package system within that function.
YMMV.
(n.b. I haven't tested the after-init approach, as I don't really use package.el; but I did confirm the sequence of events in the start-up code, so I believe it will work as described.)
1 M-x
customize-group
RETpackage
RET