all messages for Emacs-related lists mirrored at yhetil.org
 help / color / mirror / code / Atom feed
* bug#55738: character escape bugs in the reader
@ 2022-05-31 11:33 Mattias Engdegård
  2022-06-01 10:00 ` Mattias Engdegård
  0 siblings, 1 reply; 12+ messages in thread
From: Mattias Engdegård @ 2022-05-31 11:33 UTC (permalink / raw)
  To: 55738

Some character escape oddities observed in the Emacs reader:

1. ?\LF => -1

This is clearly a bug (no character literal should be -1) and an artefact of the underlying implementation.
The correct value should be 10.
(In string literals \LF is ignored entirely, as documented.)

2. The Control modifier (\C- or \^) is nonidempotent. For example,
?\C-a => 1
?\C-\C-a => #x4000001

Similarly, "\C-\C-a" signals a reader error.

This too is an artefact of the implementation. The correct value should be as if only a single control modifier were present, eg. ?\C-\C-a => 1.

3. Control-space yields NUL in strings but not as a char literal:
"\C-SPC" => "NUL"
"\^SPC"  => "NUL"
?\C-SPC => #x4000020
?\^SPC  => #x4000020

Emacs takes a conservative stance and normally only generates control characters from upper and lower case ASCII letters and the symbols ?@[\]^_ because that agrees with custom and suffices for all C0 controls. Since most terminals also map Control-SPC to NUL, it would be more consistent to do so in both string and character literals.

The first two bugs are straightforward to fix (I have a patch) and doing so is unlikely to cause any harm.
I honestly don't think making ?\C-SPC => 0 would either (because of how key binding words) but we should investigate further just in case.






^ permalink raw reply	[flat|nested] 12+ messages in thread

* bug#55738: character escape bugs in the reader
  2022-05-31 11:33 bug#55738: character escape bugs in the reader Mattias Engdegård
@ 2022-06-01 10:00 ` Mattias Engdegård
  2022-06-01 13:42   ` Lars Ingebrigtsen
  0 siblings, 1 reply; 12+ messages in thread
From: Mattias Engdegård @ 2022-06-01 10:00 UTC (permalink / raw)
  To: 55738

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

Suggested patch. It does not address the third bug above (\C-SPC).


[-- Attachment #2: 0001-Fix-reader-char-escape-bugs-bug-55738.patch --]
[-- Type: application/octet-stream, Size: 10899 bytes --]

From 801c6789d753eb1d94adec95af76e6c28dc27e21 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Mattias=20Engdeg=C3=A5rd?= <mattiase@acm.org>
Date: Wed, 1 Jun 2022 11:39:44 +0200
Subject: [PATCH] Fix reader char escape bugs (bug#55738)

Make the character literal ?\LF (linefeed) generate 10, not -1.

Ensure that Control escape sequences in character literals are
idempotent: ?\C-\C-a and ?\^\^a mean the same thing as ?\C-a and ?\^a,
generating the control character with value 1.  "\C-\C-a" no longer
signals an error.

* src/lread.c (read_escape): Make nonrecursive and only combine
the base char with modifiers at the end, creating control chars
if applicable.  Remove the `stringp` argument; assume character
literal syntax.  Never return -1.
(read_string_literal): Handle string-specific escape semantics here
and simplify.
* test/src/lread-tests.el (lread-misc-2): New test.
---
 src/lread.c             | 201 ++++++++++++++++++++--------------------
 test/src/lread-tests.el |  10 ++
 2 files changed, 112 insertions(+), 99 deletions(-)

diff --git a/src/lread.c b/src/lread.c
index a1045184d9..670413efc0 100644
--- a/src/lread.c
+++ b/src/lread.c
@@ -2631,93 +2631,88 @@ character_name_to_code (char const *name, ptrdiff_t name_len,
 enum { UNICODE_CHARACTER_NAME_LENGTH_BOUND = 200 };
 
 /* Read a \-escape sequence, assuming we already read the `\'.
