Mercurial > emacs
changeset 84711:f5f984f1f04b
(tex-validate-region): Handle escaped parens.
(tex-next-unmatched-eparen): New function.
(latex-forward-sexp-1): Doc fix. Handle escaped parens.
(latex-forward-sexp): Doc fix.
author | Glenn Morris <rgm@gnu.org> |
---|---|
date | Fri, 21 Sep 2007 03:07:36 +0000 |
parents | ef255e3b79f5 |
children | 90961e86f84e |
files | lisp/textmodes/tex-mode.el |
diffstat | 1 files changed, 27 insertions(+), 2 deletions(-) [+] |
line wrap: on
line diff
--- a/lisp/textmodes/tex-mode.el Fri Sep 21 02:59:33 2007 +0000 +++ b/lisp/textmodes/tex-mode.el Fri Sep 21 03:07:36 2007 +0000 @@ -1262,6 +1262,7 @@ (save-excursion (let ((pos (match-beginning 0))) (goto-char pos) + (skip-chars-backward "\\\\") ; escaped parens (forward-sexp 1) (or (eq (preceding-char) (cdr (syntax-after pos))) (eq (char-after pos) (cdr (syntax-after (1- (point))))) @@ -1400,6 +1401,21 @@ (looking-at "\\\\begin"))) (tex-next-unmatched-end))) +(defun tex-next-unmatched-eparen (otype) + "Leave point after the next unmatched escaped closing parenthesis. +The string OPAREN is an opening parenthesis type: `(', `{', or `['." + (condition-case nil + (let ((ctype (char-to-string (cdr (aref (syntax-table) + (string-to-char otype)))))) + (while (and (tex-search-noncomment + (re-search-forward (format "\\\\[%s%s]" ctype otype))) + (save-excursion + (goto-char (match-beginning 0)) + (looking-at (format "\\\\%s" (regexp-quote otype))))) + (tex-next-unmatched-eparen otype))) + (wrong-type-argument (error "Unknown opening parenthesis type: %s" otype)) + (search-failed (error "Couldn't find closing escaped paren")))) + (defun tex-goto-last-unclosed-latex-block () "Move point to the last unclosed \\begin{...}. Mark is left at original location." @@ -1429,8 +1445,10 @@ (tex-last-unended-begin) (goto-char newpos)))))))) +;; Note this does not handle things like mismatched brackets inside +;; begin/end blocks. (defun latex-forward-sexp-1 () - "Like (forward-sexp 1) but aware of multi-char elements." + "Like (forward-sexp 1) but aware of multi-char elements and escaped parens." (let ((pos (point)) (forward-sexp-function)) (forward-sexp 1) @@ -1447,10 +1465,17 @@ ((looking-at "\\\\begin\\>") (goto-char (match-end 0)) (tex-next-unmatched-end)) + ((looking-back "\\\\[])}]") + (signal 'scan-error + (list "Containing expression ends prematurely" + (- (point) 2) (prog1 (point) + (goto-char pos))))) + ((looking-back "\\\\\\([({[]\\)") + (tex-next-unmatched-eparen (match-string 1))) (t (goto-char newpos)))))) (defun latex-forward-sexp (&optional arg) - "Like `forward-sexp' but aware of multi-char elements." + "Like `forward-sexp' but aware of multi-char elements and escaped parens." (interactive "P") (unless arg (setq arg 1)) (let ((pos (point)))