>>>> "Stephen" == Stephen J Turnbull
<stephen(a)xemacs.org> writes:
Aidan Kehoe writes:
> What you need to do is rewrite the code to use
> #'posix-search-forward, which guarantees that it will return the
> longest match (that is, it will always try to match "\\infty" if
> possible, and only then look for "\in".)
I don't think so: this code is almost surely trying each car in
order. Something like:
(progn
(search-forward (regexp-opt (mapcar #'car replacement-alist)))
(goto-char (match-begin 0))
(when (looking-at target-string)
(replace-match replacement-string)))
As I said in my mail to Adian: that is the main part of the code
(seems less sophisticated than yours, though)
(defun utf8symbol-translate-conventions (trans-tab)
"Use the translation table argument to translate the current buffer."
(save-excursion
(let ((beg (point-min-marker)) ; see the `(elisp)Narrowing' Info node
(end (point-max-marker)))
(unwind-protect
(progn
(widen)
(goto-char (point-min))
(let ((buffer-read-only nil) ; (inhibit-read-only t)?
(case-fold-search nil))
(while trans-tab
(save-excursion
(let ((trans-this (car trans-tab)))
(while (search-forward (car trans-this) nil t)
;; (regexp-opt trans-this) ;NEW
(replace-match (car (cdr trans-this)) t t)))
(setq trans-tab (cdr trans-tab))))))
(narrow-to-region beg end)))))
together with the call
(defun fix-tex2utf8symbol ()
"Replace SGML entity references with ISO 8859-1 (aka Latin-1) characters."
(interactive)
; (if (member major-mode utf8symbol-modes-list)
(let ((buffer-modified-p (buffer-modified-p)))
(unwind-protect
(utf8symbol-translate-conventions tex2utf8symbol-trans-tab)
(set-buffer-modified-p buffer-modified-p))))
Note to Uwe: one problem you're facing here is that SGML
entities
have a fairly reliable terminator character, the semicolon. TeX
does not, so you might try replacing `target-string' in the logic
above with `(concat target-string "\\>")'.
I even thought of adding the each texstring \; and then kill the char
backwards, but that looks highly inefficient.
> You might also want to look into the #'regexp-opt function,
which,
> given a list of strings,
regex-opt won't work here, it doesn't know anything about
internal grouping, so there's no way to trigger the replacement
of "\in" rather than "\infty". In fact, I doubt that Emacs
regexp groups can simultaneously express all the relevant string
matches for
#r"\in\(t\|fty\)".
Uwe
_______________________________________________
XEmacs-Beta mailing list
XEmacs-Beta(a)xemacs.org
http://calypso.tux.org/cgi-bin/mailman/listinfo/xemacs-beta