Методы устранения неполадок для Emacs и Emacs Lisp - PullRequest
16 голосов
/ 18 января 2010

Я был довольно постоянным пользователем emacs около 4 лет, но я все еще новичок, когда дело доходит до настройки emacs и устранения неполадок elisp. Недавно я начал настраивать emacs в качестве среды разработки для ruby, и я научился нескольким приемам у людей из StackOverflow. Например, кто-то здесь рассказал мне о C-u C-M-x, чтобы обработать функцию с помощью edebug, а затем выполнить код. Я также понял, что большинство команд и режимов в emacs предоставляют тонны хуков (либо функций, либо регулярных выражений, либо настраиваемых переменных), которые обеспечат большую часть того, что захочет любой новичок.
Теперь я жадный - я ищу больше техник и советов, которые вы использовали и нашли полезными в прошлом.

Ответы [ 6 ]

13 голосов
/ 18 января 2010
 (setq debug-on-error t)
 (setq debug-on-quit t)

Они помогают, когда вы хотите отладить сколь угодно глубокие проблемы.Вы уже обнаружили edebug (это мой инструмент выбора для выяснения кода других людей).describe-function обычно дает ссылку на файл .el (вместе с номером строки), в который он был загружен.Полезно перейти к источнику проблемы.Я часто делаю это, копирую функцию, вставляю несколько вызовов message и переоцениваю C-x C-e, чтобы запустить ее вместо оригинала.

Обновление: Это кое-что из того, что я взял из презентации Джона Вигли .

(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))))

Давайте переключим debug-on-error одним нажатием клавиши.

6 голосов
/ 19 января 2010

C-x Esc Esc отображает историю выполненных вами команд M-x, но показывает код elisp.

IELM - это реплей для emacs lisp.

Speedbar - отличный способ просматривать ваши .el-файлы, также я часто использую C-h i (для просмотра руководства по elisp) и Speedbar для просмотра дерева тем.

Инкрементальный поиск C-s / C-r в информационном браузере будет фактически выполнять поиск последних разрывов страниц.

Я часто запускаю M-: для быстрого тестирования кода без необходимости переключаться на мой буфер * ielm *.

Для особенно сложного кода я создаю ярлык на рабочем столе, чтобы запустить emacs -q -l development-init.el (это особенно удобен для кода, который имеет дело с низкоуровневыми манипуляциями с буферами и внешними процессами, которые легко могут повесить emacs или уничтожить его с помощью segv).

2 голосов
/ 19 января 2010

Если вы взламываете ваш файл .emacs, всегда оставляйте запущенный процесс emacs и тестируйте изменения (с --debug-init), запуская второй процесс Emacs. Таким образом, если есть проблемы, у вас все еще есть редактор, в котором вы можете работать.

1 голос
/ 11 ноября 2013

Мой файл инициализации комментирует средства отладки:

;;;; * 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.
1 голос
/ 22 августа 2011

Со своей стороны, я предпочитаю (рекомендую) debug, чем edebug, но это, вероятно, просто вопрос вкуса.

В дополнение к тому, что Нуфал упомянул о переменных debug-on-*, вы можете ввести отладчик для данной функции через M-x debug-on-entry.

И вы можете делать явные вызовы debug в точках останова в коде: (debug) или (debug nil sexp-to-print).

0 голосов
/ 26 октября 2012

Добро пожаловать на первые несколько ступеней просветления. ;)

Прежде всего, несколько легких быстрых ударов:

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

Это даст вам небольшие подсказки по мини буферу. Это очень удобно! Этот совет не столько об устранении неполадок, сколько об упрощении написания, но все же.

Получите пакет erefactor от MELPA и посмотрите, что он делает. Я заметил, что после выполнения C-x C-e для функции, она запускает результат через elint. Сохраняет много хлопот.

Этот хук из стартового комплекта emacs потрясающий. Удаляет все недействительные файлы .elc. Старые файлы elc могут быть настоящим бельмом на вашей стороне, если вы не будете осторожны. Обратно посмотрите на автокомпиляцию.

(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"))))))

Наконец, при редактировании lisp, emacs-lisp или схемы обязательно попробуйте paredit. Это потрясающе.

...