+   When there is a difference between string and character literal \-sequences,
+   the latter is assumed.
    If the escape sequence forces unibyte, return eight-bit char.  */
 
 static int
-read_escape (Lisp_Object readcharfun, bool stringp)
+read_escape (Lisp_Object readcharfun)
 {
+  int modifiers = 0;
+ again: ;
   int c = READCHAR;
-  /* \u allows up to four hex digits, \U up to eight.  Default to the
-     behavior for \u, and change this value in the case that \U is seen.  */
-  int unicode_hex_count = 4;
+  int unicode_hex_count;
 
   switch (c)
     {
     case -1:
       end_of_file_error ();
 
-    case 'a':
-      return '\007';
-    case 'b':
-      return '\b';
-    case 'd':
-      return 0177;
-    case 'e':
-      return 033;
-    case 'f':
-      return '\f';
-    case 'n':
-      return '\n';
-    case 'r':
-      return '\r';
-    case 't':
-      return '\t';
-    case 'v':
-      return '\v';
-    case '\n':
-      return -1;
-    case ' ':
-      if (stringp)
-	return -1;
-      return ' ';
+    case 'a': c = '\a'; break;
+    case 'b': c = '\b'; break;
+    case 'd': c = 127; break;
+    case 'e': c = 27; break;
+    case 'f': c = '\f'; break;
+    case 'n': c = '\n'; break;
+    case 'r': c = '\r'; break;
+    case 't': c = '\t'; break;
+    case 'v': c = '\v'; break;
 
     case 'M':
       c = READCHAR;
       if (c != '-')
 	error ("Invalid escape character syntax");
+      modifiers |= meta_modifier;
       c = READCHAR;
       if (c == '\\')
-	c = read_escape (readcharfun, 0);
-      return c | meta_modifier;
+	goto again;
+      break;
 
     case 'S':
       c = READCHAR;
       if (c != '-')
 	error ("Invalid escape character syntax");
+      modifiers |= shift_modifier;
       c = READCHAR;
       if (c == '\\')
-	c = read_escape (readcharfun, 0);
-      return c | shift_modifier;
+	goto again;
+      break;
 
     case 'H':
       c = READCHAR;
       if (c != '-')
 	error ("Invalid escape character syntax");
+      modifiers |= hyper_modifier;
       c = READCHAR;
       if (c == '\\')
-	c = read_escape (readcharfun, 0);
-      return c | hyper_modifier;
+	goto again;
+      break;
 
     case 'A':
       c = READCHAR;
       if (c != '-')
 	error ("Invalid escape character syntax");
+      modifiers |= alt_modifier;
       c = READCHAR;
       if (c == '\\')
-	c = read_escape (readcharfun, 0);
-      return c | alt_modifier;
+	goto again;
+      break;
 
     case 's':
       c = READCHAR;
-      if (stringp || c != '-')
+      if (c == '-')
+	{
+	  modifiers |= super_modifier;
+	  c = READCHAR;
+	  if (c == '\\')
+	    goto again;
+	}
+      else
 	{
 	  UNREAD (c);
-	  return ' ';
+	  c = ' ';
 	}
-      c = READCHAR;
-      if (c == '\\')
-	c = read_escape (readcharfun, 0);
-      return c | super_modifier;
+      break;
 
     case 'C':
       c = READCHAR;
@@ -2725,21 +2720,11 @@ read_escape (Lisp_Object readcharfun, bool stringp)
 	error ("Invalid escape character syntax");
       FALLTHROUGH;
     case '^':
+      modifiers |= ctrl_modifier;
       c = READCHAR;
       if (c == '\\')
-	c = read_escape (readcharfun, 0);
-      if ((c & ~CHAR_MODIFIER_MASK) == '?')
-	return 0177 | (c & CHAR_MODIFIER_MASK);
-      else if (! ASCII_CHAR_P ((c & ~CHAR_MODIFIER_MASK)))
-	return c | ctrl_modifier;
-      /* ASCII control chars are made from letters (both cases),
-	 as well as the non-letters within 0100...0137.  */
-      else if ((c & 0137) >= 0101 && (c & 0137) <= 0132)
-	return (c & (037 | ~0177));
-      else if ((c & 0177) >= 0100 && (c & 0177) <= 0137)
-	return (c & (037 | ~0177));
-      else
-	return c | ctrl_modifier;
+	goto again;
+      break;
 
     case '0':
     case '1':
@@ -2749,31 +2734,30 @@ read_escape (Lisp_Object readcharfun, bool stringp)
     case '5':
     case '6':
     case '7':
-      /* An octal escape, as in ANSI C.  */
+      /* 1-3 octal digits.  */
       {
-	register int i = c - '0';
-	register int count = 0;
+	int i = c - '0';
+	int count = 0;
 	while (++count < 3)
 	  {
-	    if ((c = READCHAR) >= '0' && c <= '7')
-	      {
-		i *= 8;
-		i += c - '0';
-	      }
-	    else
+	    c = READCHAR;
+	    if (c < '0' || c > '7')
 	      {
 		UNREAD (c);
 		break;
 	      }
+	    i *= 8;
+	    i += c - '0';
 	  }
 
 	if (i >= 0x80 && i < 0x100)
 	  i = BYTE8_TO_CHAR (i);
-	return i;
+	c = i;
+	break;
       }
 
     case 'x':
-      /* A hex escape, as in ANSI C.  */
+      /* One or more hex digits.  */
       {
 	unsigned int i = 0;
 	int count = 0;
@@ -2795,16 +2779,18 @@ read_escape (Lisp_Object readcharfun, bool stringp)
 	  }
 
 	if (count < 3 && i >= 0x80)
-	  return BYTE8_TO_CHAR (i);
-	return i;
+	  i = BYTE8_TO_CHAR (i);
+	c = i;
+	break;
       }
 
-    case 'U':
-      /* Post-Unicode-2.0: Up to eight hex chars.  */
+    case 'U':			/* Eight hex digits.  */
       unicode_hex_count = 8;
-      FALLTHROUGH;
-    case 'u':
+      goto unicode;
 
+    case 'u':			/* Four hex digits.  */
+      unicode_hex_count = 4;
+    unicode:
       /* A Unicode escape.  We only permit them in strings and characters,
 	 not arbitrarily in the source code, as in some other languages.  */
       {
@@ -2815,12 +2801,8 @@ read_escape (Lisp_Object readcharfun, bool stringp)
 	  {
 	    c = READCHAR;
 	    if (c < 0)
-	      {
-		if (unicode_hex_count > 4)
-		  error ("Malformed Unicode escape: \\U%x", i);
-		else
-		  error ("Malformed Unicode escape: \\u%x", i);
-	      }
+	      error ("Malformed Unicode escape: \\%c%x",
+		     unicode_hex_count == 4 ? 'u' : 'U', i);
 	    /* `isdigit' and `isalpha' may be locale-specific, which we don't
 	       want.  */
 	    int digit = char_hexdigit (c);
@@ -2831,7 +2813,8 @@ read_escape (Lisp_Object readcharfun, bool stringp)
 	  }
 	if (i > 0x10FFFF)
 	  error ("Non-Unicode character: 0x%x", i);
-	return i;
+	c = i;
+	break;
       }
 
     case 'N':
@@ -2880,12 +2863,31 @@ read_escape (Lisp_Object readcharfun, bool stringp)
 
 	/* character_name_to_code can invoke read0, recursively.
 	   This is why read0's buffer is not static.  */
-	return character_name_to_code (name, length, readcharfun);
+	c = character_name_to_code (name, length, readcharfun);
+	break;
       }
