GNU bug report logs - #20707
[PROPOSED PATCH] Use curved quoting in C-generated errors

Previous Next

Package: emacs;

Reported by: Paul Eggert <eggert <at> cs.ucla.edu>

Date: Mon, 1 Jun 2015 07:41:05 UTC

Severity: wishlist

Tags: patch

Done: Lars Ingebrigtsen <larsi <at> gnus.org>

Bug is archived. No further changes may be made.

Full log


View this message in rfc822 format

From: Paul Eggert <eggert <at> cs.ucla.edu>
To: Alan Mackenzie <acm <at> muc.de>
Cc: 20707 <at> debbugs.gnu.org
Subject: bug#20707: [PROPOSED PATCH] Use curved quoting in C-generated errors
Date: Thu, 04 Jun 2015 08:43:50 -0700
Alan Mackenzie wrote:
> a typical use of Q would look like this:
>
>      error ("Buffer name " Q(%s) " is in use", SDATA (name));

I'm afraid that's not sufficient, as sometimes we have code like this:

	      insert_string ("\nUses keymap `");

with unbalanced quotes.  We can fix this by using another macro, uLSQM in the 
originally proposed patch:

	      insert_string ("\nUses keymap "uLSQM);

though this is starting to get ugly.

The more serious problem, though is that neither approach will work well in the 
Elisp code, which is where the vast majority of these quotes live.  It would be 
quite painful to change this:

    (format "Parsing `%s': expected %s `%s', got `%s'." a b c d)

to this:

    (format (concat "Parsing " (q "%s") ": expected %s " (q "%s")
                    ", got " (q "%s") ".")
            a b c)

I considered changing 'format' so that it automatically curves quotes in the 
format string.  But that would mishandle common cases like this:

     (format "\\`%s" path-separator)

where 'format' is being used to compose a regular expression containing '\`'.

More reasonable would be to add a new function, 'format-message', that behaves 
like 'format' except it also curves quotes, and to change functions like 
'message' and 'error' to use 'format-message' instead of plain 'format'.  But 
even here we have lots of examples like this:

     (y-or-n-p (format "File `%s' exists; overwrite? " filename))

where we'd have to change 'format' to 'format-message'.

We could go the GCC route and add a new format flag 'q', so that the above 
examples could be written like this:

    (format "Parsing %qs: expected %s %qs, got %qs." a b c d)
    (y-or-n-p (format "File %qs exists; overwrite? " filename))

This approach would make sense if 8-bit environments were still common, as they 
were when GCC added the 'q' flag to its message formatter.  However, nowadays 
8-bit environments are obsolescent (sorry) and so this approach seems like 
overkill now.  If we are bothering to go through code to fix quotes, it's better 
to change the above examples to:

    (format "Parsing ‘%s’: expected %s ‘%s’, got ‘%s’." a b c d)
    (y-or-n-p (format "File ‘%s’ exists; overwrite? " filename))

for two reasons.  First, unlike %qs the resulting code will work on older Emacs 
implementations and thus will make the code more backward-compatible.  Second, 
it's easier to read and maintain quote marks that you can see.




This bug report was last modified 4 years and 361 days ago.

Previous Next


GNU bug tracking system
Copyright (C) 1999 Darren O. Benham, 1997,2003 nCipher Corporation Ltd, 1994-97 Ian Jackson.