[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
bug#53446: 29.0.50; Issues with awk-mode and electric-pair-mode
From: |
Philip Kaludercic |
Subject: |
bug#53446: 29.0.50; Issues with awk-mode and electric-pair-mode |
Date: |
Fri, 23 Sep 2022 18:57:31 +0000 |
Alan Mackenzie <acm@muc.de> writes:
> Hello, Philip.
>
> Sorry I missed this bug in January.
No problem.
> On Fri, Sep 23, 2022 at 07:24:34 +0000, Philip Kaludercic wrote:
>> Philip Kaludercic <philipk@posteo.net> 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!
Yes, this does the job.
>
> 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)))
>
>