Comment puis-je tout compiler en octets dans mon répertoire .emacs.d?

138

J'ai décidé de vérifier Emacs, et j'ai beaucoup aimé. Maintenant, j'utilise le kit de démarrage Emacs , qui fournit en quelque sorte de meilleurs paramètres par défaut et de belles personnalisations pour l'installation par défaut d'Emacs.

Je l'ai un peu personnalisé, ajouté des trucs comme yasnippet , des thèmes de couleurs , non liés et d'autres choses. J'ai mis en place un référentiel github dans lequel je conserve toutes les personnalisations afin de pouvoir y accéder à partir de plusieurs endroits ou au cas où quelque chose se passerait mal et que je perdrais mon répertoire .emacs.d.

Tout cela est très agréable, mais il y a un problème: Emacs prend environ 1 à 2 secondes à se charger. AFAIK Je peux compiler des fichiers .el individuels avec Mx byte-compile-file en .elc, et cela fonctionne. Mais il y a beaucoup de fichiers .el, et je me demande s'il y a un moyen de tous les compiler avec une simple commande ou quelque chose, pour accélérer le chargement d'Emacs. Mon Emacs n'est pas toujours ouvert, et je l'ouvre et le ferme assez fréquemment, surtout après l'avoir configuré comme éditeur par défaut pour la commande d'édition dans Total Commander pour m'y habituer plus rapidement (ouais, windows xp ici).

Ma version Emacs est la 22.3. Et oui, l'installation par défaut d'Emacs sans aucune personnalisation se déclenche instantanément.

Je ne sais pas quelle version est préférée lors du chargement, le .el ou le .elc compilé d'ailleurs Oo

Alors, y a-t-il une commande elisp ou un commutateur de ligne de commande Emacs pour que Emacs compile tous les octets dans le répertoire .emacs.d?

Mikka
la source

Réponses:

208

C-u 0 M-x byte-recompile-directory

compilera tous les fichiers .el dans le répertoire et dans tous les sous-répertoires ci-dessous.

La C-u 0partie est de ne pas poser de questions sur tous les fichiers .el qui n'ont pas d'équivalent .elc.

Laurynas Biveinis
la source
9
Et par la suite (une fois que chacun a été compilé une fois), utilisez simplement la même commande sans le C-u 0(aka C-0, BTW). Cela ne compilera en octets que les fichiers source qui sont plus récents que leurs versions compilées en octets.
Tiré le
1
Une petite note: pour moi, cela n'a pas fonctionné jusqu'à ce que j'ai supprimé tous les fichiers «.elc» correspondants. Il a juste dit quelque chose comme «Terminé, 0 fichier comilé, α fichiers sautés».
Hi-Angel
1
@ Salut-Angel, j'ai le même problème. Avez-vous trouvé une solution?
zhanxw
@zhanxw ouais. Malheureusement, la commande ne compile que les fichiers qui ont soit changé, soit n'ont pas d'équivalent «.elc». Donc pour tout recompiler dans un répertoire, vous devez d'abord supprimer tous les fichiers «.elc».
Hi-Angel
2
La commande interactive ne l'expose malheureusement pas, mais si vous appelez directement la fonction, vous pouvez utiliser l'argument optionnel FORCEpour recompiler les fichiers qui ont déjà un ".elc" associé même s'ils ne sont pas plus anciens que le fichier source:M-: (byte-recompile-directory "/the/directory/" 0 t)
jbm
44

Pour compiler automatiquement tout ce qui nécessite une compilation d'octets à chaque fois que je lance emacs, je mets ce qui suit après mes modifications en load-pathhaut de mon .emacsfichier:

(byte-recompile-directory (expand-file-name "~/.emacs.d") 0)

Étonnamment, cela n'ajoute pas grand-chose à mon temps de démarrage (sauf si quelque chose doit être compilé).

Pour accélérer mes emacs, j'ai d'abord identifié les pièces lentes en utilisant profile-dotemacs.el , puis je les ai remplacées par des autoloads .

Richard Hansen
la source
la documentation de chargement automatique a été déplacée. Cela et la référence profile-dotemacs.el sont exactement ce dont j'avais besoin lorsque je suis tombé sur cette page.
Digicrat
24

Vous pouvez utiliser l' --batchindicateur pour recompiler à partir de la ligne de commande.

Pour tout recompiler, faites

emacs --batch --eval '(byte-recompile-directory "~/.emacs.d")'

ou pour recompiler un seul fichier à partir d'un Makefile,

emacs --batch --eval '(byte-compile-file "your-elisp-file.el")'
Mike Samuel
la source
5
utilisez plutôt la compilation par lots .
npostavs
1
Pourriez-vous comment l'utiliser?
nacho4d
8
@ nacho4d emacs -Q --batch -f batch-byte-compile *.el foo/*.el- il ne se répète pas comme le fait le répertoire octet-recompile .
Brian Burns
3
Vous voudrez probablement ajouter un argument pour forcer la recompilation, par exemple. emacs --batch --eval '(byte-recompile-directory "~ / .emacs.d" 0)'
Ibrahim
17

Ceci est un peu différent de la question, mais pour résoudre le problème du chargement lent, vous pouvez utiliser la nouvelle fonctionnalité démon d'Emacs 23.

«Si vous avez beaucoup de packages de support, le démarrage d'emacs peut être un peu lent. Cependant, emacs 23 apporte emacs --daemon, qui vous permet de démarrer emacs en arrière-plan (par exemple lorsque vous vous connectez). Vous pouvez instantanément apparaître de nouvelles fenêtres emacs (cadres) avec emacsclient. Bien sûr, vous pourriez déjà avoir un 'serveur' emacs dans les anciennes versions, mais pouvoir le démarrer en arrière-plan en fait une solution beaucoup plus agréable "

De http://emacs-fu.blogspot.com/2009/07/emacs-23-is-very-near.html

mwilliams
la source
Je vais certainement vérifier celui-ci. Je vous remercie!
Mikka
2
Si vous ajoutez l'alias emacs = 'emacsclient -nw -a "" -c' à votre .bashrc (ou à la version de votre shell), il essaiera d'abord de se connecter à un démon en cours d'exécution s'il y en a un, sinon il en démarrera un et se connectera tu.
Frederick
2

Pour mon utilisation de spacemacs, la commande est spacemacs/recompile-elpa. La commande byte-recompile-directoryne compile aucun fichier.

Yu Shen
la source
2
Différentes choses. ELPA / MELPA stuff a défini des méthodes de construction dans sa propre hiérarchie d'archives. byte-recompile-directory essaie de compiler tous les fichiers .el dans un répertoire défini par l'utilisateur.
RichieHH