=== modified file 'ChangeLog' --- ChangeLog 2013-10-31 21:39:10 +0000 +++ ChangeLog 2013-11-01 19:36:58 +0000 @@ -1,3 +1,8 @@ +2013-11-01 Jarek Czekalski + + * keyboard.c: new function default-error-output which becomes + a default value for command-error-function. + 2013-10-31 Glenn Morris * configure.ac: Use [!...] rather than [^...], for ksh. (Bug#15769) === modified file 'src/keyboard.c' --- src/keyboard.c 2013-10-29 21:05:35 +0000 +++ src/keyboard.c 2013-11-01 19:46:51 +0000 @@ -241,6 +241,8 @@ static Lisp_Object Qecho_area_clear_hook; +static Lisp_Object Qdefault_error_output; + /* Hooks to run before and after each command. */ static Lisp_Object Qpre_command_hook; static Lisp_Object Qpost_command_hook; @@ -1053,35 +1055,21 @@ return make_number (0); } -/* Take actions on handling an error. DATA is the data that describes - the error. - - CONTEXT is a C-string containing ASCII characters only which - describes the context in which the error happened. If we need to - generalize CONTEXT to allow multibyte characters, make it a Lisp - string. */ - -void -cmd_error_internal (Lisp_Object data, const char *context) +DEFUN ("default-error-output", Fdefault_error_output, + Sdefault_error_output, 3, 3, 0, + doc: /* Produce default output for the error message, +into the messages buffer and the echo area. */) + (Lisp_Object data, Lisp_Object context, Lisp_Object signal) { struct frame *sf = SELECTED_FRAME (); - - /* The immediate context is not interesting for Quits, - since they are asynchronous. */ - if (EQ (XCAR (data), Qquit)) - Vsignaling_function = Qnil; - - Vquit_flag = Qnil; - Vinhibit_quit = Qt; - - /* Use user's specified output function if any. */ - if (!NILP (Vcommand_error_function)) - call3 (Vcommand_error_function, data, - context ? build_string (context) : empty_unibyte_string, - Vsignaling_function); + const char *sz_context; + + CHECK_STRING(context); + sz_context = XSTRING(context)->data; + /* If the window system or terminal frame hasn't been initialized yet, or we're not interactive, write the message to stderr and exit. */ - else if (!sf->glyphs_initialized_p + if (!sf->glyphs_initialized_p /* The initial frame is a special non-displaying frame. It will be current in daemon mode when there are no frames to display, and in non-daemon mode before the real frame @@ -1096,7 +1084,7 @@ || noninteractive) { print_error_message (data, Qexternal_debugging_output, - context, Vsignaling_function); + sz_context, signal); Fterpri (Qexternal_debugging_output); Fkill_emacs (make_number (-1)); } @@ -1107,8 +1095,35 @@ message_log_maybe_newline (); bitch_at_user (); - print_error_message (data, Qt, context, Vsignaling_function); + print_error_message (data, Qt, sz_context, signal); } +} + +/* Take actions on handling an error. DATA is the data that describes + the error. + + CONTEXT is a C-string containing ASCII characters only which + describes the context in which the error happened. If we need to + generalize CONTEXT to allow multibyte characters, make it a Lisp + string. */ + +void +cmd_error_internal (Lisp_Object data, const char *context) +{ + Lisp_Object Vcontext; + /* The immediate context is not interesting for Quits, + since they are asynchronous. */ + if (EQ (XCAR (data), Qquit)) + Vsignaling_function = Qnil; + + Vquit_flag = Qnil; + Vinhibit_quit = Qt; + Vcontext = context ? build_string (context) : empty_unibyte_string; + + /* Use user's specified output function, + initially it is our Fdefault_error_output. */ + if (!NILP (Vcommand_error_function)) + call3 (Vcommand_error_function, data, Vcontext, Vsignaling_function); Vsignaling_function = Qnil; } @@ -11108,6 +11123,7 @@ defsubr (&Sabort_recursive_edit); defsubr (&Sexit_recursive_edit); defsubr (&Srecursion_depth); + defsubr (&Sdefault_error_output); defsubr (&Stop_level); defsubr (&Sdiscard_input); defsubr (&Sopen_dribble_file); @@ -11586,14 +11602,18 @@ peculiar kind of quitting. */); Vthrow_on_input = Qnil; + DEFSYM (Qdefault_error_output, "default-error-output"); DEFVAR_LISP ("command-error-function", Vcommand_error_function, doc: /* If non-nil, function to output error messages. The arguments are the error data, a list of the form (SIGNALED-CONDITIONS . SIGNAL-DATA) such as just as `condition-case' would bind its variable to, the context (a string which normally goes at the start of the message), -and the Lisp function within which the error was signaled. */); - Vcommand_error_function = Qnil; +and the Lisp function within which the error was signaled. + +This variable is initialized with Emacs default error output function. +It is suggested that user functions are added using add-function. */); + Vcommand_error_function = Qdefault_error_output; DEFVAR_LISP ("enable-disabled-menus-and-buttons", Venable_disabled_menus_and_buttons,