# HG changeset patch # User Glenn Morris # Date 1190344056 0 # Node ID f5f984f1f04b30b8c849febd8abe5f95d4eec1c8 # Parent ef255e3b79f5504578d2443bf3e3fce2048d6aaa (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. diff -r ef255e3b79f5 -r f5f984f1f04b lisp/textmodes/tex-mode.el --- 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)))