all messages for Emacs-related lists mirrored at yhetil.org
 help / color / mirror / code / Atom feed
From: Jarek Czekalski <jarekczek@poczta.onet.pl>
To: emacs-devel@gnu.org
Subject: patch: create default error output function
Date: Fri, 01 Nov 2013 21:18:25 +0100	[thread overview]
Message-ID: <52740C91.3000305@poczta.onet.pl> (raw)

[-- Attachment #1: Type: text/plain, Size: 695 bytes --]

As suggested by Stefan in [1] I prepared a patch that creates a new 
elisp function which makes a default value for command-error-function. 
This makes it possible to use this variable by packages. Patch is 
against r114884.

Please review and comment my first Emacs patch. I couldn't find any 
guide for submitting patches, so I based it on my intuition and 
experience from previous projects, mainly jEdit.

Sometimes it's better to have a ticket in the tracker for a patch for 
easy reference to a discussion from a commit log message. But in gnu 
they say about posting a patch to the list, so I post.

Thanks,
Jarek

[1] http://lists.gnu.org/archive/html/emacs-devel/2013-10/msg00807.html


[-- Attachment #2: cmd_err_1_04.txt --]
[-- Type: text/plain, Size: 5133 bytes --]

=== 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  <jarekczek@poczta.onet.pl>
+
+	* keyboard.c: new function default-error-output which becomes
+	a default value for command-error-function.
+
 2013-10-31  Glenn Morris  <rgm@gnu.org>
 
 	* 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,


             reply	other threads:[~2013-11-01 20:18 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-11-01 20:18 Jarek Czekalski [this message]
2013-11-02 10:41 ` patch: create default error output function Xue Fuqiao
2013-11-02 10:49   ` Xue Fuqiao
2013-11-05 20:48 ` Stefan Monnier
2013-11-05 21:03   ` Jarek Czekalski
2013-11-06  3:13     ` Stefan Monnier

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=52740C91.3000305@poczta.onet.pl \
    --to=jarekczek@poczta.onet.pl \
    --cc=emacs-devel@gnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this external index

	https://git.savannah.gnu.org/cgit/emacs.git
	https://git.savannah.gnu.org/cgit/emacs/org-mode.git

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.