+    }
 
-    default:
-      return c;
+  c |= modifiers;
+  if (c & ctrl_modifier)
+    {
+      int b = c & ~CHAR_MODIFIER_MASK;
+      /* If the base char is in the 0x3f..0x5f range or a lower case
+	 letter, drop the ctrl_modifier bit and generate a C0 control
+	 character instead.  */
+      if ((b >= 0x3f && b <= 0x5f) || (b >= 'a' && b <= 'z'))
+	{
+	  c &= ~ctrl_modifier;
+	  if (b == '?')
+	    /* Special case: ^? is DEL.  */
+	    b = 127;
+	  else
+	    /* Make a C0 control in 0..31 by clearing bits 5 and 6.  */
+	    b &= 0x1f;
+	}
+      c = b | (c & CHAR_MODIFIER_MASK);
     }
+  return c;
 }
 
 /* Return the digit that CHARACTER stands for in the given BASE.
@@ -3012,7 +3014,7 @@ read_char_literal (Lisp_Object readcharfun)
     }
 
   if (ch == '\\')
-    ch = read_escape (readcharfun, 0);
+    ch = read_escape (readcharfun);
 
   int modifiers = ch & CHAR_MODIFIER_MASK;
   ch &= ~CHAR_MODIFIER_MASK;
@@ -3066,14 +3068,21 @@ read_string_literal (char stackbuf[VLA_ELEMS (stackbufsize)],
 
       if (ch == '\\')
 	{
-	  ch = read_escape (readcharfun, 1);
-
-	  /* CH is -1 if \ newline or \ space has just been seen.  */
-	  if (ch == -1)
+	  ch = READCHAR;
+	  switch (ch)
 	    {
+	    case 's':
+	      ch = ' ';
+	      break;
+	    case ' ':
+	    case '\n':
 	      if (p == read_buffer)
 		cancel = true;
 	      continue;
+	    default:
+	      UNREAD (ch);
+	      ch = read_escape (readcharfun);
+	      break;
 	    }
 
 	  int modifiers = ch & CHAR_MODIFIER_MASK;
