¿Puedo evitar archivos elisp compilados por bytes obsoletos?
27
Ocasionalmente, cuando inicio Emacs, recibo un mensaje como.
Archivo fuente `/home/USER/.emacs.d/elpa/....el 'más nuevo que el archivo compilado por bytes
Además, a veces edito un paquete que estoy desarrollando y olvido recompilarlo. Cuando intento cargar el nuevo archivo, me lleva un tiempo darme cuenta de que Emacs todavía está usando el archivo compilado anterior.
¿Hay alguna manera de decirle a Emacs que evite por completo los archivos compilados por bytes que son más antiguos que sus respectivos archivos fuente?
No hay una forma integrada de evitar que se carguen estos archivos antiguos, pero hay formas fáciles de deshacerse de ellos.
Usted puede volver a compilar todo el directorio elpa llamando al: M-x byte-recompile-directory RET ~/.emacs.d/elpa/.
Esto debería deshacerse de los archivos obsoletos.
Puede usar el
paquete de compilación automática y activar el auto-compile-on-load-modecual puede compilar archivos antes de que se carguen.
Emacs 24.4
Sí, y resulta ser bastante simple. La load-prefer-newer
variable sirve precisamente para este propósito.
(setq load-prefer-newer t)
Desafortunadamente, no funcionará cuando algún código se dirija específicamente al
.elcarchivo, como (load "server.elc"). Pero debería ser suficiente siempre que esté usando requires o llamando loadsin sufijo, lo que debería.
Del documento:
load-prefer-newer es una variable definida en lread.c.
Su valor es nulo
Documentación:
No nulo significa que la carga prefiere la versión más reciente de un archivo.
Esto se aplica cuando un sufijo de nombre de archivo no se especifica explícitamente y load está probando varios sufijos posibles (consulte sufijos de carga y sufijos de repetición de archivo de carga). Normalmente, se detiene en el primer archivo que existe a menos que especifique explícitamente uno u otro. Si esta opción no es nula, verifica todos los sufijos y usa el archivo más nuevo.
Tenga en cuenta que si personaliza esto, obviamente no afectará a los archivos que se cargan antes de que se lean sus personalizaciones.
auto-compileInstaría a las personas a usar la biblioteca (¡excelente!) En Emacs 24.4+, así como a continuación. Es una verdadera solución de configurar y olvidar. load-prefer-newersolo garantiza que continuará ejecutando código lento sin compilar después de que su código compilado se desactualice.
phils
1
@phils Hoy en día el código de bytes no es mucho más rápido que el código fuente simple, gracias a la ansiosa expansión de macros.
lunaryorn
Los cambios que hice en org-agenda-sorting-strategy (en org-agenda.el) no se reflejaron después de un reinicio, pero recompilar los archivos .elc como se describe en la respuesta resolvió el problema.
Earlio
17
Si solo configura load-prefer-newer(cuando esté disponible), se cargará el código correcto, pero es posible que no se haya compilado en bytes, por lo que puede haber una ligera penalización de rendimiento.
Puede utilizar la excelente biblioteca de autocompilación de Jonas Bernoulli para asegurarse de que este problema no surja. En particular, auto-compile-on-load-moderecompilará los .elcarchivos obsoletos antes de cargarlos.
Además, a veces edito un paquete que estoy desarrollando y olvido recompilarlo. Cuando intento cargar el nuevo archivo, me lleva un tiempo darme cuenta de que Emacs todavía está usando el archivo compilado anterior.
¿Puedo sugerir agregar un gancho en su archivo de inicio?
Whoah, eso intentaría compilar byte incluso buffers que no sean elisp. ¡No es ideal! La forma sólida de hacerlo es con el paquete de compilación automática.
auto-compile
Instaría a las personas a usar la biblioteca (¡excelente!) En Emacs 24.4+, así como a continuación. Es una verdadera solución de configurar y olvidar.load-prefer-newer
solo garantiza que continuará ejecutando código lento sin compilar después de que su código compilado se desactualice.Si solo configura
load-prefer-newer
(cuando esté disponible), se cargará el código correcto, pero es posible que no se haya compilado en bytes, por lo que puede haber una ligera penalización de rendimiento.Puede utilizar la excelente biblioteca de autocompilación de Jonas Bernoulli para asegurarse de que este problema no surja. En particular,
auto-compile-on-load-mode
recompilará los.elc
archivos obsoletos antes de cargarlos.fuente
Lo conocí en Internet hace mucho tiempo:
si trabaja con
FILE
emacs-lisp-mode y lo guarda, el código anterior se eliminaFILEc
si existe.fuente
¿Puedo sugerir agregar un gancho en su archivo de inicio?
O, si desea aplicar el gancho solo en los archivos el:
fuente