Cuando hay un error en uno de mis archivos init, recibo un mensaje vago como este cuando ejecuto Emacs:
Warning (initialization): An error occurred while loading /Users/im/.emacs.d/init.elc:
(wrong-type-argument listp helm-find-files-actions)
No me dice cuál de mis muchos archivos de configuración contiene el error o qué línea. Buscar mis archivos no ayuda porque, adivina qué, la función en helm-find-files-actions
realidad no aparece en ninguno de mis archivos init. Para rastrear la línea de código ofensiva, tengo que hacer $ emacs --debug-init
.
¿No hay forma de que Emacs me diga automáticamente dónde está la línea ofensiva sin tener que abandonar y correr $ emacs --debug-init
? Sé que puedo bisecar + evaluar los archivos manualmente, pero eso es aún más lento. Sería mucho mejor si, cuando hay un error en uno de mis archivos de inicio, Emacs podría:
- dime qué archivo de inicio
- dime el número de línea que contiene el error
- idealmente, abra ese archivo de inicio y lléveme a la línea ofensiva
¿Es esto posible con Emacs, o estoy viviendo en un mundo de fantasía?
(setq debug-on-error t)
y luego evaluar suinit.el
nuevo, por ejemplo, ábralo y escribaM-x eval-buffer
.debug-init
automáticamente para el siguiente arranque siempre que cambie su archivo de inicio ...--debug-init
:)--debug-init
de forma predeterminada?Respuestas:
¡Incorrecto! Así que ignoraré la parte " sin relanzar " del título de su pregunta.
Esto es común y clásico, como lo es la solución: búsqueda binaria . Si encender
debug-on-error
y usar la opción--debug-init
no ayuda, entonces haga esto:Biseccione su archivo de inicio de forma recursiva, para ubicar la pequeña parte responsable del problema.
Eso es todo. La búsqueda binaria es muy rápida, poderosa y simple. Las personas lo evitan con demasiada frecuencia, pensando que pueden resolver el problema más rápido.
Para bisecar su archivo de inicio de forma recursiva:
Comenta la mitad. Puede usar
M-x comment-region
para comentar la región del texto seleccionado. (Puede descomentar la regiónC-u
con el mismo comando. (Por conveniencia, puede vincularcomment-region
a una tecla).Inicia Emacs. ¿Viste el mismo problema? En caso afirmativo, el problema no es causado por la parte que comentó. Si no, entonces lo es.
Para la parte problemática: comente la otra parte y la mitad de la parte problemática.
Repita # 2 y # 3, una y otra vez. No toma mucho tiempo: 1/2, 3/4, 7/8, 15/16, 31/32, 63/64, 127/128, 255/256, 511/512, 1023/1024, ...
No importa cuán grande sea su archivo de inicio o cuánto otro código cargue (si el problema está en otro código, repita el mismo proceso en ese archivo, etc.).
De hecho, cuanto mayor sea el montón de código que intenta buscar, más le ayudará la búsqueda binaria.
fuente
Respuesta simple: simplemente abra su archivo init.el y haga un
M-x eval-buffer
. Hago esto todo el tiempo para depurar archivos initfuente
Simplemente puede cargar su archivo de inicio en un búfer y Cx Ce para evaluar cada expresión s y descubrir cuál explota.
Sé que eso no es lo ideal, pero si estás dispuesto a reiniciar, es lo que haría.
fuente