¿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?

Respuestas:


35

Emacs 24.3 o inferior

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.


1
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.


3

Lo conocí en Internet hace mucho tiempo:

;; If you're saving an elisp file, likely the .elc is no longer valid:
(add-hook 'emacs-lisp-mode-hook 'esk-remove-elc-on-save)
(defun esk-remove-elc-on-save ()
  "If you're saving an elisp file, likely the .elc is no longer valid."
  (make-local-variable 'after-save-hook)
  (add-hook 'after-save-hook
            (lambda ()
              (if (file-exists-p (concat buffer-file-name "c"))
                  (delete-file (concat buffer-file-name "c"))))))

si trabaja con FILEemacs-lisp-mode y lo guarda, el código anterior se elimina FILEcsi existe.


0

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?

(add-hook 'after-save-hook 'byte-compile-current-buffer)

O, si desea aplicar el gancho solo en los archivos el:

(add-hook 'emacs-lisp-mode-hook (lambda () (add-hook 'after-save-hook 'byte-compile-current-buffer nil t)))

99
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.
sanityinc
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.