Методы устранения неполадок для Emacs и Emacs Lisp
Я был довольно регулярным пользователем emacs около 4 лет, но я все еще новичок, когда речь идет о настройке emacs и устранении неполадок elisp. Недавно я начал настраивать emacs в качестве моей среды разработки ruby, и я узнал несколько методов от людей здесь, в StackOverflow.
Например, кто-то здесь рассказал мне о C-u C-M-x, чтобы обработать функцию с edebug, а затем выполнить шаг "код". Я также понял, что большинство команд и режимов в emacs предоставляют массу крючков (либо функций, либо регулярных выражений, либо настраиваемых переменных), которые предоставят большую часть того, что любой новичок захочет.
Теперь я жадный - я ищу больше методов и советов, которые вы использовали и которые были полезны в прошлом.
Ответы
Ответ 1
(setq debug-on-error t)
(setq debug-on-quit t)
Это помогает, когда вы хотите отлаживать произвольно глубокие проблемы. Вы уже обнаружили edebug
(который является моим инструментом выбора для выяснения кода других людей). describe-function
обычно дает вам ссылку на файл .el
(вместе с номером строки), где он был загружен. Это полезно для перехода к источнику проблемы. Я часто делаю это, копирую функцию, помещаю несколько вызовов message
и переоцениваю C-x C-e
, чтобы выполнить этот запуск вместо оригинала.
Обновление: Это немного что-то, что я взял из презентации от 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))))
Позволяет переключаться debug-on-error
с одним нажатием клавиши.
Ответ 2
C-x Esc Esc дает вам просматриваемую историю команд M-x, которые вы выполнили, но показывает код elisp.
IELM - это замена emacs lisp.
Speedbar - отличный способ просмотреть ваши .el файлы, также я часто пользуюсь C-h (для просмотра руководства elisp) и с помощью скоростной панели для просмотра дерева тем <. W630 > .
Инкрементный поиск C-s/C-r в обозревателе информации фактически будет искать предыдущие разрывы страниц.
Я часто запускаю M-: для проверки быстрого кода, не переключаясь на буфер * ielm *.
Для особо сложного кода я делаю ярлык на рабочем столе для запуска emacs -q -l development-init.el
(это особенно удобно с кодом, который имеет дело с манипуляторами низкого уровня на буферах и внешних процессах, что может легко повесить emacs или убить его с помощью segv).
Ответ 3
Если вы взломали файл .emacs, всегда оставляйте процесс emacs запущенным и проверяйте изменения (с помощью --debug-init
), запустив второй процесс Emacs. Таким образом, если есть проблемы, у вас все еще есть редактор, над которым вы можете работать.
Ответ 4
Мои комментарии к файлу инициализации для средств отладки:
;;;; * 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 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.
Ответ 5
Со своей стороны, я предпочитаю (рекомендую) debug
over edebug
, но это, вероятно, просто вопрос вкуса.
В дополнение к тому, что Noufal упомянул о переменных debug-on-*
, вы можете ввести отладчик для данной функции через M-x debug-on-entry
.
И вы можете поместить явные вызовы debug
в точки останова в коде: (debug)
или (debug nil sexp-to-print)
.
Ответ 6
Добро пожаловать в первые несколько шагов просветления.;)
Прежде всего, несколько простых быстрых хитов:
(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 попробовать. Это потрясающе.