Subject: Re: bug#53446: 29.0.50; Issues with awk-mode and electric-pair-mode

From: Alan Mackenzie <[email-masked]>
Date: Fri, 23 Sep 2022 18:37:57 +0000

Hello, Philip.

Sorry I missed this bug in January.

On Fri, Sep 23, 2022 at 07:24:34 +0000, Philip Kaludercic wrote:
> Philip Kaludercic <[email-masked]> writes:

> > Open an AWK file, and ensure that electric-pair-mode is enabled.  It
> > seems that some character pairs like braces or parentheses are
> > automatically paired, while others like apostrophes or double quotes are
> > not.

The reason apostrophes don't work with electric-pair-mode is that they
are not quote characters in AWK.  :-)

> I have managed to narrow this bug to the function 
> `c-electric-pair-inhibit-predicate' that is used as
> `electric-pair-inhibit-predicate' by cc-mode.  Specifically this check

>     (not (equal (c-get-char-property last-quote 'c-fl-syn-tab) '(15)))

> fails, because the macro

>     (c-get-char-property last-quote 'c-fl-syn-tab)

> that expands to

>     (get-text-property last-quote 'c-fl-syn-tab)

> where `last-quote' is the position of the last quotation mark in a
> "logical line", evaluates to nil, not (15).  I do not understand why
> this happens, or what the text property `c-fl-syn-tab' is supposed to
> indicate.

It happens because AWK Mode doesn't use the unterminated string
detection code the other CC Mode modes use.  (It doesn't need to, being
simpler.)  So, rather than temporarily storing its "working"
syntax-table text properties, AWK just lets them be.  So, we can just
test the syntax-table text property for being '(15) (string fence) in
AWK Mode.

> I have CC'ed Alan to see if he can help.

Would you please try out the following patch, and let me know how it
goes.  Thanks!

diff --git a/lisp/progmodes/cc-mode.el b/lisp/progmodes/cc-mode.el
index 9309a546db..679690b33c 100644
--- a/lisp/progmodes/cc-mode.el
+++ b/lisp/progmodes/cc-mode.el
@@ -2714,7 +2714,10 @@ c-electric-pair-inhibit-predicate
 			  (save-excursion
 			    (goto-char (c-point 'eoll))
 			    (search-backward "\"")))))
-	(not (equal (c-get-char-property last-quote 'c-fl-syn-tab) '(15))))
+	(not (equal
+	      (or (c-get-char-property last-quote 'c-fl-syn-tab)
+		  (c-get-char-property last-quote 'syntax-table)) ; for AWK
+	      '(15))))
     (funcall (default-value 'electric-pair-inhibit-predicate) char)))
 
 

-- 
Alan Mackenzie (Nuremberg, Germany).