janssen@titan.SW.MCC.COM (Bill Janssen) (06/23/88)
Here's the procedure for recording all the messages written to the minibuffer,
including errors:
1. Go to the file gnu-emacs/src/xdisp.c
2. Just before the definiition of C function "message", add the following:
/* contains a list of all messages written to the minibuffer */
Lisp_Object Vmessage_list;
/* When non-zero, save messages in "message-list" */
int save_messages;
3. Go to the end of xdisp.c, inside the function "syms_of_xdisp", and
add the following just after the initialization
of Vglobal_mode_string:
DEFVAR_LISP ("message-list", &Vmessage_list,
"List of all messages displayed with \"message\".");
Vmessage_list = Qnil;
DEFVAR_BOOL ("save-messages", &save_messages,
"*Set to T to save messages in \"message-list\".");
save_messages = 0;
4. Go back towards the top of xdisp.c, and in both the functions
"message" and "message1", add the following lines just before
the line "minibuf_message = message_buf;":
if (save_messages)
Vmessage_list = Fcons(build_string(message_buf),Vmessage_list);
5. Save xdisp.c.
6. Go to gnu-emacs/src/keyboard.c.
7. Error messages are written by the routine "cmd_error", at about
line 300. In the declarations of "cmd_error", add the following:
extern int save_messages; /* if set, save messages */
extern Lisp_Object Vmessage_list; /* list to save message in */
8. Just before the comment that reads
/* For file-error, make error message by concatenating
all the data items. They are all strings. */
insert the following:
if (save_messages)
{
Lisp_Object total_error_message = Qnil;
Lisp_Object tailptr = tail;
if (!NULL (file_error))
errmsg = XCONS (tailptr)->car, tailptr = XCONS (tailptr)->cdr;
if (XTYPE (errmsg) == Lisp_String)
total_error_message = errmsg;
else
total_error_message = build_string("peculiar error");
for (i = 0; CONSP (tailptr); tailptr = Fcdr (tailptr), i++)
{
total_error_message = call2 (Fconcat,
total_error_message,
build_string (i ? ", " : ": "));
if (!NULL (file_error))
total_error_message = call2 (Fconcat,
total_error_message,
Fprin1_to_string (Fcar (tailptr)));
}
Vmessage_list = Fcons (total_error_message, Vmessage_list);
}
9. Save keyboard.c.
10. Rebuild emacs.
11. Use (setq save-messages t) to start the messages accumulating,
(setq save-messages nil) to stop them.
12. Clear out message-list every so often, as it does accumulate.
It probably really should be a ring buffer, but things like
incremental-search fill it up so fast that anything previous
would be lost.
Bill