¿Cómo compilo byte todo en mi directorio .emacs.d?

138

He decidido visitar Emacs y me ha gustado mucho. Ahora, estoy usando el Kit de inicio de Emacs , que proporciona mejores valores predeterminados y algunas personalizaciones agradables para la instalación predeterminada de Emacs.

Lo personalicé un poco, agregué algunas cosas como yasnippet , temas de color , sin consolidar y otras cosas. He configurado un repositorio de github donde guardo todas las personalizaciones para poder acceder a ellas desde múltiples lugares o en caso de que algo salga mal y pierda mi directorio .emacs.d.

Todo esto es muy bueno, pero hay un problema: Emacs tarda unos 1-2 segundos en cargarse. AFAIK Puedo compilar archivos .el individuales con Mx byte-compile-file a .elc, y funciona. Pero hay muchos archivos .el, y me pregunto si hay una manera de compilarlos todos con un simple comando o algo así, para acelerar la carga de Emacs. Mi Emacs no siempre está abierto, y lo abro y cierro con bastante frecuencia, especialmente después de configurarlo como editor predeterminado para el comando de edición en Total Commander para acostumbrarme más rápido (sí, Windows XP aquí).

Mi versión de Emacs es la 22.3. Y sí, la instalación predeterminada de Emacs sin ninguna personalización se activa instantáneamente.

No estoy seguro de qué versión se prefiere al cargar, el .el o .elc compilado uno por cierto Oo

Entonces, ¿hay un comando elisp o un interruptor de línea de comando Emacs para hacer que Emacs compile en bytes todo en el directorio .emacs.d?

Mikka
fuente

Respuestas:

208

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

compilará todos los archivos .el en el directorio y en todos los subdirectorios a continuación.

La C-u 0parte es hacer que no pregunte sobre todos los archivos .el que no tienen una contraparte .elc.

Laurynas Biveinis
fuente
9
Y a partir de entonces (una vez que cada uno se haya compilado una vez), simplemente use el mismo comando sin el C-u 0(alias C-0, por cierto). Eso compilará byte solo aquellos archivos fuente que son más recientes que sus versiones compiladas por byte.
Drew
1
Una pequeña nota: para mí, eso no funcionó hasta que eliminé todos los archivos correspondientes ".elc". Simplemente decía algo como «Listo, 0 archivos combinados, archivos α omitidos».
Hola Ángel
1
@ Hola, Ángel, tengo el mismo problema. ¿Has encontrado alguna solución?
zhanxw
@zhanxw sí. Lamentablemente, el comando solo compila archivos que han cambiado o no tienen una contraparte «.elc». Entonces, para volver a compilar todo en un directorio, primero debe eliminar todos los archivos «.elc».
Hola Ángel
2
Lamentablemente, el comando interactivo no lo expone, pero si llama a la función directamente, puede usar el argumento opcional FORCEpara recompilar archivos que ya tienen un ".elc" asociado, incluso si no son más antiguos que el archivo fuente:M-: (byte-recompile-directory "/the/directory/" 0 t)
jbm
44

Para compilar byte automáticamente todo lo que necesita compilación de bytes cada vez que inicio emacs, coloco lo siguiente después de mis cambios load-pathen la parte superior de mi .emacsarchivo:

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

Sorprendentemente, no agrega mucho a mi tiempo de inicio (a menos que sea necesario compilar algo).

Para acelerar mis emacs, primero identifiqué las partes lentas usando profile-dotemacs.el y luego las reemplacé con autocargas .

Richard Hansen
fuente
la documentación de autocargos se ha movido. Eso y la referencia profile-dotemacs.el son exactamente lo que necesitaba cuando encontré esta página.
Digicrat
24

Puede usar la --batchbandera para volver a compilar desde la línea de comandos.

Para recompilar todo, haz

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

o para recompilar un solo archivo a partir de un Makefile,

emacs --batch --eval '(byte-compile-file "your-elisp-file.el")'
Mike Samuel
fuente
55
utilice en su lugar la compilación por bytes .
npostavs
1
¿Podrías saber cómo usarlo?
nacho4d
8
@ nacho4d emacs -Q --batch -f batch-byte-compile *.el foo/*.el: sin embargo, no se repite como byte-recompile-directory .
Brian Burns
3
Probablemente desee agregar un argumento para forzar la recompilación, por ejemplo. emacs --batch --eval '(byte-recompile-directory "~ / .emacs.d" 0)'
Ibrahim
17

Esto se está desviando un poco de la pregunta, pero para resolver el problema de cargar lentamente, puede usar la nueva función de daemon en Emacs 23.

"Si tiene muchos paquetes de soporte, el inicio de emacs puede ser un poco lento. Sin embargo, emacs 23 trae emacs --daemon, que le permite iniciar emacs en segundo plano (por ejemplo, cuando inicia sesión). Puede hacer estallar instantáneamente hasta nuevas ventanas (marcos) de emacs con emacsclient. Por supuesto, ya podría tener un 'servidor' de emacs en versiones anteriores, pero poder iniciarlo en segundo plano hace que esta sea una solución mucho mejor "

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

mwilliams
fuente
Definitivamente voy a comprobar esto. ¡Gracias!
Mikka el
2
Si agrega alias emacs = 'emacsclient -nw -a "" -c' a su .bashrc (o la versión de su shell), primero intentará conectarse a un demonio en ejecución si hay uno, si no, comenzará uno y se conectará tú.
Frederick
2

Para mi uso de spacemacs, el comando es spacemacs/recompile-elpa. El comando byte-recompile-directoryno compila ningún archivo.

Yu Shen
fuente
2
Cosas diferentes. El material ELPA / MELPA ha definido métodos de construcción en su propia jerarquía de archivo. byte-recompile-directory intenta compilar todos los archivos .el en un directorio definido por el usuario.
RichieHH