@@ -3085,19 +3094,13 @@ read_string_literal (char stackbuf[VLA_ELEMS (stackbufsize)],
 	    force_multibyte = true;
 	  else		/* I.e. ASCII_CHAR_P (ch).  */
 	    {
-	      /* Allow `\C- ' and `\C-?'.  */
-	      if (modifiers == CHAR_CTL)
+	      /* Allow `\C-SPC' and `\^SPC'.  This is done here because
+		 the literals ?\C-SPC and ?\^SPC (rather inconsistently)
+		 yield (' ' | CHAR_CTL); see bug#55738.  */
+	      if (modifiers == CHAR_CTL && ch == ' ')
 		{
-		  if (ch == ' ')
-		    {
-		      ch = 0;
-		      modifiers = 0;
-		    }
-		  else if (ch == '?')
-		    {
-		      ch = 127;
-		      modifiers = 0;
-		    }
+		  ch = 0;
+		  modifiers = 0;
 		}
 	      if (modifiers & CHAR_SHIFT)
 		{
diff --git a/test/src/lread-tests.el b/test/src/lread-tests.el
index 47351c1d11..59d5ca076f 100644
--- a/test/src/lread-tests.el
+++ b/test/src/lread-tests.el
@@ -317,4 +317,14 @@ lread-misc
   (should (equal (read-from-string "#_")
                  '(## . 2))))
 
+(ert-deftest lread-misc-2 ()
+  ;; ?\LF should produce LF (only inside string literals do we ignore \LF).
+  (should (equal (read-from-string "?\\\n") '(?\n . 3)))
+  (should (equal (read-from-string "\"a\\\nb\"") '("ab" . 6)))
+  ;; The Control modifier constructs should be idempotent.
+  (should (equal ?\C-\C-x ?\C-x))
+  (should (equal ?\^\^x ?\C-x))
+  (should (equal ?\C-\^x ?\C-x))
+  (should (equal ?\^\C-x ?\C-x)))
+
 ;;; lread-tests.el ends here
-- 
2.32.0 (Apple Git-132)


^ permalink raw reply related	[flat|nested] 12+ messages in thread

* bug#55738: character escape bugs in the reader
  2022-06-01 10:00 ` Mattias Engdegård
@ 2022-06-01 13:42   ` Lars Ingebrigtsen
  2022-06-01 17:56     ` Mattias Engdegård
  0 siblings, 1 reply; 12+ messages in thread
From: Lars Ingebrigtsen @ 2022-06-01 13:42 UTC (permalink / raw)
  To: Mattias Engdegård; +Cc: 55738

Mattias Engdegård <mattiase@acm.org> writes:

> Make the character literal ?\LF (linefeed) generate 10, not -1.
>
> Ensure that Control escape sequences in character literals are
> idempotent: ?\C-\C-a and ?\^\^a mean the same thing as ?\C-a and ?\^a,
> generating the control character with value 1.  "\C-\C-a" no longer
> signals an error.

I think both changes make sense.

> * src/lread.c (read_escape): Make nonrecursive and only combine
> the base char with modifiers at the end, creating control chars
> if applicable.  Remove the `stringp` argument; assume character
> literal syntax.  Never return -1.
> (read_string_literal): Handle string-specific escape semantics here
> and simplify.

And also sounds good.

-- 
(domestic pets only, the antidote for overdose, milk.)
   bloggy blog: http://lars.ingebrigtsen.no





^ permalink raw reply	[flat|nested] 12+ messages in thread

* bug#55738: character escape bugs in the reader
  2022-06-01 13:42   ` Lars Ingebrigtsen
@ 2022-06-01 17:56     ` Mattias Engdegård
  2022-06-01 20:48       ` Basil L. Contovounesios via Bug reports for GNU Emacs, the Swiss army knife of text editors
  0 siblings, 1 reply; 12+ messages in thread
From: Mattias Engdegård @ 2022-06-01 17:56 UTC (permalink / raw)
  To: Lars Ingebrigtsen; +Cc: 55738

1 juni 2022 kl. 15.42 skrev Lars Ingebrigtsen <larsi@gnus.org>:

> I think both changes make sense.

Thank you, now in master.

What to do with ?\C-SPC is less clear.  Actually there are no immediate plans to do anything about it at all although the behaviour a bit incongruent (and undocumented).







^ permalink raw reply	[flat|nested] 12+ messages in thread

* bug#55738: character escape bugs in the reader
  2022-06-01 17:56     ` Mattias Engdegård
@ 2022-06-01 20:48       ` Basil L. Contovounesios via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2022-06-01 20:53         ` Mattias Engdegård
  0 siblings, 1 reply; 12+ messages in thread
From: Basil L. Contovounesios via Bug reports for GNU Emacs, the Swiss army knife of text editors @ 2022-06-01 20:48 UTC (permalink / raw)
  To: Mattias Engdegård; +Cc: Lars Ingebrigtsen, 55738

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

Mattias Engdegård [2022-06-01 19:56 +0200] wrote:

> Thank you, now in master.

Thanks, but I think this patch gave rise to the attached build error.

-- 
Basil

$ uname -a
Linux tia 5.17.0-1-amd64 #1 SMP PREEMPT Debian 5.17.3-1 (2022-04-18) x86_64 GNU/Linux
$ cat /etc/debian_version 
bookworm/sid
$ echo $LANG $XMODIFIERS
en_IE.UTF-8 @im=ibus
$ gcc-12 --version | head -1
gcc-12 (Debian 12.1.0-2) 12.1.0
$ make --version | head -2
GNU Make 4.3
Built for x86_64-pc-linux-gnu


[-- Attachment #2: make.txt.gz --]
[-- Type: application/gzip, Size: 34756 bytes --]

^ permalink raw reply	[flat|nested] 12+ messages in thread

* bug#55738: character escape bugs in the reader
  2022-06-01 20:48       ` Basil L. Contovounesios via Bug reports for GNU Emacs, the Swiss army knife of text editors
@ 2022-06-01 20:53         ` Mattias Engdegård
  2022-06-01 21:05           ` Basil L. Contovounesios via Bug reports for GNU Emacs, the Swiss army knife of text editors
  0 siblings, 1 reply; 12+ messages in thread
From: Mattias Engdegård @ 2022-06-01 20:53 UTC (permalink / raw)
  To: Basil L. Contovounesios; +Cc: Lars Ingebrigtsen, 55738

1 juni 2022 kl. 22.48 skrev Basil L. Contovounesios <contovob@tcd.ie>:

> Thanks, but I think this patch gave rise to the attached build error.

Yes, so I found out when trying to bootstrap after having pushed it. (Next time I'll do things in the opposite order.)
Reverted for now. Sorry!






^ permalink raw reply	[flat|nested] 12+ messages in thread

* bug#55738: character escape bugs in the reader
  2022-06-01 20:53         ` Mattias Engdegård
@ 2022-06-01 21:05           ` Basil L. Contovounesios via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2022-06-02 15:12             ` Mattias Engdegård
  0 siblings, 1 reply; 12+ messages in thread
From: Basil L. Contovounesios via Bug reports for GNU Emacs, the Swiss army knife of text editors @ 2022-06-01 21:05 UTC (permalink / raw)
  To: Mattias Engdegård; +Cc: Lars Ingebrigtsen, 55738

Mattias Engdegård [2022-06-01 22:53 +0200] wrote:

> Reverted for now. Sorry!

No worries, thanks for working on this!

-- 
Basil





^ permalink raw reply	[flat|nested] 12+ messages in thread

* bug#55738: character escape bugs in the reader
  2022-06-01 21:05           ` Basil L. Contovounesios via Bug reports for GNU Emacs, the Swiss army knife of text editors
@ 2022-06-02 15:12             ` Mattias Engdegård
  2022-06-03 11:07               ` Mattias Engdegård
  2022-06-18  6:54               ` Stefan Kangas
  0 siblings, 2 replies; 12+ messages in thread
From: Mattias Engdegård @ 2022-06-02 15:12 UTC (permalink / raw)
  To: Basil L. Contovounesios; +Cc: Lars Ingebrigtsen, Stefan Kangas, 55738

Looks like there is code like

                     (setq bits (+ bits ?\C-\^@))

where the author wanted just the 'control' bit, and even

  (should (equal (kbd "C-RET") [?\C-\C-m]))

and while these are debatable in style (I'd prefer ?C-\0 to produce the control bit), the risk of breaking external code is too great.

Thus I'm scaling back ambitions a bit and have committed a much-reduced patch that just deals with the ?\LF part.






^ permalink raw reply	[flat|nested] 12+ messages in thread

* bug#55738: character escape bugs in the reader
  2022-06-02 15:12             ` Mattias Engdegård
@ 2022-06-03 11:07               ` Mattias Engdegård
  2022-06-18  6:54               ` Stefan Kangas
  1 sibling, 0 replies; 12+ messages in thread
From: Mattias Engdegård @ 2022-06-03 11:07 UTC (permalink / raw)
  To: Basil L. Contovounesios; +Cc: Lars Ingebrigtsen, Stefan Kangas, 55738

> Thus I'm scaling back ambitions a bit and have committed a much-reduced patch that just deals with the ?\LF part.

?\LF now signals an error because it's practically always a mistake; see https://lists.gnu.org/archive/html/emacs-devel/2022-06/msg00140.html for some context.






^ permalink raw reply	[flat|nested] 12+ messages in thread

* bug#55738: character escape bugs in the reader
  2022-06-02 15:12             ` Mattias Engdegård
  2022-06-03 11:07               ` Mattias Engdegård
@ 2022-06-18  6:54               ` Stefan Kangas
  2022-06-18  9:34                 ` Mattias Engdegård
  1 sibling, 1 reply; 12+ messages in thread
From: Stefan Kangas @ 2022-06-18  6:54 UTC (permalink / raw)
  To: Mattias Engdegård; +Cc: Basil L. Contovounesios, Lars Ingebrigtsen, 55738

Mattias Engdegård <mattiase@acm.org> writes:

>   (should (equal (kbd "C-RET") [?\C-\C-m]))
>
> and while these are debatable in style [...]

I don't know what other style you have in mind, but feel free to fix
this to use a better style, if possible.  Thanks.





^ permalink raw reply	[flat|nested] 12+ messages in thread

* bug#55738: character escape bugs in the reader
  2022-06-18  6:54               ` Stefan Kangas
@ 2022-06-18  9:34                 ` Mattias Engdegård
  2023-09-06  1:56                   ` Stefan Kangas
  0 siblings, 1 reply; 12+ messages in thread
From: Mattias Engdegård @ 2022-06-18  9:34 UTC (permalink / raw)
  To: Stefan Kangas; +Cc: Basil L. Contovounesios, Lars Ingebrigtsen, 55738

18 juni 2022 kl. 08.54 skrev Stefan Kangas <stefankangas@gmail.com>:

> I don't know what other style you have in mind, but feel free to fix
> this to use a better style, if possible.

Done, thank you for the reminder. Ideally we should try to do away with the old TTY-centric coupling between Control-m, RET, 13, and the <return> key (etc) but that's for another day.






^ permalink raw reply	[flat|nested] 12+ messages in thread

* bug#55738: character escape bugs in the reader
  2022-06-18  9:34                 ` Mattias Engdegård
@ 2023-09-06  1:56                   ` Stefan Kangas
  0 siblings, 0 replies; 12+ messages in thread
From: Stefan Kangas @ 2023-09-06  1:56 UTC (permalink / raw)
  To: Mattias Engdegård
  Cc: Basil L. Contovounesios, 55738-done, Lars Ingebrigtsen

Mattias Engdegård <mattiase@acm.org> writes:

> 18 juni 2022 kl. 08.54 skrev Stefan Kangas <stefankangas@gmail.com>:
>
>> I don't know what other style you have in mind, but feel free to fix
>> this to use a better style, if possible.
>
> Done, thank you for the reminder. Ideally we should try to do away with the old
> TTY-centric coupling between Control-m, RET, 13, and the <return> key (etc) but
> that's for another day.

I guess there's nothing more to do here, so I'm closing this bug.

Please reopen if I missed something.

Thanks.





^ permalink raw reply	[flat|nested] 12+ messages in thread

end of thread, other threads:[~2023-09-06  1:56 UTC | newest]

Thread overview: 12+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2022-05-31 11:33 bug#55738: character escape bugs in the reader Mattias Engdegård
2022-06-01 10:00 ` Mattias Engdegård
2022-06-01 13:42   ` Lars Ingebrigtsen
2022-06-01 17:56     ` Mattias Engdegård
2022-06-01 20:48       ` Basil L. Contovounesios via Bug reports for GNU Emacs, the Swiss army knife of text editors
2022-06-01 20:53         ` Mattias Engdegård
2022-06-01 21:05           ` Basil L. Contovounesios via Bug reports for GNU Emacs, the Swiss army knife of text editors
2022-06-02 15:12             ` Mattias Engdegård
2022-06-03 11:07               ` Mattias Engdegård
2022-06-18  6:54               ` Stefan Kangas
2022-06-18  9:34                 ` Mattias Engdegård
2023-09-06  1:56                   ` Stefan Kangas

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.