Методы устранения неполадок для Emacs и Emacs Lisp

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

6 ответов

Решение
 (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 с одним нажатием клавиши.

Cx Esc Esc дает вам историю просматриваемых команд Mx, которую вы просматриваете, но показывает код elisp.

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

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

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

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

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

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

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

;;;; * 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://stackru.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.

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

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

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

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

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

(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. Это превосходно.

Другие вопросы по тегам