¿Cómo hacer que Emacs localice el error en mi archivo de inicio sin reiniciar?

7

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-actionsrealidad 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:

  1. dime qué archivo de inicio
  2. dime el número de línea que contiene el error
  3. 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?

hombre incandescente
fuente
44
¿Qué hay de habilitar la depuración (sin relanzar) mediante la evaluación (setq debug-on-error t)y luego evaluar su init.elnuevo, por ejemplo, ábralo y escriba M-x eval-buffer.
ley
2
Esto parece ser un problema recurrente en las implementaciones de Lisp con la notable excepción de Racket, que se ha encargado de agregar soporte para las ubicaciones de origen. He realizado un pequeño truco para mostrar los números de línea en las trazas , tal vez eso ayude.
wasamasa
1
Quizás una pregunta separada, pero me pregunto si hay una manera de permitir debug-initautomáticamente para el siguiente arranque siempre que cambie su archivo de inicio ...
Glucas
2
@glucas En ese caso, mis emacs siempre comenzarán con --debug-init:)
Kaushal Modi
¿Hay alguna razón para no iniciar siempre Emacs --debug-initde forma predeterminada?
incandescentman

Respuestas:

3

Sé que puedo bisecar + evaluar los archivos manualmente, pero eso es aún más lento.

¡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-errory usar la opción --debug-initno 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:

  1. Comenta la mitad. Puede usar M-x comment-regionpara comentar la región del texto seleccionado. (Puede descomentar la región C-ucon el mismo comando. (Por conveniencia, puede vincular comment-regiona una tecla).

  2. Inicia Emacs. ¿Viste el mismo problema? En caso afirmativo, el problema no es causado por la parte que comentó. Si no, entonces lo es.

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

Dibujó
fuente
Exactamente. Digamos que buscar 100 toma 1 minuto. Con la búsqueda binaria, 100,000 líneas solo deberían tomar, como máximo, otro minuto. (Más o menos)
PythonNut
2

Respuesta simple: simplemente abra su archivo init.el y haga un M-x eval-buffer. Hago esto todo el tiempo para depurar archivos init

bpaul
fuente
Acabo de ver el comentario de @ lawist arriba. Habilitar la depuración antes de hacer esto es una buena idea
bpaul
1

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.

feoh
fuente