2010-01-18 17 views
16

He sido un usuario regular de emacs durante aproximadamente 4 años, pero todavía soy un novato cuando se trata de personalizar emacs y solucionar problemas de elisp. Recientemente, comencé a personalizar emacs como mi entorno de desarrollo ruby ​​y aprendí algunas técnicas de la gente aquí en StackOverflow. Por ejemplo, alguien aquí me contó sobre C-u C-M-x para instrumentar una función con edebug y luego recorrer el código. También descubrí que la mayoría de los comandos y modos en emacs proporcionan toneladas de ganchos (ya sean funciones o expresiones regulares o variables personalizables) que proporcionarán la mayor parte de lo que cualquier novato querría.
Ahora soy codicioso: estoy buscando más técnicas y consejos que haya utilizado y haya encontrado útiles en el pasado.Técnicas de solución de problemas para Emacs y Emacs Lisp

Respuesta

13
(setq debug-on-error t) 
(setq debug-on-quit t) 

Aquellos ayuda cuando se quiere depurar problemas de profundidad arbitraria. Ya descubrió edebug (que es mi herramienta de elección para descifrar el código de otras personas). describe-function generalmente le da un enlace al archivo .el (junto con el número de línea) donde se cargó. Eso es útil para saltar al origen del problema. A menudo hago eso, copio la función, hago algunas llamadas al message y vuelvo a evaluar C-x C-e para que se ejecute en lugar del original.

Actualización: Esto es algo que recogí de presentation by John Wiegley.

(global-set-key (kbd "C-c C-d") 
     (lambda() (interactive) 
      (setq debug-on-error (if debug-on-error nil t)) 
      (message (format "debug-on-error : %s" debug-on-error)))) 

de que te permite alternar debug-on-error con una sola tecla.

+2

En cuanto a la edición, 'toggle-debug-on-error' existe por defecto :) – phils

+0

1 y gracias. Dice algo cuando es más fácil escribir el suyo que incluso pensar en buscar uno existente. :) –

5

C-x Esc Esc le ofrece un historial navegable de los comandos M-x que ha ejecutado, pero le muestra el código elisp.

IELM es una respuesta para emacs lisp.

Speedbar es una excelente manera de navegar por sus archivos .el, también me encuentro usando C-h con frecuencia (para navegar en el manual de elisp) y usando la barra de velocidad para explorar el árbol de nodos de los temas.

La búsqueda incremental C-s/C-r en el navegador de información realmente buscará saltos de página pasados.

A menudo ejecuto M-: para probar un poco de código rápido sin tener que cambiar a mi * Iielm * buffer.

Para código especialmente complicado, hago un acceso directo en mi escritorio para ejecutar emacs -q -l development-init.el (esto es especialmente útil con código que trata con manipulaciones de bajo nivel en almacenamientos intermedios y procesos externos, el tipo de cosas que pueden colgar emacs fácilmente o matarlo con un segv)

2

Si hackea su archivo .emacs, siempre deje en ejecución un proceso emacs y pruebe los cambios (con --debug-init) iniciando un segundo proceso de Emacs. De esta manera, si hay problemas, todavía tiene un editor en el que puede trabajar.

1

Por mi parte, prefiero (recomendar) debug sobre edebug, pero es probable que solo sea una cuestión de gusto.

Además de lo que Noufal mencionó sobre las variables debug-on-*, puede ingresar el depurador para una función dada a través del M-x debug-on-entry.

Y puede poner llamadas explícitas a debug en puntos de interrupción en el código: (debug) o (debug nil sexp-to-print).

0

Bienvenido a los primeros pasos de la iluminación.;)

En primer lugar, algunos golpes rápidos y fáciles:

(add-hook 'emacs-lisp-mode-hook 'turn-on-eldoc-mode) 

Esto le va a dar pequeños toques en el mini búfer. ¡Es extremadamente útil! Este consejo es menos acerca de la solución de problemas, y más acerca de hacer que sea fácil de escribir, pero aún así.

Obtenga el paquete de erepactor de MELPA y vea lo que hace. Noté que después de hacer un C-x C-e en una función, ejecutaba el resultado a través de elint. Ahorra mucha molestia

