* Stefan Monnier (2006-04-17) writes:

>>>>>> "Ralf" == Ralf Angeli <[EMAIL PROTECTED]> writes:
>
>> (defun font-latex-match-script (limit)
>>   "Match subscript and superscript patterns up to LIMIT."
>>   (when (and font-latex-fontify-script
>>           (re-search-forward
>>            "[_^] *\\([^\n\\{}]\\|\\\\\\([EMAIL PROTECTED]|[^ \t\n]\\)\\|{\\)"
>>            limit t))
>>     (when (string= (match-string 1) "{")
>
> Better do (eq (char-after (match-beginning 1)) ?\{) so as to avoid consing
> a string.  Alternatively, wrpa the "{" in the regexp inside "\\(...\\)" and
> then just check if (match-end 2) is non-nil.

Okay.

> You could even make it more efficient by handling the "no-nesting" case
> directly in the regexp (as is the case now) and only revert to the elisp
> code for the more complex case.

Matching multiple characters of a complemented character alternative
is really more efficient than a call to stuff like `scan-lists'?  Okay
there is some additional code involved as well, but anyway.

The patch below uses a regexp for the non-nested case.  If you change
your mind, just remove that part.

>>       (let ((beg1 (match-beginning 1))
>>          (end (TeX-find-closing-brace)))
>>      (if end
>>          (store-match-data (list (match-beginning 0) end beg1 end))
>>        (store-match-data (list beg1 beg1 beg1 beg1)))))
>>     t))
>
> Why not merge the two branches of the if:
>
>       (store-match-data (if end
>                               (list (match-beginning 0) end beg1 end))
>                             (store-match-data (list beg1 beg1 beg1 beg1)))

Oh well. (c:

>> I guess I could come up with a similar fix for tex-mode.el if somebody
>> is interested.
>
> Please do,

2006-04-17  Ralf Angeli  <[EMAIL PROTECTED]>

        * textmodes/tex-mode.el (tex-font-lock-match-suscript): New
        function.
        (tex-font-lock-keywords-3): Use it.

--- tex-mode.el	19 Feb 2006 12:12:41 +0100	1.180
+++ tex-mode.el	17 Apr 2006 11:18:32 +0200	
@@ -594,20 +594,24 @@
 	'(face subscript display (raise -0.3))
       '(face superscript display (raise +0.3)))))
 
+(defun tex-font-lock-match-suscript (limit)
+  "Match subscript and superscript patterns up to LIMIT."
+  (when (re-search-forward "[_^] *\\([^\n\\{}]\\|\
+\\\\\\([EMAIL PROTECTED]|[^ \t\n]\\)\\|{[^{]*}\\|\\({\\)\\)" limit t)
+    (when (match-end 3)
+      (let ((beg (match-beginning 3))
+	    (end (save-restriction
+		   (narrow-to-region (point-min) limit)
+		   (condition-case nil (scan-lists (point) 1 1) (error nil)))))
+	(store-match-data (if end
+			      (list (match-beginning 0) end beg end))
+			  (list beg beg beg beg))))
+    t))
+
 (defconst tex-font-lock-keywords-3
   (append tex-font-lock-keywords-2
-   (eval-when-compile
-     (let ((general "\\([EMAIL PROTECTED]|[^ \t\n]\\)")
-	   (slash "\\\\")
-	   ;; This is not the same regexp as before: it has a `+' removed.
-	   ;; The + makes the matching faster in the above cases (where we can
-	   ;; exit as soon as the match fails) but would make this matching
-	   ;; degenerate to nasty complexity (because we try to match the
-	   ;; closing brace, which forces trying all matching combinations).
-	   (arg "{\\(?:[^{}\\]\\|\\\\.\\|{[^}]*}\\)*"))
-       `((,(concat "[_^] *\\([^\n\\{}#]\\|" slash general "\\|#[0-9]\\|" arg "}\\)")
-	  (1 (tex-font-lock-suscript (match-beginning 0))
-	     append))))))
+	  '((tex-font-lock-match-suscript
+	     (1 (tex-font-lock-suscript (match-beginning 0)) append))))
   "Experimental expressions to highlight in TeX modes.")
 
 (defvar tex-font-lock-keywords tex-font-lock-keywords-1
-- 
Ralf
_______________________________________________
emacs-pretest-bug mailing list
[email protected]
http://lists.gnu.org/mailman/listinfo/emacs-pretest-bug

Reply via email to