19.2.10 Буфер списка вычислений

Вы можете использовать буфер списка вычислений, называемый *edebug*, для интерактивного вычисления выражений. Вы также можете настроить список вычислений — выражений, которые будут вычисляться автоматически каждый раз при обновлении отображения Edebug.

E

Переключиться в буфер списка вычислений *edebug* (edebug-visit-eval-list).

В буфере *edebug* вы можете использовать команды режима Lisp Interaction (см. Взаимодействие с Lisp в Руководстве GNU Emacs), а также следующие специальные команды:

C-j

Вычислить выражение перед точкой во внешнем контексте и вставить значение в буфер (edebug-eval-print-last-sexp). С числовым префиксным аргументом, равным нулю (C-u 0 C-j), не сокращать длинные элементы (например, строки и списки).

C-x C-e

Вычислить выражение перед точкой в контексте вне Edebug (edebug-eval-last-sexp).

C-c C-u

Построить новый список вычислений из содержимого буфера (edebug-update-eval-list).

C-c C-d

Удалить группу списка вычислений, в которой находится точка (edebug-delete-eval-item).

C-c C-w

Вернуться в буфер с исходным кодом в текущей точке останова (edebug-where).

Вы можете вычислять выражения в окне списка вычислений с помощью C-j или C-x C-e, так же как в *scratch*; но они вычисляются в контексте вне Edebug.

Выражения, которые вы вводите интерактивно (и их результаты), теряются при продолжении выполнения; но вы можете настроить список вычислений, состоящий из выражений, которые будут вычисляться при каждой остановке выполнения.

Для этого запишите одну или несколько групп списка вычислений в буфере списка вычислений. Группа списка вычислений состоит из одного или нескольких выражений Lisp. Группы разделяются строками-комментариями.

Команда C-c C-u (edebug-update-eval-list) перестраивает список вычислений, сканируя буфер и используя первое выражение каждой группы. (Подразумевается, что второе выражение группы — это ранее вычисленное и отображённое значение.)

При каждом входе в Edebug список вычислений отображается заново: в буфер вставляется каждое выражение, за которым следует его текущее значение. Также вставляются строки-комментарии, так что каждое выражение становится собственной группой. Таким образом, если вы снова наберёте C-c C-u, не изменяя текст буфера, список вычислений фактически останется неизменным.

Если при вычислении из списка вычислений возникает ошибка, сообщение об ошибке отображается в виде строки, как если бы это был результат. Поэтому выражения, использующие переменные, которые в данный момент недопустимы, не прерывают отладку.

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

(current-buffer)
#<buffer *scratch*>
;---------------------------------------------------------------
(selected-window)
#<window 16 on *scratch*>
;---------------------------------------------------------------
(point)
196
;---------------------------------------------------------------
bad-var
"Значение символа как переменной не определено: bad-var"
;---------------------------------------------------------------
(recursion-depth)
0
;---------------------------------------------------------------
this-command
eval-last-sexp
;---------------------------------------------------------------

Чтобы удалить группу, поместите точку в неё и нажмите C-c C-d или просто удалите текст группы и обновите список вычислений с помощью C-c C-u. Чтобы добавить новое выражение в список вычислений, вставьте выражение в подходящее место, вставьте новую строку-комментарий, затем нажмите C-c C-u. Вставлять тире в строке-комментарии не обязательно — её содержимое не имеет значения.

После выбора *edebug* вы можете вернуться в буфер с исходным кодом с помощью C-c C-w. Буфер *edebug* уничтожается при продолжении выполнения и создаётся заново при следующей необходимости.