Este gancho del kit de inicio de emacs es increíble. Elimina cualquier archivo .elc no válido. Los viejos archivos elc pueden ser una verdadera espina en tu costado si no tienes cuidado. A la inversa, observe la compilación automática.

(add-hook 'emacs-lisp-mode-hook 'starter-kit-remove-elc-on-save) 

(defun starter-kit-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")))))) 

Por último, durante la edición de Lisp, Emacs-Lisp o esquema Asegúrese de dar paredit intentarlo. Es asombroso.

+0

Personalmente, creo que la eliminación de archivos .elc es una idea horrible. Instalaciones como 'byte-recompile-directory' solo compilan un archivo si existe un archivo .elc correspondiente (pero desactualizado), ¡por lo que eliminar el archivo puede evitar la recompilación! En su lugar, recomiendo * recompilar * un archivo cuando está desactualizado. Solía ​​usar 'after-save-hook' para ejecutar' (cuando (file-existe-p (byte-compile-dest-file nombre-archivo-buffer)) (byte-compile-file buffer-file-name)) ', pero en estos días realmente me gusta [compilación automática] (https://github.com/tarsius/auto-compile), que se ocupa de casi todas las eventualidades. – phils

+0

Honestamente, prefiero tener elisp lento y luego inconsistente. –

+0

Claro, pero si los archivos .elc se vuelven a compilar automáticamente siempre que sea necesario, obtendrá lo mejor de ambos mundos: consistente y rápido. En serio, eche un vistazo a la compilación automática. – phils

2

Mis archivos init comentarios en las instalaciones de depuración:

;;;; * Debugging, Tracing, and Profiling 

;; M-: (info "(elisp) Debugging") RET 

;; Standard debugger: 
;; M-x debug-on-entry FUNCTION 
;; M-x cancel-debug-on-entry &optional FUNCTION 
;; debug &rest DEBUGGER-ARGS 
;; M-x toggle-debug-on-error 
;; M-x toggle-debug-on-quit 
;; setq debug-on-signal 
;; setq debug-on-next-call 
;; setq debug-on-event 
;; setq debug-on-message REGEXP 

;; Edebug -- a source-level debugger for Emacs Lisp 
;; M-x edebug-defun (C-u C-M-x) Cancel with eval-defun (C-M-x) 
;; M-x edebug-all-defs -- Toggle edebugging of all definitions 
;; M-x edebug-all-forms -- Toggle edebugging of all forms 
;; M-x edebug-eval-top-level-form 

;; Tracing: 
;; M-x trace-function FUNCTION &optional BUFFER 
;; M-x untrace-function FUNCTION 
;; M-x untrace-all 

;; Timing and benchmarking: 
;; (benchmark-run &optional REPETITIONS &rest FORMS) 

;; Emacs Lisp Profiler (ELP) 
;; M-x elp-instrument-package 
;; M-x elp-instrument-list 
;; M-x elp-instrument-function 
;; M-x elp-reset-* 
;; M-x elp-results 
;; M-x elp-restore-all 
;; 
;; "There's a built-in profiler called ELP. You can try something like 
;; M-x elp-instrument-package, enter "vc", and then try finding a file 
;; Afterwards, M-x elp-results will show you a profile report. 
;; (Note that if the time is instead being spent in non-vc-related 
;; functions, this technique will not show it, but you can instrument 
;; further packages if you like.)" http://stackoverflow.com/a/6732810/324105 

;; CPU & Memory Profiler ('Native Profiler') 
;; M-x profiler-start 
;; M-x profiler-report 
;; M-x profiler-reset 
;; M-x profiler-stop 
;; M-x profiler-* 

;; Dope ("DOtemacs ProfilEr. A per-sexp-evaltime profiler.") 
;; https://raw.github.com/emacsmirror/dope/master/dope.el 
;; M-x dope-quick-start will show a little introduction tutorial. 

;; Spinning: 
;; Set debug-on-quit to t 
;; When the problem happens, hit C-g for a backtrace.