[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
bug#61436: Emacs Freezing With Java Files
From: |
Robert Weiner |
Subject: |
bug#61436: Emacs Freezing With Java Files |
Date: |
Wed, 17 Apr 2024 18:24:21 -0400 |
Great, will do, thanks, Alan.
-- Bob
> On Apr 17, 2024, at 2:50 PM, Alan Mackenzie <acm@muc.de> wrote:
>
> Hello again, Bob.
>
>> On Wed, Apr 17, 2024 at 13:06:50 +0000, Alan Mackenzie wrote:
>>> On Tue, Apr 16, 2024 at 21:35:59 -0400, Robert Weiner wrote:
>>> Hi Alan:
>>> I just re-read this whole thread and realized you resolved the problem
>>> for the Java defun-prompt-regexp but not the C++
>>> defun-prompt-regexp in Hyperbole's hui-select.el:L404 (probably were
>>> just tired after all of that).
>>> Today, someone else reported that the C++ regexp was hanging their
>>> Emacs. Do you think you could pick this back up and rework the C++
>>> regexp as you did the Java one? It would be a big help; otherwise, I
>>> think we'll just have to disable that functionality in Hyperbole.
>>> Best regards,
>>> Bob
>>> On Sun, Oct 22, 2023 at 1:18â¯PM Mats Lidell
>>> <[1]mats.lidell@lidells.se> wrote:
>
>> Yes, I'll happily finish off that C++ regexp. I made considerable
>> progress with it back in October, getting smething basically working but
>> with some rough edges. One problem is that the regexp was ~1600
>> characters long. I don't know if this might make the program slow -
>> possibly not.
>
>> I've found the .el file I was working in, and located my notes from
>> October. It's going to take longer than a day or two, but hopefully
>> less than a week or two.
>
> It was rather easier than I'd anticipated. There is my first attempt
> below. It should find most C++ defun starts, but not all. In particlar
> it won't recognise one with nested parens or nested template delimiters;
> regexps cannot handle arbitrary nesting,and it didn't seem worth the
> trouble to code in a small bounded degree of nesting, though this surely
> could be done if I'm wrong, here.
>
> The regexp is not small. At the latest count it was 2,223 characters
> long. I hope this won't affect performance too much.
>
> Please try out this regexp, and let me know how well it's working.
> Thanks!
>
>> [ .... ]
>
>
>
> (defconst c++-defun-prompt-regexp
> (let*
> ((space* "[ \t\n\r\f]*")
> (space+ "[ \t\n\r\f]+")
> (ad-hoc-requires-clause
> (concat "\\(?:requires" space* "[][()<>
> \t\n\r\f_$a-zA-Z0-9&|\"'+=.,*:~-]+" space* "\\)?"))
> (id (concat "[_$~a-zA-Z][_$a-zA-Z0-9]*")
> ;; (concat "\\(\\(~" space* "\\)?" "\\([_$a-zA-Z][_$a-zA-Z0-9]*\\)\\)")
> )
> (template-brackets "\\(?:<[^;{}]*>\\)")
> (id-<> (concat id "\\(?:" space* template-brackets "\\)?"))
> (id-:: (concat id-<> "\\(?:" space* "::" space* id-<> "\\)*"))
> (paren-exp "([^{};]*)")
> (template-exp\? (concat "\\(?:template" space* template-brackets space*
> "\\)?"))
> (type-prefix-modifier* (concat "\\(?:\\(?:"
> "\\(?:\\<extern" space+ "\"[^\"]+\"\\)"
> "\\|"
> (regexp-opt '("auto" "const" "explicit" "extern"
> "friend" "inline" "mutable"
> "noexcept" "overload"
> "register" "static" "typedef"
> "virtual" "volatile")
> 'words)
> "\\)"
> space+
> "\\)*"))
> (type-exp (concat
> "\\(?:\\(?:" template-brackets space* "\\)?"
> type-prefix-modifier*
> "\\(?:\\(?:decltype" space* paren-exp space* "\\)"
> "\\|"
> "\\(?:"
> "\\(?:class\\|enum\\|struct\\|typename\\|union\\)"
> "\\(?:" space* "\\.\\.\\.\\)?\\)"
> space+ id space*
> "\\(?::" id-:: space* "\\)?"
> "\\|"
> id-:: space*
> "\\)"
> "\\)\\{1,2\\}"))
> (type-mid-modifier* (concat "\\(?:"
> (regexp-opt
> '("auto" "consteval" "constexpr"
> "constinit" "explicit"
> "extern" "friend" "inline"
> "mutable" "noexcept" "register"
> "static" "template"
> "thread_local" "throw"
> "virtual" "volatile")
> 'words)
> space+ "\\)*"))
> (operator-exp (concat "\\(?:operator\\>" space*
> "\\(?:[][a-z_+*/%^?&|!~<>,:=-]+"
> "\\|()\\|\"\""
> "\\)" space*
> "\\)"))
>
> (name-exp ; matches foo or (* foo), etc.
> (concat "\\(?:(" space* "[*&]+" space* id-:: space* "[][()]*" ")"
> "\\|\\(?:[*&]+" space* "\\)?" id-::
> "\\)" space*))
> (type-suffix-modifier* (concat "\\(?:"
> (regexp-opt
> '("auto" "const" "noexcept"
> "requires" "throw" "volatile")
> 'words)
> space+ "\\)*"))
> (post-paren-modifier* (concat "\\(?:"
> (regexp-opt
> '("const" "final" "override"
> "mutable")
> 'words)
> space* "\\)*")))
>
> (concat template-exp\?
> "\\(?:" ad-hoc-requires-clause "\\)?"
> type-exp
> type-mid-modifier*
> "\\(?:" operator-exp "\\|" name-exp "\\)"
> type-suffix-modifier*
> paren-exp space*
> "\\(?:->" space* type-exp "\\)?"
> post-paren-modifier*
> "{"))
>
>
> --
> Alan Mackenzie (Nuremberg, Germany).